TTSパイプライン
N.E.K.O. は複数のTTS(Text-to-Speech)プロバイダーをサポートしており、統一されたキューベースのアーキテクチャによってストリーミング音声出力とリアルタイム割り込みを実現しています。
アーキテクチャ
LLM text output
│
▼
TTS Request Queue ──> TTS Worker Thread
│
┌────┼────────────┐
│ │ │
▼ ▼ ▼
CosyVoice GPT-SoVITS Custom
(DashScope) (Local) Endpoint
│ │ │
└────┼────────────┘
│
TTS Response Queue
│
Audio Resampler (24→48 kHz)
│
WebSocket ──> Browserサポートされるプロバイダー
| プロバイダー | タイプ | 特徴 |
|---|---|---|
| DashScope CosyVoice | クラウドAPI | 高品質、音声クローン、複数のボイストーン |
| DashScope TTS V2 | クラウドAPI | 高速、低レイテンシ |
| GPT-SoVITS | ローカルサービス | 完全オフライン、カスタマイズ可能 |
| カスタムエンドポイント | ユーザー定義 | 任意のOpenAI互換TTS API |
キューベースのストリーミング
TTSパイプラインはプロデューサー・コンシューマーパターンを使用します:
- プロデューサー(メインスレッド):LLMがテキスト出力をストリーミングすると、完成した文が
tts_request_queueにエンキューされます。 - コンシューマー(TTSワーカースレッド):テキストをデキューし、音声を合成し、PCMチャンクを
tts_response_queueにエンキューします。 - センダー(メインスレッド):音声チャンクをデキューし、24kHzから48kHzにリサンプリングし、WebSocket経由で送信します。
割り込み処理
キャラクターがまだ話している最中にユーザーが話し始めた場合:
- LLMプロバイダーが
on_interruptイベントを発火 - 両方のTTSキューが即座にフラッシュ
- 保留中の音声が破棄
- システムは新しいユーザー入力を受け付ける準備完了
音声クローン
ユーザーは約15秒のクリーンな音声サンプルをアップロードすることで、カスタムボイスを作成できます:
/api/characters/voice_clone経由で音声をアップロード(マルチパートフォーム)- 音声がDashScopeの音声クローンAPIに送信
- 一意の
voice_idが返され、キャラクター設定に保存 - そのキャラクターの以降のTTSリクエストはすべてクローンされたボイスを使用
音声フォーマット
| パラメーター | 値 |
|---|---|
| LLM出力サンプルレート | 24,000 Hz |
| ブラウザ再生レート | 48,000 Hz |
| フォーマット | PCM 16ビット符号付きリトルエンディアン |
| チャンネル | モノラル |
| リサンプラー | soxr(高品質) |
無料ボイス
N.E.K.O. にはカスタムAPIキーが不要な組み込みボイストーンが含まれています:
| 名称(中国語) | Voice ID |
|---|---|
| 俏皮女孩(おちゃめな女の子) | voice-tone-OdVwaw2Az2 |
| 可爱女孩(かわいい女の子) | voice-tone-OdVwrbG3No |
| 可爱少女(かわいい少女) | voice-tone-OdVx7X482K |
| 温柔少女(優しい少女) | voice-tone-OdVyxjm0lk |
| 清冷御姐(クールなお姉さん) | voice-tone-OdVyPmim9I |
| 他5つ... |
