中国 (北京) リージョンでモデルを使用するには、[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 キーと比較して、一時的な認証トークンは有効期間が短い (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 命令で送信されるテキストは 2,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に設定して SSML サポートを有効にします。次に、continue-task 命令を使用して SSML を含むテキストを送信します。
enable_ssml パラメーターを true に設定して SSML サポートを有効にした後、合成する完全なテキストを 1 回の continue-task 命令で送信する必要があります。複数回にわたる送信はサポートされていません。
インタラクションフロー
クライアントからサーバーに送信されるメッセージは命令と呼ばれます。サーバーは、JSON 形式のイベントとバイナリ音声ストリームの 2 種類のメッセージをクライアントに返します。
以下は、クライアントとサーバー間のインタラクションフローです:
接続の確立:クライアントはサーバーとの WebSocket 接続を確立します。
タスクの開始:
クライアントは run-task 命令を送信してタスクを開始します。
クライアントはサーバーから task-started イベントを受信します。このイベントは、タスクが正常に開始されたことを示し、次のステップに進むことができます。
合成するテキストの送信:
クライアントは、合成するテキストを含む 1 つ以上の continue-task 命令をサーバーに順次送信します。サーバーが完全な文を受信すると、音声ストリームを返します。テキスト長には制限があります。詳細については、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, // 任意。ご利用の Model Studio ワークスペースの ID。
"X-DashScope-DataInspection": "enable"
}命令 (クライアントからサーバーへ)
命令は、クライアントがサーバーにテキストフレームとして JSON 形式で送信するメッセージです。これらの命令は、タスクの開始と終了を制御し、タスクの境界を識別します。
タスクの失敗を避けるため、命令は以下の順序で送信する必要があります:
run-task 命令の送信
音声合成タスクを開始します。
返された
task_idは、後続の continue-task 命令および finish-task 命令で使用する必要があります。
合成するテキストを送信します。
この命令は、サーバーから 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 です。ハイフンでフォーマットすることも (例: 後続の continue-task 命令および finish-task 命令で使用される task_id は、run-task 命令で使用されたものと同じでなければなりません。 |
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] | いいえ | 言語のヒントを提供します。cosyvoice-v3-flash と cosyvoice-v3-plus のみがこの機能をサポートしています。 デフォルト値はありません。このパラメーターは設定されていない場合、効果はありません。 このパラメーターは、音声合成において以下の効果があります:
指定された言語ヒントがテキストの内容と明らかに一致しない場合、例えば中国語のテキストに 注:このパラメーターは配列ですが、現在のバージョンでは最初の要素のみが処理されます。したがって、1 つの値のみを渡してください。 |
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 命令を送信する前に、このイベントを受信する必要があります。そうしないと、タスクは失敗します。
payload の task-started イベントは空です。
例:
{
"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 イベントを返します。
CosyVoice サービスでは、result-generated イベントはプロトコルのために予約されています。リクエスト ID などの情報をカプセル化しており、無視できます。
例:
{
"header": {
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"event": "result-generated",
"attributes": {
"request_uuid": "0a9dba9e-d3a6-45a4-be6d-xxxxxxxxxxxx"
}
},
"payload": {}
}header パラメーター
パラメーター | タイプ | 説明 |
header.event | string | イベントのタイプ。 このイベントでは、値は "result-generated" に固定されます。 |
header.task_id | string | クライアントによって生成された task_id。 |
header.attributes.request_uuid | string | リクエスト ID。 |
payload パラメーターの説明
パラメーター | タイプ | 説明 |
payload.usage.characters | integer | 現在のリクエストでこれまでに課金対象となった文字数。
1 つのタスク内で、 |
3. task-finished イベント:タスクが終了しました
サーバーから task-finished イベントを受信した場合、これはタスクが完了したことを示します。
タスクが終了した後、WebSocket 接続を閉じてプログラムを終了できます。また、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。これを CosyVoice の開発者に提供して、問題を特定できます。 |
payload パラメーター
パラメーター | タイプ | 説明 |
payload.usage.characters | integer | 現在のリクエストでこれまでに課金対象となった文字数。
1 つのタスク内で、 |
payload.output.sentence.index | integer | 文の番号。0 から始まります。 これらのフィールドは、word_timestamp_enabled を true に設定して文字レベルのタイムスタンプが有効になっている場合にのみ返されます。 |
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 API の代わりに WebSocket を使用します。WebSocket を使用すると、サーバーとクライアントの両方がデータを送信できます。これは、リアルタイムの音声合成や認識の進捗をプッシュするなどの機能に必要です。対照的に、RESTful API は HTTP に基づいており、クライアントが開始する一方向のリクエスト/レスポンスモデルのみをサポートしているため、リアルタイムのインタラクションの要件を満たすことができません。
Q:音声合成はテキスト文字数に基づいて課金されます。各合成のテキスト長を表示または取得するにはどうすればよいですか?
サーバーから返される result-generated イベントの payload.usage.characters パラメーターから文字数を取得できます。受信した最後の result-generated イベントの値が最終的なカウントになります。
トラブルシューティング
Q:リクエスト ID を取得するにはどうすればよいですか?
以下の 2 つの方法のいずれかで取得できます:
サーバーが result-generated イベントで返す情報を解析します。
サーバーが task-finished イベントで返す情報を解析します。
Q: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 をご参照ください。