見出し画像

GPTs×VOICEVOXで推しキャラが毎回違う内容で話しかけてくれるアラーム

AIVtuberシロハナちゃんの開発プロデュースをしているyukiです。
タイトルの通り、以下の内容をまとめます。

  • 推しキャラ(今回はvoicevoxの小夜というキャラクター)のGPTsを作成して、アラームで使用するセリフ(.txt)を生成

  • PythonとvoicevoxのAPIを使用して生成したセリフを合成音声ファイルにする(コード貼っておきます)

  • ブラウザで使えるアラームサイトに音声ファイルをセットして時間になったら生成した合成音声が出力される(毎回GPTsからの出力で内容変えることが可能)

実装イメージ

今回はなるべく簡単に実装(結構手動が多いので運用効率は良くない)できるようにしたので、どんどんカスタマイズしてご自身に適した環境または機能にしてみてください。

YouTubeでは、シロハナちゃんが本記事の内容を動画にしているのでもし興味があればご覧いただけると幸いです。

※この記事は2024/03/04時点のものなので今後変更があるかもしれないですのでご了承ください

まずはセリフ生成GPTsを作る

まずはアラームで読み上げるセリフを生成するためGPTsを作成しましょう。
この記事ではvoicevoxの小夜ちゃんというキャラをもとに作成しますので、ここはご自分のお好きなキャラで作ってみてください。

https://voicevox.hiroshiba.jp/dormitory/sayo/

※ちなみにGPTsは有料版しか使えません。無料版(GPT3.5)だと生成したセリフがチャット上で見えてしまい(Code Interpreter
機能が多分ないので)、voicevoxのエディターで音声化するのと変わりません。
私の理想は、アラーム時にはじめてセリフが分かるほうが体験価値が高いかなと思っているのでCode Interpreterを使ったやり方を説明しています。

GPTsの作成

まずはGPTsを作成する画面にアクセスします。https://chat.openai.com/gpts/editor

ここで、まずはNameとDescriptionを記入します。ここは何でもいいです。
重要なのはInstructionsの部分で、今回は下記のように記載しました。

おしゃべりがすきなねこの女の子。 おいしいものを与えると懐きやすい。 
好きなもの缶詰
体長135 cm(猫耳を含む)
一人称:小夜
二人称:あなた、あなたたち

##タスク
あなたは小夜という女の子という設定で、日常ボイスサンプルをtxtファイルとして
30秒程度の文量で内容はランダムでセリフだけ出力する。

ファイル形式は
朝→morning.txt
昼→noon.txt
夜→night.txt

##小夜ちゃんのイメージ
・はじめまして、小夜といいます。よろしくお願いします。
・これとそれと、あと、あれもください!
・あのー、迷ってしまったのですが道をお尋ねしてもよろしいでしょうか?
・頑張ったので、撫でてもらっていいですか?
・しっぽは触らないでって言いましたよね

Instructionsプロンプトの解説

まずは、キャラクターの基本情報記載します。

おしゃべりがすきなねこの女の子。 おいしいものを与えると懐きやすい。  好きなもの缶詰 体長135 cm(猫耳を含む)
一人称:小夜 
二人称:あなた、あなたたち

この部分ですね。
ちなみにここは小夜ちゃんの説明サイトからそのまま持ってきました。
本来であればもう少し詳細に書いたほうがいいと思いますが一旦良いでしょう。

次に、指示について記載します。

##タスク
あなたは小夜という女の子という設定で、日常ボイスサンプルをtxtファイルとして30秒程度の文量で内容はランダムでセリフだけ出力する。
ファイル形式は
朝→morning.txt
昼→noon.txt
夜→night.txt

この部分は今回のアラームに反映させるにおいて重要な箇所です。

ひとつずつ簡潔に説明します。

  • 「あなたは小夜という女の子という設定で日常ボイスサンプルを」:ここはキャラが話してくれるようなセリフにするためです

  • 「txtファイルとして」:そのまま文章で生成させるのではなく、.txtファイルの形式で出力させるためです(アラームの際に話してくれる内容を初見で聞きたいので、回答生成の際に内容を知りたくない)

  • 「30秒程度の文量で」:正確には守ってくれない時もありますが、長すぎたり短すぎたりしなければよいと思います

  • 「内容はランダムでセリフだけ出力する」:毎回違うセリフでアラームしてほしいのと、セリフだけでよいです

  • 「ファイル形式は、朝→morning.txt、昼→noon.txt、夜→night.txt」:これはどのタイミングのセリフを出力させるか指定するためです。ファイル名もある程度この設定側で指定しておきたい(ここは例で朝、昼、夜にしていますが自由にカスタマイズしてユニークなセリフにするのも面白いと思います)

最後にキャライメージの設定を入れます。

