Pythonでつくよみちゃん

基本編
Coeiroinkは、Python経由で制御が可能だ。こちらの記事を参考にやってみる。ふむふむ、仮想環境をAnacondaで作成したら必要なライブラリをインストールしていくと。なるほど、ローカルホストに音声合成サーバーが立ち上がっているので、そこに向かってコマンドを投げると喋ってくれるというわけですね?・・・なるほど~、CPU版だと変化にそこそこ時間がかかりますね。リアルタイムで会話するためにはやはりGPU版が必要ですね。まあしかし、チャットjptにクエリを投げるPythonプログラムとこのプログラムが合体させると、音声による会話に一歩近づくわけで。

import json

import requests
from pydub import AudioSegment, playback

# パラメータ
text = "こんにちは、つくよみちゃんです。よろしくお願いします。"  # セリフ
text2="先日さ、友達とカラオケに行ったんだけど、その時の話がすごく面白かったんだよね。みんなで歌って楽しんでいたんだけど、途中で友達の一人が「誰か知らないけど、めちゃくちゃ上手い人が歌ってる!」って言い出したんだ。";
speaker_id = 0  # スピーカーID (0:つくよみちゃん)

# 音声合成のクエリの作成
response = requests.post(
    "http://localhost:50031/audio_query",
    params={
        'text': text2,
        'speaker': speaker_id,
        'core_version': '0.0.0'
    })
query = response.json()

# 音声合成のwavの生成
response = requests.post(
    'http://localhost:50031/synthesis',
    params={
        'speaker': speaker_id,
        'core_version': "0.0.0",
        'enable_interrogative_upspeak': 'true'
    },
    data=json.dumps(query))

# wavの音声を再生
playback.play(AudioSegment(response.content,
    sample_width=2, frame_rate=44100, channels=1))

話者を変える編
さて、Coeiroinkは様々な音声を登録可能だが、どのようにして声を変えるのだろうか?各話者の音声ファイルはspeaker_infoフォルダに、話者ごとにフォルダで区別されて保存されている。その中に、「metas.json」ファイルがあり、Pythonプログラム内で使用できるspeaker_idが記録されている。このIDをPythonスクリプトに記述することで、声を変えることができるというわけだね。

PythonでChatGPT編
ここを参考に進めるが・・・動かない。なんでぇ?ここのほうがわかりやすいか。やはり動かない・・・。結局APIキーを新しく発行したところ、なぜか正しく動作するようになった。前のキーが無効になってる!?なんてことはないと思うんだけど。オープンAIのAPI使用量を、研究費から支払う方法がないかなぁ?

import openai
openai.organization = ""
openai.api_key      = ""

# =============================================================
# チャットボット関数
# =============================================================

def Ask_ChatGPT(message):
    
    # 応答設定
    completion = openai.ChatCompletion.create(
                 model    = "gpt-3.5-turbo",     # モデルを選択
                 messages = [{
                            "role":"user",
                            "content":message,   # メッセージ 
                            }],
    
                 max_tokens  = 1024,             # 生成する文章の最大単語数
                 n           = 1,                # いくつの返答を生成するか
                 stop        = None,             # 指定した単語が出現した場合、文章生成を打ち切る
                 temperature = 0.5,              # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
    )
    
    # 応答
    response = completion.choices[0].message.content
    
    # 応答内容出力
    return response

# =============================================================
# チャットボット実行
# =============================================================

# 質問内容
message = "日本人の若者の特徴を教えてください"

# ChatGPT起動
res = Ask_ChatGPT(message)


# 出力
print(res)

このプログラムで、ChatGPTと延々と会話ができる。

import openai
openai.organization = "org-ほげ"
openai.api_key      = "sk-ほげ"


def main():
    amount_tokens = 0
    chat = []

    setting = input("ChatGPTに設定を加えますか? y/n\n")
    if setting == "y" or setting == "Y":
        content = input("内容を入力してください。\n")
        chat.append({"role": "system", "content": content})

    print("チャットをはじめます。q または quit で終了します。")
    print("-"*50)
    while True:
        user = input("<あなた>\n")
        if user == "q" or user == "quit":
            print(f"トークン数は{amount_tokens}でした。")
            break
        else:
            chat.append({"role": "user", "content": user})

        print("<ChatGPT>")
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",messages=chat
        )
        msg = response["choices"][0]["message"]["content"].lstrip()
        amount_tokens += response["usage"]["total_tokens"]
        print(msg)
        chat.append({"role": "assistant", "content": msg})


if __name__ == "__main__":
    main()

とうとう会話が成立する
それでまあ、音声AIを制御するスクリプトとオープンAIのAPIを呼び出すスクリプトを合体させると、音声で会話ができるということになる。あまり長々喋られると、変換に時間もかかるので、何文字以内で喋ってほしいなど、制限を加えた方がいいかもしれないね。入力側の音声認識を切っておかないと、AI側の発話が認識されてしまうという・・・この辺も工夫が必要だね。

まあ予想していたことではあるんですが、現状で利用可能なGPT 3.5は、ふじみ野市にツインリンクもてぎがあるなど、でたらめなことを平気で行ってくるので、使いどころが難しいですね。「○○について調べて、レポートにまとめておいて」などといった使い方ができるようになれば、少しはエージェントっぽくなるんだけど。GPT 4のウェイティングリストに入らないと・・・

コメントを残す