免責事項
- 筆者は本記事の掲載内容を用いて行う一切の行為について, 何らの責任を負うものではありません.
- 本記事を公開するにあたり, 掲載されている情報の正確性については万全を期しておりますが, 筆者は掲載内容の正確性・完全性・信頼性・最新性を保証するものではありません.
- 筆者はリンク先サイトについて, その掲載情報の正確性・合法性等を保証するものではありません. リンク先サイトの利用によって生じた問題に対して筆者は責任を負いません.
はじめに
OpenVoiceOS(OVOS)を ovos-docker で運用しながら, 音声認識・応答・音声合成を日本語対応させる手順をまとめる.
公式の ovos-installer だけでは, 設定の永続化や細かいカスタマイズができず, 日本語対応も困難なため, 途中から docker-compose.yml を直接運用する構成に切り替える.
STT(faster-whisper), TTS(VoiceVox), LLM 連携(OpenAI persona)それぞれの日本語対応と, その過程で必要になった設定変更・パッチ適用までを, 実際に行った順序に沿って記載する.
対象
本記事は以下のような方を対象とする.
- OVOS を Docker(ovos-docker)で日本語対応させたい人
- OVOS のウェイクワード・TTS・LLM 連携を Docker Compose で構成したい人
環境
| 項目 | 内容 |
|---|---|
| 運用基盤 | ovos-docker(Docker Compose) |
| 音声出力(TTS) | VoiceVox Engine(voicevox/voicevox_engine:cpu-latest) |
| 音声認識(STT) | faster-whisper(ovos-stt-server-fasterwhisper) |
| ウェイクワードエンジン | Vosk |
| LLM 連携 | OpenAI API 経由(ovos-solver-openai-plugin) |
| OS | Ubuntu 26.04 LTS |
アブストラクト
- ovos-installer で初期セットアップを行う
-
docker-compose.yml/.envを直接運用する構成に切り替える - STT(faster-whisper)を導入する
- 言語・ウェイクワードを設定する
- VoiceVox で日本語 TTS を設定する
- LLM(OpenAI persona)の応答を日本語対応させる
- 起動時に発生しやすい問題への対処
今回は永続化のための作業(イメージの保存やDockerfileの作成)はほとんど書いていない.
理由はこのプロジェクト自体が未成熟で今後も大きく破壊的な変更が行われる可能性があるからである.
1. ovos-installerで初期セットアップを行う
ovos-installer のコンテナ版を一度実行し, ~/ovos に設定ファイル一式を生成させる.
設定ファイルの作成が楽になり, 必要なコンテナが理解できる.
このコンテナ版 installer は docker-compose.yml と .env を保持しないため, コンテナを再作成するたびに installer の再実行が必要になる.
また, 選択できる言語に日本語が無く, 細かい構成変更もできない.
そのため, 初回のセットアップにのみ使用し, 以降は compose を直接運用する構成に切り替える.
2. docker-compose.ymlと.envを直接運用する構成に切り替える
ovos-docker の compose リポジトリから docker-compose.yml と .env を ~/ovos/compose/ にコピーする.
cp docker-compose.yml ~/ovos/compose/
cp .env.example ~/ovos/compose/.env
getent で input / render / video の GID を取得する.
getent group input render video
取得した GID を踏まえて .env を編集する.
- OVOS directories をホスト環境に合わせて修正
-
TZをタイムゾーンに合わせて修正 -
VERSIONSをtestingに変更する(installer ではこのバージョンが推奨されている)
3. STT(faster-whisper)を導入する
ovos-docker-stt の docker-compose.cuda.yml から ovos_stt_fasterwhisper サービス定義と, それに必要な volume 定義を docker-compose.yml に取り込む.
参照元ファイル内にタイポが存在するため, コピー時に注意する.
-
ovos-stt-server-fasterwhisper-cudaのイメージタグはtestingがないため例外でtestを使う -
turboモデルを使いたい場合はalphaタグのイメージを使う -
docker-compose.ymlとmycroft.confの両方に Whisper の設定を追加する
導入後, 利用可能なモデル一覧は次のコマンドで確認できる.
docker exec -ti ovos_stt_fasterwhisper \
python3 -c "from faster_whisper import available_models; print(available_models())"
['tiny.en', 'tiny', 'base.en', 'base', 'small.en', 'small', 'medium.en', 'medium', 'large-v1', 'large-v2', 'large-v3', 'large', 'distil-large-v2', 'distil-medium.en', 'distil-small.en', 'distil-large-v3', 'large-v3-turbo', 'turbo']
4. 言語・ウェイクワードを設定する
Vosk による日本語ウェイクワードの認識精度には限界があり, vosk-model-ja-0.22 を使っても実用的な精度は得られない.
モデルレベルから取り組まない限り改善は見込みにくいため, ウェイクワードは英語のまま使用し, 次の構成にする.
- 全体の言語: 日本語
- listener の言語: 英語(ウェイクワードが英語のため)
mycroft.conf の該当箇所を上記の通り設定する.
2回目以降のビルドにおいてlistener.list でモデルを指定しても listener に追加されないことがある.
state(ログ)が残っていると, 次回起動時にインストール済みと誤判定されスキップされてしまうためである.
したがって反映されていない場合は該当の state を削除してから再試行する.
この設定では, デフォルトTTSの Piper が日本語非対応のため, 音声出力が英語のみになる.
日本語出力は次のステップの VoiceVox で対応する.
5. VoiceVoxで日本語TTSを設定する
TTS プラグインは OVOS Plugin Manager(OPM)で管理されている. VoiceVox Engine に接続するクライアントプラグインを導入する.
本来は VoiceVox + ovos-tts-server の構成が望ましいが, Docker コンテナの開発コストを避けるため, VoiceVox 側の Engine コンテナへクライアントプラグインから直接接続する構成にする.
ここで使用しているクライアントプラグイン(ovos-tts-plugin-voicevox)は既存のものが見つからなかったため, 自作したものである.
docker-compose.yml に以下を追記する.
ここではコンテナを立てる時に毎回インストールしている.
services:
ovos_audio:
image: smartgic/ovos-audio:alpha
volumes:
- ./plugins/ovos-tts-plugin-voicevox:/opt/ovos-tts-plugin-voicevox:ro
- ./config/mycroft.conf:/home/ovos/.config/mycroft/mycroft.conf:ro
command: >
sh -lc "
pip install /opt/ovos-tts-plugin-voicevox &&
exec ovos-audio
"
depends_on:
- voicevox
voicevox:
image: voicevox/voicevox_engine:cpu-latest
ports:
- "127.0.0.1:50021:50021"
設定のポイントは以下の通り.
-
audio.listは使わない - 自作 plugin は volume mount する
-
commandでpip installしてから, 本来のovos-audio起動コマンドをexecする -
mycroft.confのtts.moduleに自作 plugin 名を指定する
{
"tts": {
"module": "ovos-tts-plugin-voicevox",
"ovos-tts-plugin-voicevox": {
"host": "http://voicevox:50021",
"speaker": 1
}
}
}
6. LLM(OpenAI persona)の応答を日本語対応させる
6-1. installerのLLM設定で数値パラメータが文字列になる問題を修正する
installer で LLM を設定すると, max_tokens / temperature / top_p の値に "" が付き, そのままでは型エラーになる.
設定ファイルを手動で修正し, 引用符を外す.
// NG
"max_tokens": "512",
"temperature": "0.7",
"top_p": "0.9"
// OK
"max_tokens": 512,
"temperature": 0.7,
"top_p": 0.9
6-2. persona pluginに日本語句読点対応のパッチを当てる
ovos-solver-openai-plugin は, OpenAI からの streaming 応答を文単位に区切って persona へ渡す際, 文末判定を . ! ? : など英語の句読点のみで行っている.
そのため日本語で応答すると, 。 ! ? : のいずれで文が終わっても区切り条件に一致せず, 応答が一切 persona に渡らない(persona_error になる).
対象は ovos_solver_openai_persona/engines.py の OpenAIChatCompletionsSolver.stream_chat_utterances . 現在の実装は次のコマンドで確認できる.
docker compose exec -T ovos_core python - <<'PY'
import inspect
import ovos_solver_openai_persona.engines as e
print(inspect.getfile(e))
print(inspect.getsource(e.OpenAIChatCompletionsSolver.stream_chat_utterances))
PY
修正前の実装:
for chunk in self._do_streaming_api_request(messages):
answer += chunk
if any(chunk.endswith(p) for p in [".", "!", "?", "\n", ":"]):
if len(chunk) >= 2 and chunk[-2].isdigit() and chunk[-1] == ".":
continue
if answer.strip():
if self.memory:
full_ans = f"{self.qa_pairs[-1][-1]}\n{answer}".strip()
self.qa_pairs[-1] = (query, full_ans)
yield post_process_sentence(answer)
answer = ""
次の2点を修正する.
- 文末判定の記号リストに日本語の句読点(
。!?:)を追加する - streaming 終了後に
answerが残っていた場合, 最後にyieldする処理を追加する(元の実装にはこれが無く, 中途半端に残った応答が捨てられていた)
for chunk in self._do_streaming_api_request(messages):
answer += chunk
if any(chunk.endswith(p) for p in [".", "!", "?", "\n", ":", "。", "!", "?", ":"]):
if len(chunk) >= 2 and chunk[-2].isdigit() and chunk[-1] == ".":
continue
if answer.strip():
if self.memory:
full_ans = f"{self.qa_pairs[-1][-1]}\n{answer}".strip()
self.qa_pairs[-1] = (query, full_ans)
yield post_process_sentence(answer)
answer = ""
if answer.strip():
if self.memory:
full_ans = f"{self.qa_pairs[-1][-1]}\n{answer}".strip()
self.qa_pairs[-1] = (query, full_ans)
yield post_process_sentence(answer)
パッチ適用後, ovos_core を再起動し, 日本語発話で persona が正常に応答することを確認する.
7. 起動時に発生しやすい問題への対処
-
ウェイクワードが聞き取れない: compose 起動直後に発生することがある.
ovos_audioコンテナを再起動すると解消する(毎回発生するわけではない).
docker restart ovos_audio
最後に
OVOS を Docker で運用しながら日本語対応させる手順をまとめた.
日本語での動作確認は完了しているが, 今後のプロジェクトの動向によってはこの記事の内容は使えないかもしれない.
本記事についてお気づきの点があれば, ご連絡いただけると幸いである.