【ずんだもんが喋る】アレクサとChatGPTとVOICEVOXを連携してみた【カスタムスキル】

※当サイトは、アフィリエイト広告を利用しています。

チーズくん

前回アレクサとChatGPTを繋げてたけど、声が機械的すぎてイマイチ会話に感情がこもらないんだよね。

くれとむ

そうだね〜。アレクサの声はどうしても無機質に感じてしまうよね。
もっと感情のこもった声でChatGPTからの回答をVOICEVOXで音声合成して応答するようにカスタマイズしてみようか!

チーズくん

VOICEVOXって何なの?

くれとむ

入力したテキストを様々なキャラクターの声に変換して出力してくれるテキスト読み上げソフトウェアのことだよ。
有名なところで言うと、「ゆっくり解説」の霊夢と魔理沙みたいなものだね。
これを使うことで、ChatGPTの返事を好きなキャラクターの声で再生することができるようになるよ。

チーズくん

色々なキャラクターがいるんだね!
難しいことはよく分からないけど、ChatGPTの応答をこんなキャラクターたちの声で聞くことができれば、もっとアレクサと感情のこもった会話ができるるようになりそうだね。

くれとむ

今回は、VOICEVOXで使えるキャラクター「ずんだもん」の声をアレクサから返ってくるようにしてみたよ。

ちなみに、東北地方応援キャラクター「東北ずん子」の関連キャラクターだそうです。

ずんだもん

感情のこもった声でChatGPTからの応答を返してあげるのだ!

くれとむ

実際に作ったモノの動画がこれだよ。

VOICEVOX:ずんだもん
チーズくん

おお!!ちゃんとアレクサじゃなくて、キャラクターの可愛い声で返事してくれるんだね!


今回は上記のように、Alexaのカスタムスキルを作成し、アレクサとChatGPTとVOICEVOXを連携してみました。
AWSで自身の環境を構築してみたのは初めてなので、探り探りでトライ&エラーでした。

本記事では、アレクサのカスタムスキルをどのように実装したのかや、AWSの構成図などをご紹介します。
興味のある方はぜひご覧になってください。

構成と実装の流れ

今回、アレクサ、ChatGPT、VOICEVOXを組み合わせるにあたってのAWS構成は以下のとおりです。

構成と手順
  1. アレクサスキルでLambda処理を呼び出す
  2. LambdaとChatGPT間でやりとり
  3. EC2でVOICEVOXエンジン起動、音声合成
  4. 合成音声データをEC2からLambdaに渡す
  5. 音声データをmp3としてS3に格納
  6. S3から呼び出したmp3を、アレクサで再生

アレクサスキルをLambdaで作成


アレクサのカスタムスキルとは、自身が実装した処理に従ってアレクサが応答を返してくれるというものです。
例えば有名なところで言うと、cookpadもカスタムスキルとして提供されていました。
cookpadのカスタムスキルの場合は、今晩のおすすめのメニューや作り方をアレクサが教えてくれると言うものです。

自身でカスタムスキルを作成する場合、Alexa Developer Consoleから、カスタムスキルを作成することができます。

AWS Lambdaでアレクサスキルを実装(Python)する方法は、以下の記事にもまとめていますので、興味のある方はぜひご覧ください。

LambdaとChatGPT間でやりとり

Alexaに呼びかけたユーザの声を、ChatGPTに渡して、応答を受け取る部分を実装します。
ChatGPTはAPIが公開されており、数行のコードでChatGPTを呼び出すことができます。

今回は、ずんだもんの口癖である「〜なのだ。」という応答で返して欲しかったので、ChatGPTの役割を設定する箇所に記載しておきました。
またAlexaのカスタムスキル自体は、読み込みに8秒以上の時間がかかるとタイムアウトしてしまうので、短めの応答にしてくれるように指定しておきます。

ChatGPTの役割設定
  • 語尾に「〜なのだ」を付ける
  • 返答はできるだけ短くする
  • 友達口調で会話する
conversation_history.append(f"ユーザー: {question}")

prompt = "\n"
for message in conversation_history:
    prompt += f"{message}\n"

prompt += "AI: "        
messages = [{"role" : "system", "content":"あなたは「ずんだもん」という名前の女の子です。語尾に「なのだ。」を付けて。友達口調で会話して。返答はできるだけ短くして。"},
            {"role" : "user", "content": prompt}
           ]

res=openai.ChatCompletion.create(
     model="gpt-3.5-turbo",
     messages=messages,
     max_tokens = 200
     )

text = res['choices'][0]['message']['content']

ChatGPTとアレクサを繋げる具体的な方法は以下の記事で紹介していますので、是非ご覧ください。


また今回は、EC2と連携するために、LambdaをVPC内のプライベートサブネットに配置する構成としています。
従って、ChatGPTのAPIを使ってインターネットと通信するためには、パブリックサブネットにNATGatewayを設定して、プライベートサブネット内のLambdaがインターネットと応答できるようにする設定する必要があります。

VPC内のLambdaとインターネット接続
  • プライベートサブネットのLambda⇔パブリックサブネットのNAT Gateway⇔Internet Gateway⇔ChatGPTという経路を設定する。

