![見出し画像](https://assets.st-note.com/production/uploads/images/172206598/rectangle_large_type_2_6f08a67a7abe1a4e7c3ccbc9c08f85b0.jpeg?width=1200)
Avisspeechを有効的につかいたい - SentioVoxというツールにしました
前回はWhisperを使って音声ファイルを日本語に文字起こしし、感情分類まで行いました。
1.今回やりたいこと
文字起こしした日本語と感情分類の情報を基にAivisSpeechで話してもらい、また話した結果を音声ファイルに保存できるようにしたいと思います。
今後の用途を考えて、入力できるのは音声ファイルだけでなく、テキストファイルやマイク入力にも対応したいと思います。
1-1.テキストファイルの入力
既に文字に起こされたデータを使ってAivisSpeechを使うには、発音する文節に区切って感情分類する必要があります。
今回はGiNZAという日本語の自然言語ライブラリを使ってこれを実現します。GiNZAでテキストファイルを適切な文節に分け、前回も使ったJapanese to emotionsで感情分類します。
1-2.マイク入力
パソコンのマイクから入力した音声から文字起こしと感情分類を行います。音声ファイルの入力と非常に似ていますが、音声ファイルをその場で作るところが違います。確認に使ったマイクはPoly Sync 20です。
1-3.どうやってシステムにするか
このように3種類のファイルに対応するため、以下を整理したいと思います
どんなAIモデルを使うか
どのような手順で使うか
[音声入力]
Whisper(v3 turbo)で日本語テキストにする
Japanese to emotionで日本語テキストを感情分類する
AIVIS Engineで日本語テキストと感情分類を基に発音する
[テキストファイル入力]
GiNZAでテキストファイルを文節化する
Japanese to emotionで文節化した日本語テキストを感情分類する
AIVIS Engineで日本語テキストと感情分類を基に発音する
[マイク入力]
マイク音声をPyaudioで音声ファイルにする
あとは音声入力と同じ
このようにプログラムする作る前にまとめますと、どれが個別の処理で、どれが独自の処理か見分けることができます。それでは開発していきたいと思います。
2.Githubに公開しました
2-1.ツールの名前はSentioVox
対応した内容が多かったため、今回はGitHubに公開しました。今後の機能拡張、バグ修正、ドキュメントの管理は以下のレポジトリで行います。なお、パラメータを変更すればWindows以外でも動きますが、Windowsで使っていただいた方がよろしいかと思います。
ツール機能やインストール方法、使い方はレポジトリ内のREADMEに記載しました。
ご使用のパソコンによって導入するツールが異なったり、そもそも導入するツールやAIモデルが多いので、動かす環境を用意するだけでも大変かとは思いますが興味持っていただければ幸いです。
また、現時点では3分程度の短いデータで動作検証していましたので、テストも十分でないところはあることはご容赦ください。コードも綺麗でないところがチラホラありますので徐々に見直したいと思います。
現在はコマンド実行のみですが、将来的にはStreamlitでGUIを用意しようかなと思っています。ただし機能を増やす予定のため、落ち着いてからGUIはデザインしたいと思います。
2-2.実際の使い方
試しに開発したパソコンで動かした様子を紹介したいと思います。パソコンは以下のような性能です。
OS:Windows11
CPU:AMD Ryzen 7 5800X
メモリ:32GB
GPU:Geforce RTX 3060Ti(8GB)
SSD:WD Blue SN580(1TB)
では早速動かしてみます。Visual Studio Codeを開いてGitHubからクローンしたレポジトリを指定すると、以下のように左側にフォルダ階層が表示されます。同じ階層に対象の音声ファイルやテキストファイルを配置しておくと便利です。
![](https://assets.st-note.com/img/1738505276-P7b8jpf0J9FGivBdCZxwSloD.png?width=1200)
次にAivis Speechをインストール場所を変更せずに導入していれば、Windows11でしたらC:\Program Files\AivisSpeech\AivisSpeech-Engineにインストールされています。こちらにコピーされたrun.exeがAivis Engineの本体ですのでファイルが存在するか確認します。こちらにファイルが配置されていればSentioVoxは自動的に起動します。
![](https://assets.st-note.com/img/1738505242-6mqcDarsfhLgMJGpWoSjlKv9.png?width=1200)
音声ファイルかテキストファイルとAivis Engineの準備ができましたら、コマンド入力できるアプリケーション(コマンドプロンプト、パワーシェルなど)を使ってコマンドを入力します。今回はVisual Studio Codeのターミナルにコマンドを入力してEnterキーを押して実行していています。
![](https://assets.st-note.com/img/1738505513-7WuH9FxdGbhZvw5LcEqCTVpa.png?width=1200)
今回のコマンドは、テキストファイルをAivis Engineで発音し、発音した内容を音声ファイルに保存しています。実行結果の一部を以下に紹介します。
エラーがAivis Engine側で出ていますが、機能は想定通りのため、とりあえず後日原因を調べたいと思います。
GPU使用: NVIDIA GeForce RTX 3060 Ti
感情分析を開始: 合計 13 テキスト
メモリ使用量調整: バッチサイズを 4 に変更
バッチ 1/2 を処理中...
進捗状況: 4/13 テキスト処理済み (30.8%)
メモリ使用量調整: バッチサイズを 2 に変更
バッチ 2/2 を処理中...
進捗状況: 6/13 テキスト処理済み (46.2%)
メモリ使用量調整: バッチサイズを 1 に変更
:
:
感情分析完了: 13/13 テキストを処理
感情分析結果:
セグメント 1:
テキスト: 開けます
検出された感情:
期待: 0.842
喜び: 0.109
主要な感情: 期待
--------------------------------------------------
:
:
セグメント 13:
テキスト: わかんないセルジオエチゴって誰
検出された感情:
嫌悪: 0.267
驚き: 0.249
悲しみ: 0.232
怒り: 0.117
恐れ: 0.083
主要な感情: 嫌悪
--------------------------------------------------
Aivis Engineを起動しています...
Traceback (most recent call last):
File "run.py", line 28, in <module>
File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
File "voicevox_engine\aivm_manager.py", line 24, in <module>
File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
File "voicevox_engine\logging.py", line 19, in <module>
File "pathlib.py", line 1147, in unlink
PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。: 'C:\\Users\\tucon\\AppData\\Roaming\\AivisSpeech-Engine\\Logs\\AivisSpeech-Engine.log'
[19360] Failed to execute script 'run' due to unhandled exception!
[2025/02/02 23:51:48] INFO: AivisSpeech Engine version 1.1.0-dev
[2025/02/02 23:51:48] INFO: Engine root directory: C:\Program Files\AivisSpeech\AivisSpeech-Engine
[2025/02/02 23:51:48] INFO: User data directory: C:\Users\tucon\AppData\Roaming\AivisSpeech-Engine
[2025/02/02 23:51:48] INFO: Models directory: C:\Users\tucon\AppData\Roaming\AivisSpeech-Engine\Models
[2025/02/02 23:51:48] INFO: Installed models:
[2025/02/02 23:51:48] INFO: - Anneli (a59cb814-0083-4369-8542-f51a29e72af7)
[2025/02/02 23:51:48] INFO: - fumifumi (71e72188-2726-4739-9aa9-39567396fb2a)
[2025/02/02 23:51:48] INFO: - morioki (baaae3c0-7b22-4605-8ba5-80c959b41a48)
[2025/02/02 23:51:48] INFO: - ろてじん(長老ボイス) (696c98a2-c0b7-4fe7-8cf2-c7e9b8a9bd82)
[2025/02/02 23:51:48] INFO: - 凛音エル (f5017410-fbb5-49e1-97cb-e785f42e15f5)
[2025/02/02 23:51:49] INFO: Using CPU for inference.
[2025/02/02 23:51:49] INFO: Loading BERT model and tokenizer...
[2025/02/02 23:51:50] INFO: BERT model and tokenizer loaded. (1.24s)
[2025/02/02 23:51:50] INFO: Compiled user dictionary applied.
reading C:\Users\tucon\AppData\Roaming\AivisSpeech-Engine\user.dict_csv-d67a2161-606d-4e29-ab70-68a79006c3d3.tmp ... 2
emitting double-array: 100% |###########################################|
done!
[2025/02/02 23:51:50] INFO: Started server process [17176]
[2025/02/02 23:51:50] INFO: User dictionary updated. (0.13s)
[2025/02/02 23:51:50] INFO: Waiting for application startup.
[2025/02/02 23:51:50] INFO: Application startup complete.
[2025/02/02 23:51:50] INFO: Uvicorn running on http://localhost:10101 (Press CTRL+C to quit)
[2025/02/02 23:51:55] INFO: 127.0.0.1:50893 - "GET /version HTTP/1.1" 200 OK
Aivis Engineが正常に起動しました。
音声合成を開始します...
セグメント 1/13 を処理中...
[2025/02/02 23:51:56] INFO: 127.0.0.1:50894 - "POST /audio_query?text=%E9%96%8B%E3%81%91%E3%81%BE%E3%81%99%E3%80%82&speaker=888753762&outputSamplingRate=24000&outputStereo=False HTTP/1.1" 200 OK
[2025/02/02 23:51:56] INFO: Loading Anneli (a59cb814-0083-4369-8542-f51a29e72af7) ...
[2025/02/02 23:51:57] INFO: Anneli (a59cb814-0083-4369-8542-f51a29e72af7) loaded. (1.59s)
[2025/02/02 23:51:57] INFO: Model: Anneli / Version 1.0.0
[2025/02/02 23:51:57] INFO: Speaker: Anneli / Style: テンション高め
[2025/02/02 23:51:57] INFO: Running inference...
[2025/02/02 23:51:57] INFO: Text: 開けます。
[2025/02/02 23:51:57] INFO: Speed: 0.95 (Input: 1.06)
[2025/02/02 23:51:57] INFO: Style Weight: 1.60 (Input: 1.07)
[2025/02/02 23:51:57] INFO: Tempo Dynamics: 0.28 (Input: 1.11)
[2025/02/02 23:51:57] INFO: Pitch: 1.02 (Input: 0.02)
[2025/02/02 23:51:57] INFO: Volume: 1.20
[2025/02/02 23:51:57] INFO: Pre-Silence: 0.10
[2025/02/02 23:51:57] INFO: Post-Silence: 0.10
[2025/02/02 23:51:58] INFO: Inference done. Elapsed time: 0.81 sec.
[2025/02/02 23:51:58] INFO: 127.0.0.1:50894 - "POST /synthesis?speaker=888753762 HTTP/1.1" 200 OK
セグメント 1 の合成が完了しました
:
:
セグメント 13/13 を処理中...
[2025/02/02 23:52:12] INFO: 127.0.0.1:50894 - "POST /audio_query?text=%E3%82%8F%E3%81%8B%E3%82%93%E3%81%AA%E3%81%84%E3%82%BB%E3%83%AB%E3%82%B8%E3%82%AA%E3%82%A8%E3%83%81%E3%82%B4%E3%81%A3%E3%81%A6%E8%AA%B0%E3%80%82&speaker=888753765&outputSamplingRate=24000&outputStereo=False HTTP/1.1" 200 OK
[2025/02/02 23:52:12] INFO: Model: Anneli / Version 1.0.0
[2025/02/02 23:52:12] INFO: Speaker: Anneli / Style: 怒り・悲しみ
[2025/02/02 23:52:12] INFO: Running inference...
[2025/02/02 23:52:12] INFO: Text: わかんないセルジオエチゴって誰。
[2025/02/02 23:52:12] INFO: Speed: 0.98 (Input: 1.02)
[2025/02/02 23:52:12] INFO: Style Weight: 1.84 (Input: 1.09)
[2025/02/02 23:52:12] INFO: Tempo Dynamics: 0.25 (Input: 1.06)
[2025/02/02 23:52:12] INFO: Pitch: 1.02 (Input: 0.02)
[2025/02/02 23:52:12] INFO: Volume: 1.20
[2025/02/02 23:52:12] INFO: Pre-Silence: 0.10
[2025/02/02 23:52:12] INFO: Post-Silence: 0.10
[2025/02/02 23:52:13] INFO: Inference done. Elapsed time: 1.34 sec.
[2025/02/02 23:52:13] INFO: 127.0.0.1:50894 - "POST /synthesis?speaker=888753765 HTTP/1.1" 200 OK
セグメント 13 の合成が完了しました
音声データを結合しています...
結合後の音声データの形状: (959483,)
一時WAVファイルを保存しました: output_20250202_235155.wav
音声ファイルを保存しました: output_20250202_235155.m4a
一時WAVファイルを削除しました
AIVISエンジンを正常に終了しました。
3.次回予告
早速問題が起こりそうですが、Amazon AudibleのようなものをSentioVoxで作成したいと考えています。テキスト量が多いこと、誤読を防ぐ辞書登録など盛りだくさんになると思います。