text-to-speech について
このスキルは、Deepgramのテキスト読み上げを統合する開発者向けガイドです。AuraとFlux TTSのエンドポイント、音声の選択、ストリーミングとバッチリクエスト、各種制御を扱います。
主な機能
- 01AuraまたはFlux TTSエンドポイントの選択
- 02WebSocketによる音声ストリーミング
- 03バッチリクエストによる音声生成
- 04音声と対応言語の選択
- 05速度、発音、ポーズの制御
活用シーン
- 01割り込みに対応するストリーミング音声エージェントの構築
- 02音声ファイルやIVRプロンプトの生成
- 03多言語音声出力の設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ deepgram/ skills --skill text-to-speechインストール後、Claude Code で/text-to-speechを入力して読み込まれたか確認します。
詳細
Deepgram テキスト読み上げ
Deepgram は、別々のエンドポイントで 2 系統のテキスト読み上げを提供しており、音声は互換性がありません。
Aura 音声は /v1/speak でのみ動作します。Flux TTS 音声は /v2/speak でのみ動作します。/v2/speak は追加のエンドポイントです。/v1/speak に変更はなく、引き続きサポートされます。
まず音声の系統を選ぶ
| 要件 | 系統 | エンドポイント |
|---|---|---|
| LLM の出力をストリーミングし、割り込みにも対応する必要がある音声エージェント | Flux TTS | wss://api.deepgram.com/v2/speak |
| 単発の音声:ファイル、IVR プロンプト、通知 | Flux TTS バッチ | POST https://api.deepgram.com/v2/speak |
| 英語とスペイン語を切り替える 1 つの応答 | Aura-2 コードスイッチング音声 | /v1/speak |
| Voice Agent 内の英語以外の音声 | Aura-2 | agent.speak.provider.version: "v1" |
継続して使う必要がある既存の aura-2-* または aura-{voice}-en 音声 | Aura-2 または Aura-1 | /v1/speak |
目安として、新規開発では 42 言語のいずれの場合も Flux TTS が推奨されます。
Flux TTS 音声は、英語(アメリカ、イギリス、アイルランド、オーストラリア、インド、シンガポール、フィリピンのアクセント)と、ほかの 41 言語に対応しています。言語はモデル文字列の接尾辞で示されます(flux-anouk-nl はオランダ語です)。テキストの正規化(数字、日付、略語)は、英語、ドイツ語、オランダ語、フランス語、ヒンディー語、イタリア語、日本語、ポルトガル語、ロシア語、スペイン語に対応しています。ほかの 32 言語は正規化なしのアーリーアクセスのため、数字や日付は単語で記述してください。英語以外の音声は api.deepgram.com、api.eu.deepgram.com、api.in.deepgram.com で提供されますが、現時点では api.au.deepgram.com では利用できません。Aura-2 は前世代(英語、スペイン語、ドイツ語、フランス語、オランダ語、イタリア語、日本語)で、Aura-1 は初代で英語のみです。Voice Agent 内では、英語以外の音声や圧縮形式またはコンテナ形式の出力には Aura(v1)音声が必要です(間違い 7 を参照)。
最初のリクエスト:REST で Aura を使う
curl --request POST \
--url "https://api.deepgram.com/v1/speak?model=aura-2-thalia-en&encoding=linear16&container=wav" \
--header "Authorization: Token $DEEPGRAM_API_KEY" \
--header "Content-Type: application/json" \
--data '{"text": "Hello, how can I help you today?"}' \
--output hello.wav \
--fail-with-body --silent || echo "Request failed"
期待される動作:
- 2xx の本文はバイナリー音声です。エラーは JSON です。解析する前に HTTP ステータスを確認してください。
- オプションはクエリー文字列に指定します。JSON 本文には
textのみを含めます。 encodingを指定しない場合、REST はmp3を返します。WAV の場合はencoding=linear16&container=wavを指定してください。REST で指定できるほかのエンコーディングはopus、flac、aac、mulaw、alawで、container、bit_rate、sample_rateも指定できます。modelを省略すると、/v1/speakは Aura-1 音声のaura-asteria-enを使用します。必ずmodelを指定してください。- Aura-2 の
speedは0.7から1.5まで指定でき、英語とスペイン語の音声でのみ動作します。スペイン語の音声では0.9から1.5を使用してください。0.9未満の値では、発話が不自然になる場合があります。 - Aura-2 の発音制御は、英語とスペイン語の音声で、Flux TTS と同じエスケープ済みの
\{"word":"...","pronounce":"<IPA>"\}構文を使って/v1/speakで GA として利用できます。入力上限は 2000 文字です。Aura-2 にはポーズ制御はありません。
WebSocket 経由の Aura
wss://api.deepgram.com/v1/speak?model=aura-2-thalia-en&encoding=linear16&sample_rate=24000 に、
同じ Authorization: Token ヘッダーを付けて接続します。JSON テキストフレームを送信します。{"type":"Speak","text":"..."} でテキストをキューに追加し、{"type":"Flush"} で音声の出力を強制し、{"type":"Clear"} でバッファーを破棄し、{"type":"Close"} で終了します。音声はバイナリフレームで届き、Metadata、Flushed、Cleared、Warning は JSON で届きます。LLM が応答を完了したら Flush を送信します。Flush の送信は 60 秒あたり 20 回までです。ストリーミング出力の形式は、raw linear16(デフォルト)、mulaw、alaw のみです。
Aura ソケットには、リクエストあたりテキスト 2000 文字(接続終了コード 1009、ペイロード BIG-0001)、ソケットへの送信は Speak メッセージ全体でカウントして 1 分あたり 2400 文字(接続終了コード 1008、DATA-0001)、初回接続から 60 分間(接続終了コード 1011、NET-0003)という制限があります。より長い会話では、新しいソケットを開いてください。接続終了フレームのコードと、アップグレードに失敗した場合の dg-error ヘッダーは、https://developers.deepgram.com/docs/tts-troubleshooting-websocket-net-and-data-errors に記載されています。リージョン別ホストの api.eu.deepgram.com、api.au.deepgram.com、api.in.deepgram.com では、同じキーを使用して /v1/speak、REST、WebSocket を利用できます。
音声エージェント向け Flux TTS
wss://api.deepgram.com/v2/speak?model=flux-haley-en に接続します。model は必須で、flux-* 音声である必要があります。デフォルト値はなく、Aura の文字列は拒否されます。リージョン内で処理するには、wss://api.eu.deepgram.com/v2/speak、wss://api.au.deepgram.com/v2/speak、または wss://api.in.deepgram.com/v2/speak を使用します。利用できないリージョンが指定された場合、別のリージョンにルーティングされず、リクエストは失敗します。
セッションはターンの連続で構成されます。トークンをストリーミングしてから、ターンを終了します。
{"type": "Speak", "text": "Sure, I can "}
{"type": "Speak", "text": "help you cancel your subscription."}
{"type": "Flush"}
Flushを送信する前から音声のストリーミングが始まります。Flushでターンが終了し、その後サーバーから課金情報とタイミングを含むFlushedとSpeechMetadataが送信されます。Flushedのほうが先に届くため、ターンの終了はSpeechMetadataで判断してください。- サーバーは各ターンの
SpeechStartedとSpeechMetadataでspeech_idを割り当てます。クライアントから送信しないでください。 - 最初のメッセージは
request_id、model_name、model_version、model_uuidsを含むConnectedです。 正常終了時の最後のメッセージは、セッションの累計値を含むSessionMetadataです。Interruptを送信すると、total_audio_duration_msはクライアントが実際に再生した音声を基準に再計算されます。 - サーバーから送信されるJSONメッセージは
Connected、SpeechStarted、Flushed、SpeechMetadata、SpeechInterrupted、ConfigureSuccess、ConfigureFailure、Warning、Error、SessionMetadataです。Warningにはcodeとdescriptionが含まれ、セッションは開いたままです。Errorは致命的で、 すべてのDOMAIN-NNNNコード(MESSAGE-0000、DATA-0000、DATA-0002、BIG-0000、NET-0000からNET-0004)の後にWebSocketが切断されます。 - バージイン時は、まずローカルでの再生を停止してから、
{"type":"Interrupt","playback_offset":{"type":"time_ms","value":2340}}を送信してください。SpeechInterruptedにはtext_spokenとtext_remainingが返されます。text_spokenをLLMの コンテキストに戻してください。playback_offsetを指定しない場合、テキストは分割されません。valueはこのターン開始からではなく、セッション開始から再生されたミリ秒数です。各Interruptの値は 前回のオフセットを上回る必要があります。そうでない場合はINVALID_INTERRUPT_OFFSETで無視されます。 次のオフセットの基準値として、SpeechInterruptedのaudio_played_msを読み取ってください。
{"type":"Configure","speed":1.15}を送信すると、セッション中に速度を変更できます。変更は次のセグメント境界で 適用されます。speedは0.5から1.5まで、0.05刻みで指定します。デフォルトは1.0です。- サーバーは適用された設定を含む
ConfigureSuccess、またはcodeとdescription(失敗が特定の項目に関連する場合はfieldとvalueも含む)を含むConfigureFailureを返し、以前の設定を維持します。 0.45と1.55を指定すると'speed' must be between 0.5 and 1.5が返され、1.07を指定すると'speed' must be provided in increments of 0.05が返されます。ConfigureFailureコードはSPEED_OUT_OF_RANGE、SPEED_INCREMENT_INVALID、SPEED_NOT_SUPPORTED、CONTROL_COMBINATION_INVALID(キュー内のターンに発音制御が残っています。先にそのターンをFlushしてください)、INTERNAL_ERROR(有効な設定をサーバーが適用できなかった場合)です。
- サーバーは適用された設定を含む
expressivityは-2(穏やか)から2(生き生きとした表現)までの整数で指定します。デフォルトは0です。 整数以外の値は指定できません。不正な値はWebSocketへのアップグレード完了前にHTTP 400で拒否されるため、Connectedメッセージは届きません。小数(例:1.5)の場合はEXPRESSIVITY_INCREMENT_INVALID、-2から2の範囲外の値の場合はEXPRESSIVITY_OUT_OF_RANGEが返されます。この機能はベータ版で、 接続ごとに固定されます(Configureでは変更できません)。本番環境で検証されている値は0のみです。- 発音制御はFlux TTS
/v2/speakではEarly Accessです(Aura-2/v1/speakではGAです。Aura RESTのセクションを参照してください)。 テキスト内のエスケープされたJSONオブジェクトとして、ソケットとバッチの両方で指定します。\{"word":"dupilumab","pronounce":"duːˈpɪljuːmæb"\}。- 上限はリクエストあたり500件です。IPAは最大128文字で、元の単語の長さの10倍以下とします。ただし、下限は15文字です。
speedが1.0の場合のみ機能します。ソケットでは、別の速度で開いたセッションに発音を送信するか、Configureで別の速度に設定した後に発音を送信すると、接続がDATA-0002で終了します。バッチでは、 リクエストが400CONTROL_COMBINATION_INVALIDで拒否されます。- IPAが無効でもベストエフォートで適用され、ソケットでは
PRONUNCIATION_WARNINGS警告、バッチではdg-warningsヘッダーで通知されます。 - 構文とIPAのガイダンス:https://developers.deepgram.com/docs/tts-voice-controls
- ポーズ制御の
\{pause:500ms\}はバッチ専用です。- 制限:500~3000 msを100 ms刻みで指定し、リクエストあたり最大8個までです。隣接するポーズの間にはテキストが必要です。
ポーズが含まれる場合、
speedは1.15以下に制限されます(PAUSE_SPEED_CAP_EXCEEDED)。 ポーズは指定した長さから約100 ms以内の精度で挿入されます。 - ソケットでポーズマーカーを指定すると接続が
DATA-0002で終了します。ポーズと発音を組み合わせると、CONTROL_COMBINATION_INVALIDで拒否されます。 - その他のバッチの400コードは
BREAK_OUT_OF_RANGE、BREAK_INCREMENT_INVALID、BREAKS_LIMIT_EXCEEDED、BREAK_SYNTAX_INVALIDです。BREAK_SYNTAX_INVALIDには2つの原因があります。 バックスラッシュなしの単純なマーカー、またはバックスラッシュ付きの構造化マーカーです。 - 使用できる形式は
\{pause:500\}(数値のみの場合はミリ秒)、\{pause:500ms\}、\{pause:1.5s\}、およびエスケープされていない構造化形式の{pause:{duration_ms:500}}です。
- 制限:500~3000 msを100 ms刻みで指定し、リクエストあたり最大8個までです。隣接するポーズの間にはテキストが必要です。
ポーズが含まれる場合、
- 各ターンの
SpeechMetadata.controls_appliedには、pronunciations_applied、breaks_applied、pronunciation_warningsの数が記録されます。バッチでは、レスポンスヘッダーdg-pronunciations-appliedとdg-breaks-appliedが返されます。 - ソケットではデフォルトの
linear16(誤り5を参照)を含め、未加工の音声のみがストリーミングされます。 バッチ専用のパラメーター(container、bit_rate、callback、callback_method、priority)や不明な パラメーターを指定すると、接続が終了します。 - アイドル状態のセッションは60秒後に終了します(
NET-0004)。ターン間にWebSocket Pingを送信してください。 すべてのセッションは1時間後に終了します(NET-0003)。 - バッチ:
POST https://api.deepgram.com/v2/speak?model=flux-haley-enに{"text": "..."}を送信すると、 音声レスポンスが1つ返されます。デフォルトはmp3で、opus、flac、aac、container、bit_rateを指定できます。 インラインポーズを処理できるのは、このトランスポートのみです。 - SDK:すべてのDeepgram SDKにFlux TTSクライアントが含まれています。Python、JavaScript、Javaでは
speak.v2という名前です。.NETにはFluxSpeakRESTClientとFluxSpeakWebSocketClientが含まれています。 Rustではspeak::flux、Goではv3.8.0以降のpkg/client/speak/v2を使用します。Flux TTSの全機能を説明している SDKスキルはRustのみです。PythonスキルにはFluxバッチのセクションが1つ(TextBuilderヘルパー)あります。 JS、Java、Go、.NETのtext-to-speechSDKスキルが扱うのは/v1/speakのみです。そのため、/v2/speakの メッセージ形式はこのスキルを参照してください。
音声
- Aura:英語、スペイン語、ドイツ語、フランス語、オランダ語、イタリア語、日本語では
aura-2-{voice}-{lang}を使用します。また、英語の Aura-1 音声が 12 種類あり、aura-{voice}-enという名前です。5 種類のスペイン語音声は、1 回のリクエスト内で英語とスペイン語を切り替えます:aura-2-aquila-es、aura-2-carina-es、aura-2-diana-es、aura-2-javier-es、aura-2-selena-es。カタログ:https://developers.deepgram.com/docs/tts-models - Flux TTS:英語とその他 41 言語に対応し、2 文字の言語サフィックスを持つ
flux-{voice}-{language}を使用します。地域別のバリエーションは同じサフィックスを共有します。ブラジルポルトガル語とヨーロッパポルトガル語はどちらも-pt、フラマン語は-nl、スイスドイツ語は-de、標準中国語、台湾華語、広東語はすべて-zhです。そのため、カタログから音声名で選択してください。おすすめの英語音声にはflux-haley-en、flux-alexis-en、flux-kit-enがあります。カタログ:https://developers.deepgram.com/docs/flux-tts/voices
料金
テキスト読み上げは、Flux TTS、Aura-2、Aura-1 のいずれも入力テキスト 1,000 文字ごとに課金されます。料金はモデルやプランによって異なり、時間とともに変更されます。https://deepgram.com/pricing で確認してください。記憶に頼って数値を引用しないでください。
よくある間違い
-
認証スキームの誤りです。API キーは
Authorization: Token <key>に指定します。BearerはPOST https://api.deepgram.com/v1/auth/grantで取得する短時間有効な JWT 専用です。キーをBearerで送ると 401 が返されます。 -
モデルエラーの読み違いです。スペルミスを含め、存在しないモデル名の場合は、400 と
{"err_code":"Bad Request","err_msg":"Bad Request: No such model/language/tier combination found."}が返されます。 モデルは存在するものの、プロジェクトで使用できない場合は 403 と{"err_code":"INSUFFICIENT_PERMISSIONS","err_msg":"Project does not have access to the requested model."}が返されます。400 の場合は、上記のカタログでモデル名を確認してください。アクセスを申請するのは 403 の場合だけです。GET https://api.deepgram.com/v1/modelsが返すのは公開カタログであり、キーで利用できるモデルではありません。また、ttsリストには Aura の音声のみが含まれ、flux-*の項目はありません。Flux TTS の音声名は https://developers.deepgram.com/docs/flux-tts/voices で確認してください。 -
音声を JSON として解析することです。どちらのエンドポイントでも、成功時の本文はバイト列です。まずステータスで分岐してください。
-
ファミリーを混同することです。
/v2/speakで Aura 音声を使用した場合も、/v1/speakで Flux TTS 音声を使用した場合も失敗します。また、/v2/speakではmodelの指定がない場合も拒否されます。 -
WebSocket で
mp3を要求することです。どちらのエンドポイントでも、ストリーミングされるのは生の音声データです。圧縮形式の出力には REST を使用してください。 -
Flux TTS がテキストを整えてくれると期待することです。
Speakのテキストはそのまま連結されるため、"Hello world."の後に"How are you?"を指定すると"Hello world.How are you?"になります。応答、ツールの結果、次の応答をつなぐときは、スペースを挿入してください。プレーンテキストを送信してください。SSML は解釈されません。Flux TTS が認識するマークアップは、独自のエスケープされた制御構文のみで、発音指定は両方のトランスポートで、ポーズ指定はバッチでのみ有効です。認識対象の SSML、ElevenLabs、Cartesia のタグは除去され、
SpeakごとにINPUT_MARKUP_STRIPPED警告が 1 回返されます。検出器が認識しないマークアップ(Markdown、HTML、カスタム XML)はそのまま転送され、読み上げられる場合があります。https://developers.deepgram.com/docs/flux-tts/client-messages を参照してください。 -
Voice Agent を api.deepgram.com に接続することです。Voice Agent API の接続先は
wss://agent.deepgram.comで、agent.speak.provider.versionに基づいて TTS ファミリーが選択されます。Flux TTS はv2、Aura はv1です。agent.speakを省略すると、flux-kit-enを使用した Flux TTS になります。- エージェントが受け付けるのは、英語の Flux TTS 音声のみです。現時点では、ほかの 41 言語は
/v2/speak専用です。そのため、英語以外のエージェント音声には Aura-2(v1)の音声か、サードパーティープロバイダーを使用してください。 - エージェント内の速度と
expressivityはagent.speak.providerに指定します。https://developers.deepgram.com/docs/voice-agent-tts-controls を参照してください。 - インラインのポーズマーカーは読み上げられず、エラーも返されないため、これを含むテキストは無音になります。間の調整には句読点と数字の区切りを使用してください。
audio.outputに圧縮エンコーディング(mp3、opus、flac、aac)またはwavなどのコンテナ形式を指定すると、INVALID_SETTINGSが返されます。agent.speakを省略する場合も含め、これらの形式には Aura(v1)の音声を設定してください。
- エージェントが受け付けるのは、英語の Flux TTS 音声のみです。現時点では、ほかの 41 言語は
-
対応していない言語で音声制御を使用することです。Flux TTS の
speed、ポーズ、発音指定が文書化されているのは英語の音声のみです。また、Aura-2 の速度と発音指定は英語とスペイン語のみを対象とします。それ以外の音声では、句読点で速度を調整してください。
別のスキルを使う場合
- すべてのパラメーター、列挙型、メッセージスキーマが必要な場合:
apiスキルのファイルreferences/speak.mdを参照してください。 - 名前のわからないドキュメントページが必要な場合:
docsスキルを使ってください。 - 実行可能なアプリが必要な場合:
startersスキルを使ってください。対応する機能はtext-to-speech(Aura REST)、live-text-to-speech(Aura WebSocket)、flux-tts(node、flask、fastapi、django、java のみ)です。 - 50 行未満のスニペットが必要な場合:
recipesスキルを使ってください。レシピが対応しているのは Aura の/v1/speakのみで、Flux TTS のレシピはまだありません。 - サードパーティのプラットフォームと接続する場合:
examplesスキルを使ってください(現時点では Aura に対応)。Twilio と Flux TTS を使う場合は、deepgram-sdk7.6.0 以降が必要な https://developers.deepgram.com/docs/twilio-and-deepgram-tts に従ってください。 - コーディングツール内でドキュメントを参照したい場合:
setup-mcpスキルを使ってください。 - 1 つの言語で慣用的なコードが必要な場合:SDK リポジトリの
deepgram-{js,python,java,go,rust,dotnet}-text-to-speechスキルを使ってください(npx skills add deepgram/deepgram-python-sdkなど)。Flux TTS の詳細な説明があるのは Rust SDK スキルのみです。Flux TTS セクションの SDK の箇条書きを参照してください。 - Deepgram に 1 つの接続で音声テキスト変換、LLM、TTS を実行させたい場合:
voice-agentスキルとdeepgram-{lang}-voice-agentを使ってください。 - 合成ではなく文字起こしを行う場合:
speech-to-textスキルを使ってください。「Flux」という名前は/v2/listenの音声テキスト変換製品と、この/v2/speakのテキスト音声変換製品の両方を指すことに注意してください。
参照元
すべてのページは Markdown 形式で利用できます(任意の URL に .md を追加してください)。インデックスは https://developers.deepgram.com/llms.txt にあります。
- モデルファミリーとリージョン:https://developers.deepgram.com/docs/tts-models-languages-overview https://developers.deepgram.com/reference/regional-endpoints
- Aura:https://developers.deepgram.com/docs/text-to-speech https://developers.deepgram.com/docs/streaming-text-to-speech https://developers.deepgram.com/docs/tts-models https://developers.deepgram.com/docs/tts-voice-controls https://developers.deepgram.com/docs/tts-encoding https://developers.deepgram.com/docs/tts-media-output-settings https://developers.deepgram.com/docs/tts-ws-flush https://developers.deepgram.com/docs/tts-ws-clear https://developers.deepgram.com/docs/tts-ws-close https://developers.deepgram.com/docs/tts-troubleshooting-websocket-net-and-data-errors https://developers.deepgram.com/docs/text-to-speech-prompting
- Flux TTS:https://developers.deepgram.com/docs/flux-tts/overview https://developers.deepgram.com/docs/flux-tts/feature-overview https://developers.deepgram.com/docs/flux-tts/quickstart https://developers.deepgram.com/docs/flux-tts/batch https://developers.deepgram.com/docs/flux-tts/batch-vs-streaming https://developers.deepgram.com/docs/flux-tts/voices https://developers.deepgram.com/docs/flux-tts/client-messages https://developers.deepgram.com/docs/flux-tts/server-messages https://developers.deepgram.com/docs/flux-tts/state https://developers.deepgram.com/docs/flux-tts/context https://developers.deepgram.com/docs/flux-tts/interrupt-handling https://developers.deepgram.com/docs/flux-tts/migrating https://developers.deepgram.com/docs/flux-tts/voice-agent https://developers.deepgram.com/docs/flux-tts/template-apps https://developers.deepgram.com/docs/tts-expressivity
- API リファレンス:https://developers.deepgram.com/reference/text-to-speech/speak-request https://developers.deepgram.com/reference/text-to-speech/speak-streaming https://developers.deepgram.com/reference/text-to-speech/speak-flux https://developers.deepgram.com/reference/speak/v-2/audio/generate https://developers.deepgram.com/reference/manage/models/list
- 認証、エラー、エージェント、インテグレーション、料金:https://developers.deepgram.com/reference/authentication https://developers.deepgram.com/reference/auth/tokens/grant https://developers.deepgram.com/docs/errors https://developers.deepgram.com/docs/voice-agent-tts-models https://developers.deepgram.com/docs/voice-agent-tts-controls https://developers.deepgram.com/reference/voice-agent/voice-agent https://developers.deepgram.com/docs/twilio-and-deepgram-tts https://deepgram.com/pricing