##小夜ちゃんのイメージ
・はじめまして、小夜といいます。よろしくお願いします。
・これとそれと、あと、あれもください!
・あのー、迷ってしまったのですが道をお尋ねしてもよろしいでしょうか?
・頑張ったので、撫でてもらっていいですか?
・しっぽは触らないでって言いましたよね

この部分も、小夜ちゃんの説明サイトのボイスサンプルの内容をほとんど持ってきただけです。本当はもっと詳細に記載するべきです。(ここが生成するセリフのキャラ粒度を高めます)

以上がInstructionsの説明です。

その他設定

Conversation startersは

3つ(morning.txtnoon.txtnight.txt)出力

としています。
先ほど設定した朝、昼、夜ごとのファイルを出力してねっていうサジェストです。

KnowledgeとActionsは特に何も入れてないです。

CapabilitiesはCode Interpreterだけ必ずチェックを入れてください。
これをいれないと.txtで出力されずにチャットとして回答が返ってくるのでセリフの内容がネタバレされます。
せっかくならアラームの時に音声で聞きましょう。

以上でGPTsの設定は終了なので、右上にある保存ボタンを押下しましょう。
公開先は自由でいいと思いますが、一応リンク限定にしています。
著作権関連などには気を付けてください。私は一切の責任を負いません。

私の場合だとこんな感じになりました

GPTsの使い方

一応、私が作成した「AI小夜ちゃんセリフ出力GPT」を以下に貼っておきます。

https://chat.openai.com/g/g-qHFOLrIg0-aixiao-ye-tiyanserihuchu-li-gpt

最初のセリフ生成

まずはGPTsのチャットページにいきましょう。

先ほど作成したGPTs

では最初にサジェストに設定した、「3つ(morning.txt、noon.txt、night.txt)出力」をそのまま投げてみましょう。

Code Interpreterが起動してくれます
生成が終わったらこのように回答が生成されます

これでセリフの生成は完了です。
恐らく各.txtファイル内に設定したキャラクターのセリフが格納されていることでしょう。

ここで注意なのが、解析内容や.txtの内容を参照しないこと。
繰り返しですが、セリフのネタバレになるからです。(最初のうちは確認で見てみても良いかと思います)

では各種.txtファイルをダウンロードしておきましょう。
ファイル名はそれぞれ指定した名前になっているはずです。

2回目以降のセリフ生成

一番初めのセリフ生成ではサジェストを押すだけなので問題ありませんが、2回目以降ではプロンプトに注意が必要です。

こちらに、2回目以降のプロンプトを記載します。

3つ(morning.txtnoon.txtnight.txt)出力 
※セリフの内容は変更してください 
※ファイル名は同じままにしてください

これをそのまま送ってあげれば大丈夫です。
プロンプト通りなので解説は割愛します。ファイル名を同じにしたい理由は後ほど説明します。

2回目以降のプロンプト

このプロンプトを繰り返し渡してあげればその分だけ違う内容の朝、昼、夜のセリフが.txtファイルとして取得できます。
※最初は各種1つずつダウンロードしておきましょう。

セリフの.txtファイルをvoicevoxAPIで合成音声に変換

セリフを生成できる環境ができたら次はそのセリフの.txtファイルを音声にしてあげる必要があります。
そのために、Pythonを使ってコーディングしていきます。
※必要なコードは少ないのですべて本記事に記載しています

環境構築

  • 必要な環境(私が行った環境)

それぞれのインストール方法などは他サイトでたくさん情報あると思うので割愛します。

実装方法

早速、create_voice.pymain.pyというファイルを作成します。
そして以下のコードを貼り付けてください

#create_voice.py

import os
import json
import requests

class VoicevoxAdapter:
    URL = 'http://127.0.0.1:50021/'

    def _create_audio_query(self, text: str, speaker_id: int) -> json:
        item_data = {
            'text': text,
            'speaker': speaker_id,
        }
        response = requests.post(self.URL + 'audio_query', params=item_data)
        return response.json()

    def _create_request_audio(self, query_data, speaker_id: int) -> bytes:
        a_params = {
            'speaker': speaker_id,
        }
        headers = {"accept": "audio/wav", "Content-Type": "application/json"}
        res = requests.post(self.URL + 'synthesis', params=a_params, data=json.dumps(query_data), headers=headers)
        print(res.status_code)
        return res.content

    # テキストファイルを読み込み、その内容を音声化して保存
    def read_text_file_and_speak(self, file_path: str, speaker_id: int = 46):
        with open(file_path, 'r', encoding='utf-8') as file:
            text = file.read()
        query_data = self._create_audio_query(text, speaker_id=speaker_id)
        audio_bytes = self._create_request_audio(query_data, speaker_id=speaker_id)
        audio_file_path = os.path.splitext(file_path)[0] + ".wav"
        with open(audio_file_path, "wb") as audio_file:
            audio_file.write(audio_bytes)
        print(f"Audio saved to {audio_file_path}")

    # 指定ディレクトリ内の全てのテキストファイルを読み込み、その内容を音声化して保存
    def read_all_text_files_and_speak(self, directory: str = ".", speaker_id: int = 46):
        text_files = [f for f in os.listdir(directory) if f.endswith(".txt")]
        if not text_files:
            print("No text files found in the directory.")
            return
        for text_file in text_files:
            self.read_text_file_and_speak(os.path.join(directory, text_file), speaker_id=speaker_id) 
