中国 (北京) リージョンのモデルを使用するには、中国 (北京) リージョンの API キー ページに移動してください。
このトピックでは、WebSocket 接続を介して CosyVoice 音声合成サービスにアクセスする方法について説明します。
DashScope SDK は現在、Java と Python のみをサポートしています。他のプログラミング言語で CosyVoice 音声合成アプリケーションを開発したい場合は、WebSocket 接続を介してサービスと通信できます。
ユーザーガイド:モデルの詳細とモデル選択のガイダンスについては、「リアルタイム音声合成 - CosyVoice」をご参照ください。
WebSocket は、全二重通信をサポートするネットワークプロトコルです。クライアントとサーバーは、1 回のハンドシェイクで持続的な接続を確立し、双方が互いにデータを積極的にプッシュできます。これにより、リアルタイム性能と効率において大きな利点が得られます。
一般的なプログラミング言語には、すぐに使用できる WebSocket ライブラリやサンプルが多数用意されています。例:
Go:
gorilla/websocketPHP:
RatchetNode.js:
ws
開発を始める前に、WebSocket の基本原則と技術的な詳細をよく理解してください。
前提条件
Model Studio を有効化し、API キーを作成済みであること。セキュリティリスクを防ぐため、API キーをコードにハードコーディングするのではなく、API キーを環境変数としてエクスポートしてください。
サードパーティのアプリケーションやユーザーに一時的なアクセス権限を付与する場合、または機密データへのアクセスや削除などのリスクの高い操作を厳密に制御したい場合は、一時的な認証トークンを使用することを推奨します。
長期的な API キーと比較して、一時的な認証トークンは有効期間が短い (60 秒) ため、より安全です。一時的な呼び出しシナリオに適しており、API キー漏洩のリスクを効果的に低減できます。
一時的なトークンを使用するには、コード内の認証に使用する API キーを一時的な認証トークンに置き換えます。
モデルと料金
モデル | 料金 | 無料クォータ (注) |
cosyvoice-v3-plus | $0.286706/10,000 文字 | 無料クォータなし |
cosyvoice-v3-flash | $0.14335/10,000 文字 | |
cosyvoice-v2 | $0.286706/10,000 文字 |
テキストとフォーマットの制限
テキスト長の制限
1 つの continue-task 命令で送信されるテキストは、20,000 文字を超えてはなりません。複数の continue-task 命令にわたって送信されるテキストの全長は、200,000 文字を超えてはなりません。
文字数カウントルール
漢字 (簡体字、繁体字、日本の漢字、韓国の漢字を含む) は 2 文字としてカウントされます。句読点、アルファベット、数字、日本語の仮名、韓国語のハングルなど、その他のすべての文字は 1 文字としてカウントされます。
SSML タグはテキスト長の計算に含まれません。
例:
"你好"→ 2(你) + 2(好) = 4 文字"中A文123"→ 2(中) + 1(A) + 2(文) + 1(1) + 1(2) + 1(3) = 8 文字"中文。"→ 2(中) + 2(文) + 1(。) = 5 文字"中 文。"→ 2(中) + 1(スペース) + 2(文) + 1(。) = 6 文字"<speak>你好</speak>"→ 2(你) + 2(好) = 4 文字
エンコーディング形式
UTF-8 エンコーディングを使用してください。
数式のサポート
数式解析機能は現在、cosyvoice-v2、cosyvoice-v3-flash、および cosyvoice-v3-plus モデルでのみ利用可能です。この機能は、基本的な算術、代数、幾何学など、小中学校で習う一般的な数式をサポートしています。
「LaTeX 数式から音声へ」をご参照ください。
SSML のサポート
音声合成マークアップ言語 (SSML) 機能は現在、cosyvoice-v3-flash、cosyvoice-v3-plus、および cosyvoice-v2 モデルのクローン音声、および 音声リストでサポートされていると示されているシステム音声でのみ利用可能です。以下の条件を満たす必要があります:
この機能を使用するには:
run-task 命令を送信する際に、
enable_ssmlパラメーターをtrueに設定します。continue-task 命令を使用して、SSML を含むテキストを送信します。
enable_ssml パラメーターを true に設定して SSML サポートを有効にした場合、合成するテキスト全体を 1 回の continue-task 命令で送信する必要があります。テキストを複数回に分けて送信することはできません。
インタラクションフロー
クライアントはサーバーに 命令 と呼ばれるメッセージを送信します。サーバーはクライアントに 2 種類のメッセージを返します:JSON 形式の イベント とバイナリの音声ストリームです。
クライアントとサーバー間のインタラクションフローは次のとおりです:
接続の確立:クライアントはサーバーとの WebSocket 接続を確立します。
タスクの開始:
クライアントは run-task 命令 を送信してタスクを開始します。
サーバーは task-started イベント を返します。これはタスクが正常に開始されたことを示し、次のステップに進むことができます。
合成用テキストの送信:
クライアントは、合成するテキストを 1 つまたは複数の連続した continue-task 命令 でサーバーに送信します。サーバーが完全な文を受信すると、result-generated イベント と音声ストリームを返します。テキスト長には制限があります。詳細については、continue-task 命令 の
textフィールドの説明をご参照ください。説明continue-task 命令 を複数回送信して、テキストのセグメントを順番に送信できます。サーバーはテキストのセグメントを受信し、自動的に文に分割します:
サーバーは完全な文を即座に合成し、対応する音声をクライアントに送信します。
サーバーは不完全な文をキャッシュし、完全になった後にのみ合成します。不完全な文に対しては音声は返されません。
finish-task 命令 を送信すると、サーバーはキャッシュされているすべてのコンテンツを強制的に合成します。
サーバーにタスクの終了を通知:
すべてのテキストを送信した後、クライアントはサーバーに finish-task 命令 を送信し、音声ストリームの受信を続けます。注:このステップをスキップしないでください。スキップすると、完全な音声ストリームを受信できない場合があります。
タスクの終了:
クライアントはサーバーから task-finished イベント を受信し、タスクの終了を示します。
接続の切断:クライアントは WebSocket 接続を切断します。
URL
固定の WebSocket URL:
wss://dashscope.aliyuncs.com/api-ws/v1/inferenceヘッダー
リクエストヘッダーに次の情報を追加します:
{
"Authorization": "bearer <your_dashscope_api_key>", // 必須。<your_dashscope_api_key> をご自身の API キーに置き換えてください。
"user-agent": "your_platform_info", // 任意。
"X-DashScope-WorkSpace": workspace, // 任意。Alibaba Cloud Model Studio ワークスペースの ID。
"X-DashScope-DataInspection": "enable"
}命令 (クライアント → サーバー)
命令は、クライアントがサーバーに送信するメッセージです。これらの命令は JSON 形式で、タスクの開始と終了、およびタスクの境界を識別するためにテキストフレームとして送信されます。
命令は次の順序で送信する必要があります。そうしないと、タスクが失敗する可能性があります:
送信 run-task 命令
音声合成タスクを開始します。
返される
task_idは、後続の continue-task および finish-task 命令に必要です。同じタスク内のすべての命令で同じ task_id を使用する必要があります。
合成するテキストを送信します。
この命令は、サーバーから task-started イベント を受信した後にのみ送信できます。
音声合成タスクを終了します。
この命令は、すべての continue-task 命令を送信した後に送信する必要があります。
1. run-task 命令:タスクの開始
音声合成タスクを開始します。この命令で、音声やサンプルレートなどのリクエストパラメーターを設定します。
送信タイミング:WebSocket 接続が確立された後。
合成するテキストを送信しない:トラブルシューティングを簡素化するため、この命令にテキストを含めないでください。
例:
{
"header": {
"action": "run-task",
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx", // ランダムな UUID
"streaming": "duplex"
},
"payload": {
"task_group": "audio",
"task": "tts",
"function": "SpeechSynthesizer",
"model": "cosyvoice-v3-flash",
"parameters": {
"text_type": "PlainText",
"voice": "longanyang", // 音声
"format": "mp3", // 音声フォーマット
"sample_rate": 22050, // サンプルレート
"volume": 50, // 音量
"rate": 1, // 話速
"pitch": 1 // ピッチ
},
"input": {// input フィールドは省略できません。省略するとエラーが発生します。
}
}
}header パラメーター:
パラメーター | 型 | 必須 | 説明 |
header.action | string | はい | 命令のタイプ。 この命令では、値は "run-task" に固定されます。 |
header.task_id | string | はい | 現在のタスクの ID。 32 ビットの汎用一意識別子 (UUID) で、ランダムに生成された 32 文字の英数字で構成されます。ハイフンを含んでも ( 後続の continue-task 命令 と finish-task 命令 を送信する際には、run-task 命令で使用したのと同じ task_id を使用する必要があります。 |
header.streaming | string | はい | 固定文字列:"duplex" |
payload パラメーター:
パラメーター | 型 | 必須 | 説明 |
payload.task_group | string | はい | 固定文字列:"audio"。 |
payload.task | string | はい | 固定文字列:"tts"。 |
payload.function | string | はい | 固定文字列:"SpeechSynthesizer"。 |
payload.model | string | はい | 音声合成モデル。 異なるモデルには対応する音声が必要です:
|
payload.input | object | はい |
|
payload.parameters | |||
text_type | string | はい | 固定文字列:"PlainText"。 |
voice | string | はい | 音声合成に使用する音声。 システム音声とクローン音声がサポートされています:
|
format | string | いいえ | 音声エンコーディング形式。 サポートされているフォーマットは pcm、wav、mp3 (デフォルト)、および opus です。 音声フォーマットが opus の場合、 |
sample_rate | integer | いいえ | 音声サンプリングレート (Hz)。 デフォルト値:22050。 有効な値:8000、16000、22050、24000、44100、48000。 説明 デフォルトのサンプルレートは、現在の音声に最適なレートです。デフォルトでは、出力はこのサンプルレートを使用します。ダウンサンプリングとアップサンプリングもサポートされています。 |
volume | integer | いいえ | 音量。 デフォルト値:50。 値の範囲:[0, 100]。値 50 は標準の音量です。音量はこの値と線形の関係にあります。0 はミュート、100 は最大音量です。 |
rate | float | いいえ | 話速。 デフォルト値:1.0。 値の範囲:[0.5, 2.0]。値 1.0 は標準の話速です。1.0 未満の値は話速を遅くし、1.0 より大きい値は話速を速くします。 |
pitch | float | いいえ | ピッチ。この値はピッチ調整の乗数です。この値と知覚されるピッチの関係は、厳密に線形または対数ではありません。さまざまな値を試して最適なものを見つけてください。 デフォルト値:1.0。 値の範囲:[0.5, 2.0]。値 1.0 は音声の自然なピッチです。1.0 より大きい値はピッチを高くし、1.0 未満の値はピッチを低くします。 |
enable_ssml | boolean | いいえ | SSML 機能を有効にするかどうかを指定します。 このパラメーターを |
bit_rate | int | いいえ | 音声ビットレート (kbps)。音声フォーマットが Opus の場合、 デフォルト値:32。 値の範囲:[6, 510]。 |
word_timestamp_enabled | boolean | いいえ | 文字レベルのタイムスタンプを有効にするかどうかを指定します。 デフォルト値:false。
この機能は、cosyvoice-v3-flash、cosyvoice-v3-plus、および cosyvoice-v2 モデルのクローン音声、および 音声リストでサポートされているとマークされたシステム音声でのみ利用可能です。 |
seed | int | いいえ | 生成中に使用される乱数シードで、合成効果を変化させます。モデルのバージョン、テキスト、音声、その他のパラメーターが同じ場合、同じシードを使用すると同じ合成結果が再現されます。 デフォルト値:0。 値の範囲:[0, 65535]。 |
language_hints | array[string] | いいえ | 音声合成のターゲット言語を指定して、合成効果を向上させます。 数字、略語、記号の発音が期待どおりでない場合や、中国語以外の言語の合成効果が期待に沿わない場合に使用します。 有効な値:
注:このパラメーターは配列ですが、現在のバージョンでは最初の要素のみが処理されます。したがって、1 つの値のみを渡す必要があります。 重要 このパラメーターは、音声合成のターゲット言語を指定します。この設定は、音声クローンに使用されるサンプル音声の言語とは無関係です。音声クローンタスクのソース言語を設定するには、「CosyVoice 音声クローン API」をご参照ください。 |
instruction | string | いいえ | 命令の設定:この機能は、cosyvoice-v3-flash および cosyvoice-v3-plus モデルのクローン音声、および 音声リストでサポートされているとマークされたシステム音声でのみ利用可能です。 デフォルト値はありません。このパラメーターが設定されていない場合、効果はありません。 音声合成には次の効果があります:
|
enable_aigc_tag | boolean | いいえ | 生成された音声に不可視の AIGC 識別子を追加するかどうかを指定します。true に設定すると、サポートされているフォーマット (WAV、MP3、Opus) の音声に不可視の識別子が埋め込まれます。 デフォルト値:false。 この機能は、cosyvoice-v3-flash、cosyvoice-v3-plus、および cosyvoice-v2 モデルでのみ利用可能です。 |
aigc_propagator | string | いいえ | 不可視の AIGC 識別子の デフォルト値:Alibaba Cloud UID。 この機能は、cosyvoice-v3-flash、cosyvoice-v3-plus、および cosyvoice-v2 モデルでのみ利用可能です。 |
aigc_propagate_id | string | いいえ | 不可視の AIGC 識別子の デフォルト値:現在の音声合成リクエストのリクエスト ID。 この機能は、cosyvoice-v3-flash、cosyvoice-v3-plus、および cosyvoice-v2 モデルでのみ利用可能です。 |
2. continue-task 命令
この命令は、合成するテキストを送信します。
テキスト全体を 1 回の continue-task 命令で送信するか、テキストをセグメント化して複数の continue-task 命令で順番に送信します。
送信タイミング:task-started イベント を受信した後にこの命令を送信します。
テキストセグメントの送信間隔は 23 秒を超えてはなりません。超えた場合、「request timeout after 23 seconds」例外がトリガーされます。
送信するテキストがこれ以上ない場合は、finish-task 命令を送信してタスクを終了します。
サーバー側では 23 秒のタイムアウトメカニズムが適用され、クライアント側で変更することはできません。
例:
{
"header": {
"action": "continue-task",
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx", // ランダムな UUID
"streaming": "duplex"
},
"payload": {
"input": {
"text": "ベッドの前の月光、地面の霜だろうか?"
}
}
}header パラメーター:
パラメーター | 型 | 必須 | 説明 |
header.action | string | はい | 命令のタイプ。 この命令では、値は "continue-task" に固定されます。 |
header.task_id | string | はい | 現在のタスクの ID。 値は、run-task 命令 を送信する際に使用した task_id と一致する必要があります。 |
header.streaming | string | はい | 固定文字列:"duplex" |
payload パラメーター:
パラメーター | 型 | 必須 | 説明 |
input.text | string | はい | 合成するテキスト。 |
3. finish-task 命令:タスクの終了
音声合成タスクを終了します。
この命令を送信する必要があります。そうしないと、合成された音声が不完全になる可能性があります。
この命令を送信すると、サーバーは残りのテキストを音声に変換します。合成が完了すると、サーバーはクライアントに task-finished イベントを返します。
送信タイミング:すべての continue-task 命令を送信した後にこの命令を送信します。
例:
{
"header": {
"action": "finish-task",
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"streaming": "duplex"
},
"payload": {
"input": {}//input フィールドは省略できません。省略するとエラーが発生します。
}
}header パラメーター:
パラメーター | 型 | 必須 | 説明 |
header.action | string | はい | 命令のタイプ。 この命令では、値は "finish-task" に固定されます。 |
header.task_id | string | はい | 現在のタスクの ID。 この値は、run-task 命令 を送信する際に使用した task_id と同じでなければなりません。 |
header.streaming | string | はい | 固定文字列:"duplex" |
payload パラメーター:
パラメーター | 型 | 必須 | 説明 |
payload.input | object | はい | 固定フォーマット:{}。 |
イベント (サーバー → クライアント)
イベントは、サーバーからクライアントに送信されるメッセージです。これらのメッセージは JSON 形式で、さまざまな処理段階を示します。
サーバーからクライアントに送信されるバイナリ音声は、どのイベントにも含まれず、別途受信する必要があります。
1. task-started イベント:タスクの開始
task-started イベントは、タスクが正常に開始されたことを示します。このイベントを受信してから、continue-task 命令 または finish-task 命令 をサーバーに送信する必要があります。そうしないと、タスクは失敗します。
task-started イベントの payload は空です。
例:
{
"header": {
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"event": "task-started",
"attributes": {}
},
"payload": {}
}header パラメーター:
パラメーター | 型 | 説明 |
header.event | string | イベントのタイプ。 このイベントでは、値は "task-started" に固定されます。 |
header.task_id | string | クライアントによって生成された task_id。 |
2. result-generated イベント
クライアントが continue-task 命令 と finish-task 命令 を送信した後、サーバーは継続的に result-generated イベントを返します。
ユーザーが音声データと対応するテキストコンテンツを関連付けられるように、サーバーは音声データを返すと同時に、result-generated イベントで文のメタデータを返します。サーバーはユーザーの入力テキストを自動的にセグメント化します。各文の合成プロセスには、次の 3 つのサブイベントが含まれます:
sentence-begin:文の開始を示し、合成される文のテキストコンテンツを返します。sentence-synthesis:音声データブロックを示します。このイベントの直後に、音声データフレームが WebSocket バイナリチャネルを介して送信されます。1 つの文の合成中に複数の
sentence-synthesisイベントが生成され、それぞれが音声データブロックに対応します。クライアントはこれらの音声データブロックを順番に受信し、同じファイルに追加モードで書き込む必要があります。
sentence-synthesisイベントと後続の音声データフレームは 1 対 1 で対応しており、ずれが生じないようになっています。
sentence-end:文の終了を示し、文のテキストコンテンツと課金対象文字の累計数を返します。
サブイベントのタイプは、payload.output.type フィールドで示されます。
例:
sentence-begin
{
"header": {
"task_id": "3f2d5c86-0550-45c0-801f-xxxxxxxxxx",
"event": "result-generated",
"attributes": {}
},
"payload": {
"output": {
"sentence": {
"index": 0,
"words": []
},
"type": "sentence-begin",
"original_text": "ベッドの前の月光、"
}
}
}sentence-synthesis
{
"header": {
"task_id": "3f2d5c86-0550-45c0-801f-xxxxxxxxxx",
"event": "result-generated",
"attributes": {}
},
"payload": {
"output": {
"sentence": {
"index": 0,
"words": []
},
"type": "sentence-synthesis"
}
}
}sentence-end
{
"header": {
"task_id": "3f2d5c86-0550-45c0-801f-xxxxxxxxxx",
"event": "result-generated",
"attributes": {}
},
"payload": {
"output": {
"sentence": {
"index": 0,
"words": []
},
"type": "sentence-end",
"original_text": "ベッドの前の月光、"
},
"usage": {
"characters": 11
}
}
}header パラメーター:
パラメーター | 型 | 説明 |
header.event | string | イベントのタイプ。 このイベントでは、値は "result-generated" に固定されます。 |
header.task_id | string | クライアントによって生成された task_id。 |
header.attributes | object | 追加のプロパティ。通常は null オブジェクトです。 |
payload パラメーター:
パラメーター | 型 | 説明 |
payload.output.type | string | サブイベントのタイプ。 有効な値:
完全なイベントフロー 合成される各文について、サーバーは次の順序でイベントを返します:
|
payload.output.sentence.index | integer | 文番号。0 から始まります。 |
payload.output.sentence.words | array | 単語レベルの情報の配列。通常は空の配列です。 |
payload.output.original_text | string | ユーザーの入力テキストをセグメント化した後の文の内容。最後の文にはこのフィールドがない場合があります。 |
payload.usage.characters | integer | 現在のリクエストの課金対象文字の累計数。
1 つのタスク内で、 |
3. task-finished イベント:タスクの完了
サーバーからの task-finished イベントは、タスクが完了したことを示します。
タスクが完了した後、WebSocket 接続を閉じてプログラムを終了するか、接続を再利用して run-task 命令 を再送信して次のタスクを開始することができます。詳細については、「接続オーバーヘッドと再利用」をご参照ください。
例:
{
"header": {
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"event": "task-finished",
"attributes": {
"request_uuid": "0a9dba9e-d3a6-45a4-be6d-xxxxxxxxxxxx"
}
},
"payload": {
"output": {
"sentence": {
"words": []
}
},
"usage": {
"characters": 13
}
}
}header パラメーター:
パラメーター | 型 | 説明 |
header.event | string | イベントのタイプ。 このイベントでは、値は "task-finished" に固定されます。 |
header.task_id | string | クライアントによって生成された task_id。 |
header.attributes.request_uuid | string | リクエスト ID。この ID を CosyVoice の開発者に提供することで、問題の特定に役立ちます。 |
payload パラメーター:
パラメーター | 型 | 説明 |
payload.usage.characters | integer | 現在までのリクエストにおける課金対象文字数。
1 つのタスク内で、 |
payload.output.sentence.index | integer | 文番号。0 から始まります。 このフィールドおよび以降のフィールドでは、`word_timestamp_enabled` を使用して単語レベルのタイムスタンプを有効にする必要があります。 |
payload.output.sentence.words[k] | ||
text | string | 文字のテキスト。 |
begin_index | integer | 文中の文字の開始インデックス。0 から始まります。 |
end_index | integer | 文中の文字の終了インデックス。1 から始まります。 |
begin_time | integer | 文字に対応する音声の開始タイムスタンプ (ミリ秒)。 |
end_time | integer | 文字に対応する音声の終了タイムスタンプ (ミリ秒)。 |
`word_timestamp_enabled` を使用して単語レベルのタイムスタンプを有効にすると、応答にタイムスタンプ情報が返されます。以下はその例です:
4. task-failed イベント:タスクの失敗
task-failed イベントは、タスクが失敗したことを示します。この場合、WebSocket 接続を閉じてエラーを処理する必要があります。エラーメッセージを分析して、プログラミング上の問題を特定し、修正することができます。
サンプル文:
{
"header": {
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"event": "task-failed",
"error_code": "InvalidParameter",
"error_message": "[tts:]Engine return error code: 418",
"attributes": {}
},
"payload": {}
}header パラメーター:
パラメーター | 型 | 説明 |
header.event | string | イベントのタイプ。 このイベントでは、値は "task-failed" に固定されます。 |
header.task_id | string | クライアントによって生成された task_id。 |
header.error_code | string | エラータイプの記述。 |
header.error_message | string | エラーの具体的な理由。 |
接続オーバーヘッドと再利用
WebSocket サービスは、リソース利用率を向上させ、接続確立のオーバーヘッドを避けるために、接続の再利用をサポートしています。
サーバーがクライアントから run-task 命令 を受信すると、新しいタスクを開始します。クライアントは次に finish-task 命令 を送信し、サーバーはタスク完了時に task-finished イベント を返します。タスクが完了した後、WebSocket 接続は再利用可能になり、クライアントは run-task 命令 を再度送信して次のタスクを開始できます。
再利用された接続内の異なるタスクは、異なる `task_id` を使用する必要があります。
実行中にタスクが失敗した場合、サービスは task-failed イベント を返し、接続を閉じます。接続は再利用できません。
タスクが完了してから 60 秒間新しいタスクがない場合、接続はタイムアウトし、自動的に切断されます。
サンプルコード
サンプルコードは、サービスを実行するための基本的な実装を提供します。特定のビジネスシナリオに合わせてコードを開発する必要があります。
WebSocket クライアントコードを作成する際には、通常、メッセージを同時に送受信するために非同期プログラミングが使用されます。プログラムは次の手順に従って作成できます:
エラーコード
トラブルシューティング情報については、「エラーメッセージ」をご参照ください。
よくある質問
機能/課金/レート制限
Q:不正確な発音を修正するにはどうすればよいですか?
SSML を使用して、音声合成の出力をカスタマイズできます。
Q:なぜ HTTP/HTTPS の代わりに WebSocket プロトコルを使用するのですか?なぜ RESTful API を提供しないのですか?
音声サービスは、全二重通信が必要なため、HTTP、HTTPS、または RESTful の代わりに WebSocket を使用します。WebSocket を使用すると、サーバーとクライアントが双方向でデータを積極的に送信できるため、リアルタイムの音声合成や認識の進捗をプッシュするなどの機能に必要です。対照的に、HTTP に基づく RESTful API は、クライアントが開始する一方向のリクエスト-レスポンスモデルのみをサポートし、リアルタイムのインタラクション要件を満たすことができません。
Q:音声合成はテキスト文字数に基づいて課金されます。各合成のテキスト長を確認または取得するにはどうすればよいですか?
サーバーから返される result-generated イベント の payload.usage.characters パラメーターから文字数を取得できます。受信した最後の result-generated イベントのカウントを使用するようにしてください。
トラブルシューティング
Q:リクエスト ID を取得するにはどうすればよいですか?
次の 2 つの方法のいずれかで取得できます:
サーバーから返される result-generated イベント を解析します。
サーバー側から返される task-finished イベント を解析します。
Q:なぜ SSML 機能が失敗するのですか?
次の手順に従って問題をトラブルシューティングしてください:
使用量が指定された 制限と制約 の範囲内であることを確認してください。
呼び出しが正しく行われていることを確認してください。詳細については、「SSML マークアップ言語のサポート」をご参照ください。
合成するテキストがプレーンテキスト形式であり、フォーマット要件を満たしていることを確認してください。詳細については、「SSML マークアップ言語の概要」をご参照ください。
Q:なぜ音声が再生できないのですか?
次のシナリオに基づいてこの問題をトラブルシューティングしてください:
オーディオは、.mp3 ファイルなどの完全なファイルとして保存されます。
音声フォーマットの一貫性:リクエストパラメーターで指定された音声フォーマットがファイル拡張子と一致していることを確認してください。例えば、リクエストパラメーターで音声フォーマットが WAV に設定されているのに、ファイルの拡張子が .mp3 である場合、再生が失敗する可能性があります。
プレーヤーの互換性:ご使用のプレーヤーが音声ファイルのフォーマットとサンプルレートをサポートしていることを確認してください。例えば、一部のプレーヤーは高いサンプルレートや特定の音声エンコーディングをサポートしていない場合があります。
音声がストリーミングモードで再生される場合。
音声ストリームを完全なファイルとして保存し、再生を試みてください。ファイルの再生に失敗した場合は、最初のシナリオのトラブルシューティング手順をご参照ください。
ファイルが正しく再生される場合は、ストリーミング再生の実装に問題がある可能性があります。ご使用のプレーヤーがストリーミング再生をサポートしていることを確認してください。
ストリーミング再生をサポートする一般的なツールとライブラリには、ffmpeg、pyaudio (Python)、AudioFormat (Java)、MediaSource (JavaScript) などがあります。
Q:なぜ音声再生が途切れるのですか?
次のシナリオに基づいてこの問題をトラブルシューティングしてください:
テキスト送信速度の確認: テキストの送信間隔が妥当であることを確認してください。前のセグメントの音声再生が終了した後に、次のテキストセグメントの送信が遅れないようにしてください。
コールバック関数のパフォーマンスの確認:
コールバック関数に、ブロックを引き起こす可能性のある過剰なビジネスロジックが含まれていないか確認してください。
コールバック関数は WebSocket スレッドで実行されます。このスレッドがブロックされると、WebSocket がネットワークパケットを受信する能力が妨げられ、音声の途切れが発生する可能性があります。
WebSocket スレッドのブロックを避けるために、音声データを別の音声バッファーに書き込み、別のスレッドで読み取って処理してください。
ネットワークの安定性の確認: ネットワーク接続が安定していることを確認し、ネットワークの変動による音声伝送の中断や遅延を防いでください。
Q:なぜ音声合成が遅いのですか (合成時間が長い)?
次のトラブルシューティング手順を実行してください:
入力間隔の確認
ストリーミング音声合成を使用している場合は、テキストの送信間隔が長すぎないか確認してください。例えば、次のセグメントを送信する前に数秒の遅延があると、合計合成時間が増加します。
パフォーマンスメトリクスの分析
最初のパケットの遅延:通常は約 500 ms です。
リアルタイム係数 (RTF):合計合成時間 / 音声の長さで計算されます。RTF は通常 1.0 未満です。
Q:合成された音声の発音が間違っている場合、どうすればよいですか?
SSML の <phoneme> タグ を使用して、正しい発音を指定してください。
Q:なぜ音声が返されないのですか?なぜテキストの末尾が音声に変換されないのですか?(合成音声の欠落)
finish-task 命令 を送信したことを確認してください。音声合成中、サーバー側は合成を開始する前に一定量のテキストをキャッシュします。finish-task 命令 を送信しないと、キャッシュに残っているテキストが合成されない可能性があります。
Q:なぜ返される音声ストリームの順序が正しくなく、再生が乱れるのですか?
次の点を確認してトラブルシューティングしてください:
同じ合成タスクの run-task 命令、continue-task 命令、および finish-task 命令 が同じ
task_idを使用していることを確認してください。非同期操作が原因で音声データが順序不同に書き込まれていないか確認してください。
権限と認証
Q:API キーを CosyVoice 音声合成サービス専用にし、他の Model Studio モデルには使用させたくありません (権限の分離)。どうすればよいですか?
ワークスペースを作成し、特定のモデルのみを承認することで、API キーの範囲を制限できます。「ワークスペースの管理」をご参照ください。
その他の質問
GitHub の Q&A をご参照ください。