☆Linux星座占いを作ろう☆

夏のわくわくクリエイト講座 第1弾(2弾は出ない)

はじめに

4度目まして!三瀬と申します。

 

唐突ですが、小学校時代の私はかなりのテレビっ子だったように思います。

毎朝5時には目を覚まし、学校に行くまでの時間ニュース番組を眺めながら過ごしていました。(確かめざましテレビを見てた)

中でも星座占いのコーナーが特に好きで、11位~2位を出した後に1位と12位を発表するあの構成に幼き心をくすぐられていました。提示されたラッキーアイテムも家の中に無いか探し散らかしていた記憶があります。

 

今では家にテレビも無く、そもそも朝のニュース番組をやっている時間に起きない生活を送っていますが、気持ちは5歳児なので昔のように毎朝占いを見て一喜一憂したい!と考えました。

 

私は現在、出勤前にシャニマスをやるためにノートPC(Linux)を毎朝開いています。

ということで今回、Linuxを起動した時に自動で星座占いをしてくれる機能を作ってみました。

 

完成品としてはこんな感じです。

妙に現実的な占い

それでは早速作っていきましょう。

OSは『Linux Mint 19.1 Cinnamon 4.0.10』を使用しています。

 

1. OpenAIを使ってPythonで星座占いを自動生成する

星座占いの内容は手作業で何パターンか用意するのも良かったのですが、普通にめんどくさいのとボキャブラリーが有限なのはなんか嫌ですよね。

ということで、今回は最近話題のOpenAIさんに星座占いをしてもらうことにしました。

こんな感じ。てか普通にすご….
便利な最新技術はどんどん使っていきましょう。

(OpenAIについては、こちら↓のTechBlogの記事がとても参考になりました。
AI技術で進化するコーディングツール)

また、PythonでOpenAIのAPIを叩くことができるので、こちらを使っていきます。

 

まずは必要なモジュールをインストールしましょう。

pip3 install openai

あとはコードを書くだけです。全文バーン

import os
import openai

openai.api_key = "(各自のAPIキー)"

response1 = openai.Completion.create(
  #言語処理のモデル。デフォルトだとこれ
  model="text-davinci-002",
  #質問の本文
  prompt="本日の乙女座の運勢を教えてください。",
  #ランダムさ加減。デフォルト
  temperature=0.7,
  #答えの文字数上限。デフォルト
  max_tokens=256,
  #nucleusサンプリング(詳しくはググッてね)。デフォルト
  top_p=1,
  #同じテキストが出力される可能性を減らすためのパラメータ。デフォルト
  frequency_penalty=0,
  #同じ単語が出力される可能性を減らすためのパラメータ。デフォルト
  presence_penalty=0
)

response2 = openai.Completion.create(
  model="text-davinci-002",
  prompt="本日のラッキーアイテムを教えてください。",
  temperature=0.7,
  max_tokens=256,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0
)

#responseの中のテキストを出力
print(response1.choices[0].text + response2.choices[0].text)

4行目のapi_keyの中身は各自のAPIを使いましょう。
OpenAPIにサインインした状態でhttps://beta.openai.com/account/api-keysにアクセスすれば見ることができます。

api_keyの中身を入れた状態で、openai.Completion.createを行い必要なパラメータを引数に入れていきます(各パラメータの内容は雑にコメントで書いてます)。

返ってきたレスポンスはそのまま出力すると以下のようになっています。

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "text": "\n\n\u4eca\u65e5\u306f\u3001\u7a4d\u6975\u7684\u306b\u81ea\u5206\u3092\u898b\u305b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002\u8272\u3005\u306a\u4eba\u3068\u51fa\u4f1a\u3044\u3001\u8272\u3005\u306a\u4e8b\u3092\u3057\u3066\u307f\u308b\u3053\u3068\u3067\u3001\u6210\u9577\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002\u826f\u3044\u51fa\u4f1a\u3044\u3082\u3042\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002"
    }
  ],
  "created": (何か数字が書いてある),
  "id": "(何か書いてある)",
  "model": "text-davinci-002",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 104,
    "prompt_tokens": 26,
    "total_tokens": 130
  }
} 