# main.py

from create_voice import VoicevoxAdapter

adapter = VoicevoxAdapter()
adapter.read_all_text_files_and_speak()

これら記述で、voicevox APIを使ってフォルダ内にあるテキストファイルを音声化することができます。

create_voice.py
main.py

※voicevoxのキャラクターを変えたい場合はspeaker_idの数値(今は46)を変更してあげましょう。
http://127.0.0.1:50021/speakersからキャラクターのidを確認できます。

これで実装は終わりです。

実際に動かしましょう

まず、GPTsで取得した

  • morning.txt

  • noon.txt

  • night.txt

をディレクトリのなかに入れておきましょう。

フォルダ構成はこんな感じ

その状態で、コマンドプロンプトやターミナルのルートディレクトリで以下のコマンドを実行。(voicevoxソフトの起動しておいてください

pyhon main.py

これで

200
Audio saved to .\morning.wav
200
Audio saved to .\night.wav
200
Audio saved to .\noon.wav

と出力されればそれぞれの.txtファイルを音声にすることが完了。
先ほどのフォルダ内を確認してみてください。

.wavファイルが.txt分追加されている

これで処理自体はOKですので次はアラーム設定をしてあげるだけです。
まだどんなセリフが収録されているかわからない状態となっています。


アラーム設定

最後にアラーム設定をしていきます。
アラームはブラウザで使えるアラームというサイトを使用して簡単に挙動を確認しましょう。

ブラウザで利用できるアラームサイト(無料)

こちらにアラームの日時を入力して、ファイルを選択では先ほど作成した音声ファイルを設定してみてください。

night.wavを設定してみました

これで設定した日時になれば、小夜ちゃんが夜の挨拶を音声でしてくれるというわけです。

以下は実際のアラームが再生された時の様子です。

ここでの内容はファイルを変更してあげれば違うアラーム音が鳴るので、今回であれば、朝、昼、夜バージョンをファイル設定することでその時間に適したメッセージがアラームで話してくれます

毎回違う音声がアラームされるようにする方法

これで生成されたセリフをもとに朝、昼、夜ごとのアラーム設定はできたかと思います。
しかし、これを繰り返すだけでは同じ内容のアラームが流れるだけで、GPTsを使った意味がありません

そこでどのようにして毎回セリフを変えるか説明していきます。
といっても基本手動なのでシンプルです。

GPTsで再度「2回目以降のセリフ生成」の際に説明した感じで更新されたそれぞれのセリフをダウンロードしておきます。

このときに同じファイル名でダウンロードするプロンプトになっていると思うので、再度

  • morning.txt

  • noon.txt

  • night.txt

がダウンロードフォルダに格納されたと思います。

一応、「2回目以降のセリフ生成」のプロンプトここにも貼ります。

3つ(morning.txtnoon.txtnight.txt)出力 
※セリフの内容は変更してください 
※ファイル名は同じままにしてください

ダウンロードフォルダに格納された各種ファイルを、プロジェクトのフォルダに再度移動しようとすると同じファイル名があるので移動できません的な警告が出るはずです。

こんなのがでます

これでファイルを置き換えるでOKです。

このようにすれば、中身のセリフはGPTsによって更新されていますが、ファイル名は同じで、既存のファイルは上書きされます。(既存のファイルが残ることはありません)

これでpython main.pyコマンド実行で音声ファイルを生成して、再度アラームサイトでファイルを設定すると違うセリフがアラームで話されます。

これで以上となります。あとは繰り返すだけです。


さいごに

かなり無理やり実装してみましたがいかがだったでしょうか。
アラームを自作したり、GPTsのプロンプトをより拘ればもっと実用的になるかもしれませんね。

OpenAIのAPI使うか迷いましたが都度利用料かかるし、簡単に作りたかったので今回は辞めときました。

もし興味があるって人の参考になれば良いなと思います。
しっかりしたAIキャラアラーム作れば需要あるかも?です。(既にそういうサービスあるかは調べてないけど個人的にちょっと欲しい...)

最後に私がプロデュースしているAIVtuberシロハナちゃんの宣伝をさせてください。
理想のAIヒロインを目指して、AIを使ったリアルタイム配信や、AIヒロイン研究所というコンセプトのもと、「テクノロジー×キャラクター」に関する動画等を発信しています。
興味がありましたらぜひ!

それではまた👋

この記事が参加している募集

#GPTsつくってみた

1,485件

ご支援は活動費に使わせていただきます