EC2でVOICEVOXエンジンの起動、音声合成

VOICEVOXはサーバ上で音声合成用のエンジンを立ち上げて使用します。
最新のVOICEVOXエンジンは、こちらから入手することができます。
VOICEVOX ENGINE 0.14.4

※エンジンの立ち上げに必要な「コア」は、上記のVOICEVOXエンジンのパッケージから一緒にインストールされます。



今回はVOICEVOXエンジン立ち上げ用のサーバとしてEC2のUbuntuを選択しました。
Canonical, Ubuntu, 22.04 LTS, amd64

くれとむ

最初にAmazon Linux2も試したんですけど、互換性の問題からVOICEVOXを起動させることができないということがあったので、このOSにしました。


合成音声データをEC2からLambdaに渡す

他にも構成はたくさんあり得ると思いますが、今回は同じVPC内のプライベートサブネット上のLambdaとパブリックサブネット上のEC2を接続するような構成としました。
プライベートIPでVOICEVOXエンジンを起動させ、そこで音声合成したものを、Lambdaに渡しています。

EC2とLambdaが接続するためには、LambdaとEC2が同じVPC内にある必要があります。
そのために、Lambdaコンソールの画面上でVPC設定を実施します。

EC2、Lambdaが連携するために
  • LambdaとEC2が同じVPCにあること
    (LambdaコンソールからVPC設定を行う)
  • パブリックサブネットとプライベートサブネットがルートテーブルにより繋がっているか確認する。(デフォルトでは接続可能な状態となっているため設定不要)

音声合成したデータをmp3としてS3に格納

次に、Lambdaが受け取ったVOICEVOX合成後の音声データをmp3に変換してS3に格納します。

なぜかというと、アレクサスキルの実装に使うLambdaは音声再生のためのソフトを内部に持っておらず、音声を再生するためには、mp3などの音声ファイルを再生する必要があるからです。
(実はもっと良い方法はある気がしますが、今回はこれしか方法が見つからなかったです。。)

#S3に音声データをmp3として格納
s3 = boto3.client('s3', region_name='us-east-1')
        
bucket_name = 'bucket-voicevox'
object_name = 'voice_output.mp3'
s3.upload_fileobj(audio, bucket_name, object_name)
LambdaからS3への格納
  • VPCエンドポイントを作成して、S3とLambdaの経路を設定
  • VPCのDNS名前解決を「有効」に設定
  • パブリックサブネットとプライベートサブネットがルートテーブルにより繋がっているか確認する。(デフォルトでは接続可能な状態となっているため設定不要)

S3から呼び出したmp3を、アレクサで再生

S3上に格納したmp3をリンク先を指定して呼び出すことで、アレクサ上で音声ファイルを再生することができます。

#speakでSSMLを使用して再生
speech_text = '<audio src=\"' + html.escape(audio_url) + '\"/>'

アレクサスキルのテスト

上記の構成を実際にテストした結果がこちらです。
こちらの呼びかけに対して、ずんだもんの声で応答を返してくれていることがわかります。
またChatGPTの役割に設定した、語尾に「なのだ。」をつけてというのもしっかりと反映されていることが確認できます。

VOICEVOX:ずんだもん

そしてアレクサ上でも呼びかけに対して、しっかりと動作していることが確認できます。
またVOICEVOXの関数を呼び出す箇所で、それぞれのキャラクターの声に対応する番号を引数にすることで、声を変えることもできます。

#櫻歌ミコの声でVOICEVOX合成
vv = Voicevox()
audio_url = vv.speak(text=text,speaker=45)
くれとむ

これでアレクサと人間味のある会話をすることができるようになったね。

チーズくん

ほんとだね!もうくれとむはいらないや!

くれとむ

。。。

まとめ

ChatGPTとVoiceVoxを連携させてAlexaスキルを作成してみましたが、人工知能と音声合成技術を組み合わせることで、より人間らしい、自然な対話が可能になります。
今回作成したものでは、応答に時間がかかったり、長い文章だとタイムアウトが発生するなどの課題もあるので、改善の余地はまだまだあります。
しかし、ChatGPTによる高性能な会話システムと、VOICEVOXによる音声合成処理を組み合わせることでAlexaとの対話がより魅力的で楽しいものになる可能性を感じました。

ChatGPTのAPIを使った役割設定では、ユーザーの特定の癖や口調を設定させて、それに合わせた応答を生成するようにすることも簡単にできます。
また、VoiceVoxにはさまざまなキャラクターの音声が含まれており、それらを使って様々なキャラクターに声を当てることも可能です。
それぞれの好みに合わせた設定が可能なので、多くの人が楽しめるスキルなのではないかと思っています。

今後もChatGPT含め、思いついたものを作っていければなと思います。
それでは最後まで読んでいただきありがとうございました!!










コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


ABOUT US
くれとむ
IT企業3年目のエンジニアです。 日常の便利なものやITに関する記事を投稿しています。 AWS認定12冠(CLF, SAA, DVA, SOA, SAP, DOP, ANS, SCS, MLS, DAS, DBS, PAS)、基本情報技術者、TOEIC L&R 870点 このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。