choices(オブジェクト型の配列だけど今回は要素数1つだけのようですね)の中のtextが実際の質問の答えになっているので、response1.choices[0].text といった感じで抜き出して出力してあげます。
(レスポンスをそのまま出力したらtextがUnicodeになってるけど、text単体で出力したらなぜかデコードされて出てきます。謎だ…)

 

ということで結果を見てみましょう。

おけおけおっけー。なぜか最初に改行コードが2つ入ってるのが気になるけどできています。いいね

 

ただ、占いの結果を平文ベターーーッで出力するのも5歳児的には味気ない感じがします。

なので次のステップで、動物に占い結果を喋らせてあげましょう

 

2. 占いの結果をアスキーアートに流し込む

Unixには「cowsay」という謎のコマンドがあり、様々なアスキーアートにセリフを喋らせることができます。謎だ…

百聞はなんとやらなので早速使っていきましょう。

 

まずはcowsayをインストールします。

sudo apt-get -y install cowsay

cowsayは文字通りcowがsay!!なのでデフォルトだと牛がセリフを放つのですが、-fオプションにより様々な動物を使うことができます。ハローキティとかもいるそうな…

例えばヌーさんに何か喋らせたい場合は以下のようにコマンドを入力します。

cowsay -f gnu (セリフ)

実際に使ってみるとこんな感じ。

いいね

 

ということで実際に星座占いの結果をセリフに流し込んでいきましょう。今回はかわいいので羊さんを使っていきます。乙女座だけど…

python3 FortuneTelling.py | cowsay -f sheep

こうすると、左のコマンドの出力を右のコマンドの入力に使うことができます。

これで羊さんが占いの結果を喋ってくれるようになります。

 

3. PCの起動時に占いコマンドを自動で実行するように設定する

ここまで来たらあとは↑のコマンドをLinuxの起動と同時に実行するようにしてあげれば完成です。

ということで以下のコマンドで設定ファイルを作っていきましょう。

sudo vim ~/.config/autostart/gnome-terminal.desktop

中身は以下の通りに記述します。

[Desktop Entry]
 Version=1.0
 Name=StartStar
 Comment=PC起動時に自動で占ってくれる羊さん
 Exec=gnome-terminal -e "bash -c 'python3 FortuneTelling.py | cowsay -f sheep;$SHELL'"
 Icon=utilities-terminal
 Terminal=false
 Type=Application
 Categories=Application;

5行目で”bash -c (コマンド);”と書くことで、Linuxの起動と同時にコマンドが実行されます。またその後に、$SHELLと付け加えることでコマンド実行後もターミナルを開き続けてくれます。

 

設定ファイルが書けたらついに完成です!

PCを再起動してみましょう。

起動と同時にターミナルが開き、占いの結果が表示されました。

これで毎朝出勤前に星座占いを見て一喜一憂するわくわくライフが送れるわけですね。

 

ただ作っておいてあれなのですが、星座要素が薄い気がする。

せっかくなのでニュース番組の星座占いコーナーみたく11位~2位→12位→1位の順に全星座分の結果を発表するように改造してみたいですね。。。OpenAIへの文言どうするべきかが迷いだけれど、作れたら一喜一憂度が上がって楽しくなりそうです。

 

まとめ

今回は星座占いを行いましたが、OpenAIへの質問の文言を変えるだけで動物に格言ぽいっことを喋らせたりとか色々できますし、Linuxに限定しましたが他のOSでも全然同じことができると思います。

また、cowsayの他にも色々な謎コマンドがあるのでLinuxおもしろコマンドシリーズもいつかやってみたいですね。

 

参考文献