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

これで以下がダウンロードされる:

辞書の手動ダウンロード(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!"

依存関係:

言語判定のロジック

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

メリット:

トラブルシューティング

"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  # 聞こえる → サンプルレートの問題

今後の展望

関連

抽出された概念