Ollamaの日本語表示がちゃんとなるようになったことと、githubにわかりやすい整理がされたので、チャレンジです。
最初は、下記でollamaモジュールを使えるようにします。(自分の場合llamaenvという名前のconda環境でやってます)
pip install ollama
それから、exampleにある async-chat-stream の main.pyの中身を、GPT-4にいろいろ教えてもらいます。
最初に読み込むモジュールの解説 (import ollamaは省いた)
import shutil
import asyncio
import argparse
最初の部分の解説
async def speak(speaker, content):
if speaker:
p = await asyncio.create_subprocess_exec(speaker, content)
await p.communicate()
mainの最初の部分の解説
async def main():
parser = argparse.ArgumentParser()
parser.add_argument('--speak', default=False, action='store_true')
args = parser.parse_args()
speaker = None
if not args.speak:
...
elif say := shutil.which('say'):
speaker = say
elif (espeak := shutil.which('espeak')) or (espeak := shutil.which('espeak-ng')):
speaker = espeak
Macだけでなく、WindowsやLinuxでも音声発話ができるようです。macでは say コマンドというのがあるのを知りました。
あとスクリプトを走らせる時に --speach をつけるか否かで音声発話の設定ができるということですね。
mainのwhile部分の解説
while True:
if content_in := input('>>> '):
messages.append({'role': 'user', 'content': content_in})
content_out = ''
message = {'role': 'assistant', 'content': ''}
async for response in await client.chat(model='mistral', messages=messages, stream=True):
if response['done']:
messages.append(message)
content = response['message']['content']
print(content, end='', flush=True)
content_out += content
if content in ['.', '!', '?', '\n']:
await speak(speaker, content_out)
content_out = ''
message['content'] += content
if content_out:
await speak(speaker, content_out)
print()
スクリプト最後の部分
try:
asyncio.run(main())
except (KeyboardInterrupt, EOFError):
...
以上です、全体のコードはこちらです。
mistralはいれていないので、openchatにモデルを置き換えて、適当にファイル名をつけて、python hogehoge.py --speak で動かしたら、入力を促す>>> がでたので、文字を入力したらエラーとなりました。
ollamaを常駐させた状態で動かしたら、ちゃんと動いてしゃべりました。macのデフォの音声なので、英語の応答は変でしたが、日本語の応答は普通の日本語で音声がでてきました。
(アクセスビリティ → 読み上げコンテンツ → 読み上げ言語 で英語を選んだら普通の英語でしゃべってくれます。)
終了方法:Ctrl + C では終わりませんでした。Ctrl + Z で終了しました。多分、ollama が走っているからかと思います。
たった59行のスクリプトで喋るようになったのでPythonすごいなと思いました!
#AI #AIとやってみた #やってみた #Python入門 #Ollama #大規模言語モデル