中国 (北京) リージョンのモデルを使用するには、中国 (北京) リージョンの API キーページに移動してください
このトピックでは、WebSocket 接続を使用して CosyVoice 音声合成サービスにアクセスする方法について説明します。
現在、DashScope SDK は Java と Python のみをサポートしています。他のプログラミング言語の場合、WebSocket 接続を介してサービスと直接通信することで、CosyVoice 音声合成アプリケーションを開発できます。
ユーザーガイド:モデルの詳細とモデル選択のガイダンスについては、「リアルタイム音声合成 - 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 命令でのみ送信できます。複数回にわたる送信はサポートされていません。
インタラクションフロー
クライアントからサーバーに送信されるメッセージは命令と呼ばれます。サーバーはクライアントに 2 種類のメッセージを返します:JSON 形式のイベントとバイナリ音声ストリームです。
クライアントとサーバー間のインタラクションフローは次のとおりです:
接続の確立:クライアントはサーバーとの 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, // 任意。Alibaba Cloud 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-v2",
"parameters": {
"text_type": "PlainText",
"voice": "longxiaochun_v2", // 音声
"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 文字の英数字で構成される 32 ビットの汎用一意識別子 (UUID) です。ハイフンを含めることも (例: 後で 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] | いいえ | 言語のヒントを提供します。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 命令をサーバーに送信できます。そうしないと、タスクは失敗します。
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 イベントを返します。
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 | 現在までのリクエストで課金対象となる文字数。
単一のタスクでは、 |
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。問題を特定するために、この ID を CosyVoice の開発者に提供できます。 |
payload パラメーター:
パラメーター | タイプ | 説明 |
payload.usage.characters | integer | 現在のリクエストで使用された課金対象の文字数。タスクでは、 |
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 を取得するにはどうすればよいですか?
リクエスト ID は 2 つの方法で取得できます:
result-generated イベントでサーバーから返される情報を解析します。
サーバーから返される情報について、task-finished イベントを解析します。
Q: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:返された音声ストリームのセグメントが順不同で、再生が乱れるのはなぜですか?
以下の 2 点を確認してください:
同じ合成タスクのrun-task 命令、continue-task 命令、およびfinish-task 命令が同じ
task_idを使用していることを確認してください。非同期操作が、受信した順序とは異なる順序で音声データを書き込んでいないか確認してください。
権限と認証
Q:API キーを CosyVoice 音声合成サービス専用にし、他の Model Studio モデルには使用しないようにしたい (権限の分離)。どうすればよいですか?
ワークスペースを作成し、特定のモデルのみを承認することで、API キーのスコープを制限できます。詳細については、「ワークスペースの管理」をご参照ください。
その他の質問
詳細については、GitHub のQ&Aをご参照ください。