VOICEVOXとMac sayで作るバイリンガルTTS環境
AIアシスタントに「声」を与えたい。日本語は自然に、英語もネイティブっぽく。この記事では、VOICEVOXとMacのsayコマンドを組み合わせて、バイリンガルな音声合成環境を構築する方法を紹介する。
なぜ2つのエンジンを使うのか
VOICEVOXは日本語に特化した高品質な音声合成エンジンだ。キャラクターボイスが豊富で、感情表現も可能。しかし英語の発音は苦手で、カタカナ読みになってしまう。
一方、macOSのsayコマンドは英語の発音が自然。Samantha、Alex、Victoriaなど複数の音声が標準搭載されている。
言語を自動判定して適切なエンジンに振り分けることで、両方の強みを活かせる。
構成
| 言語 | エンジン | ボイス |
|---|---|---|
| 日本語 | VOICEVOX | 雨晴はう (Style ID: 10) |
| 英語 | Mac say | Samantha |
VOICEVOXのインストール
voicevox-cliの導入
公式GUIアプリもあるが、CLIで使いたい場合はvoicevox-cliが便利。
# ダウンロード(macOS ARM64の場合)
curl -L -o voicevox-cli.tar.gz \
https://github.com/because-of-u/voicevox-cli/releases/latest/download/voicevox-cli-darwin-arm64.tar.gz
tar xzf voicevox-cli.tar.gz -C ~/voicevox-cli
必要リソースのセットアップ
~/voicevox-cli/voicevox-setup
これで以下がダウンロードされる:
- ONNX Runtime(推論エンジン)
- OpenJTalk辞書(日本語解析)
- ボイスモデル(.vvmファイル)
辞書の手動ダウンロード(setupが失敗した場合)
cd ~/.local/share/voicevox
curl -L -o dict.tar.gz \
"https://github.com/r9y9/open_jtalk/releases/download/v1.11.1/open_jtalk_dic_utf_8-1.11.tar.gz"
tar xzf dict.tar.gz
ディレクトリ構成
~/voicevox-cli/
├── voicevox-daemon # バックグラウンドサービス
├── voicevox-say # TTSコマンド
├── voicevox-download # モデルダウンロード
└── voicevox-setup # 初期セットアップ
~/.local/share/voicevox/
├── models/vvms/ # ボイスモデル群
├── onnxruntime/ # ONNX Runtimeライブラリ
└── open_jtalk_dic_utf_8-1.11/ # 辞書
統合スクリプト
言語を自動判定して適切なエンジンを呼び出すスクリプト。launchd管理のdaemonと、サンプルレート変換に対応:
#!/bin/bash
# nemo_speak.sh - バイリンガルTTS
# Usage: nemo_speak.sh "テキスト"
TEXT="$1"
if [ -z "$TEXT" ]; then
echo "Usage: nemo_speak.sh \"テキスト\""
exit 1
fi
# 非ASCII文字があれば日本語と判定
if echo "$TEXT" | LC_ALL=C grep -q '[^[:print:][:space:]]'; then
# Japanese text → VOICEVOX
export VOICEVOX_OPENJTALK_DICT="$HOME/.local/share/voicevox/open_jtalk_dic_utf_8-1.11"
VOICEVOX_CLI="$HOME/clawd/voicevox/voicevox-cli/voicevox-say"
# Check daemon is running (managed by launchd)
SOCKET_PATH="$HOME/.local/state/voicevox/runtime/voicevox-daemon.sock"
if ! [ -S "$SOCKET_PATH" ]; then
echo "⚠️ VOICEVOX daemon not running. Trying to restart via launchctl..."
launchctl kickstart -k gui/$(id -u)/com.chibiham.voicevox-daemon 2>/dev/null || \
launchctl start com.chibiham.voicevox-daemon 2>/dev/null
sleep 2
if ! [ -S "$SOCKET_PATH" ]; then
echo "❌ Daemon failed to start. Check: launchctl list | grep voicevox"
exit 1
fi
fi
echo "🎤 Speaking Japanese with VOICEVOX..."
TMPWAV="/tmp/nemo_speech.wav"
TMPWAV_44K="/tmp/nemo_speech_44k.wav"
"$VOICEVOX_CLI" --speaker-id 10 -o "$TMPWAV" -q "$TEXT"
# Convert 24kHz → 44.1kHz for Mac compatibility
ffmpeg -y -i "$TMPWAV" -ar 44100 "$TMPWAV_44K" 2>/dev/null
afplay "$TMPWAV_44K"
else
# English text → Mac say
echo "🎤 Speaking English with say..."
say -v Samantha "$TEXT"
fi
echo "✅ Done!"
依存関係:
- ffmpeg(サンプルレート変換用):
brew install ffmpeg
言語判定のロジック
LC_ALL=Cを設定することで、grepがバイト単位で比較するようになる。日本語(UTF-8)は非ASCII文字を含むため、[^[:print:][:space:]]にマッチする。
この方法は完璧ではないが、日常的な使用には十分実用的だ。
利用可能なVOICEVOXボイス
~/voicevox-cli/voicevox-say --list-speakers
主なキャラクター:
| キャラクター | スタイル | Style ID |
|---|---|---|
| 四国めたん | ノーマル | 2 |
| ずんだもん | ノーマル | 3 |
| 春日部つむぎ | ノーマル | 8 |
| 雨晴はう | ノーマル | 10 |
| 波音リツ | ノーマル | 9 |
AIアシスタントからの呼び出し
Clawdbotなどのエージェントから呼び出す場合、バックグラウンド実行にすると応答が速くなる:
exec({
command: '~/clawd/scripts/nemo_speak.sh "メッセージ"',
background: true
})
音声再生の完了を待たずに次の処理に進めるため、会話のテンポが良くなる。
daemonの起動
voicevox-sayは初回実行時に自動でdaemonを起動するが、セッションごとに起動チェックするのは無駄で不安定の元になる。
launchd で常駐させる(推奨)
macOSのlaunchdでログイン時に自動起動させるのがベスト。
plistファイルを作成:
cat > ~/Library/LaunchAgents/com.chibiham.voicevox-daemon.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.chibiham.voicevox-daemon</string>
<key>ProgramArguments</key>
<array>
<string>/Users/chibiham/clawd/voicevox/voicevox-cli/voicevox-daemon</string>
<string>--start</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>VOICEVOX_OPENJTALK_DICT</key>
<string>/Users/chibiham/.local/share/voicevox/open_jtalk_dic_utf_8-1.11</string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/voicevox-daemon.log</string>
<key>StandardErrorPath</key>
<string>/tmp/voicevox-daemon.log</string>
</dict>
</plist>
EOF
登録と起動:
launchctl load ~/Library/LaunchAgents/com.chibiham.voicevox-daemon.plist
管理コマンド:
# 状態確認
launchctl list | grep voicevox
# 停止
launchctl unload ~/Library/LaunchAgents/com.chibiham.voicevox-daemon.plist
# 起動
launchctl load ~/Library/LaunchAgents/com.chibiham.voicevox-daemon.plist
# 強制再起動
launchctl kickstart -k gui/$(id -u)/com.chibiham.voicevox-daemon
メリット:
- Mac再起動しても自動復帰
- クラッシュしても再起動(KeepAlive)
- Gateway再起動しても daemon は生き続ける
トラブルシューティング
"OpenJTalk dictionary not found"
環境変数が設定されていない。スクリプト内でexportするか、シェル設定に追加:
export VOICEVOX_OPENJTALK_DICT=~/.local/share/voicevox/open_jtalk_dic_utf_8-1.11
daemonが起動しない
ソケットファイルが残っている可能性:
rm ~/.local/state/voicevox/runtime/voicevox-daemon.sock
~/voicevox-cli/voicevox-daemon --start
音声が再生されない(重要)
VOICEVOXの出力は24kHzで、macOSのオーディオシステムと互換性問題が起きることがある。システムサウンド(Glassなど)は聞こえるのにVOICEVOXだけ聞こえない場合、これが原因。
解決策:ffmpegで44.1kHzに変換してから再生する
# 変換して再生
ffmpeg -y -i /tmp/nemo_speech.wav -ar 44100 /tmp/nemo_speech_44k.wav 2>/dev/null
afplay /tmp/nemo_speech_44k.wav
診断方法:
# wavファイルの情報確認
ffprobe /tmp/nemo_speech.wav 2>&1 | grep "Audio:"
# → Audio: pcm_s16le, 24000 Hz, mono ← この24000が問題
# 直接afplayで再生してみる
afplay /tmp/nemo_speech.wav # 聞こえない
afplay /System/Library/Sounds/Glass.aiff # 聞こえる → サンプルレートの問題
今後の展望
- RVCとの組み合わせでカスタムボイス化
- 感情パラメータの自動調整
- ストリーミング再生対応
関連
抽出された概念
- テキスト音声合成 - テキストを音声に変換する技術の全般的な概念
- launchdデーモン管理 - macOSのサービス管理システムで常駐プロセスを安定運用する手法