短いテキストの音声合成 API
機能紹介
音声合成は、入力されたテキストを音声のバイナリデータに変換する機能を提供します。
wav、pcm、mp3エンコード形式のデータの出力をサポートしています。
ボイス、感情、話速、イントネーションs、音量の設定をサポートしています。
WebSocket API(ストリーミング)
WebSocketの双方向ストリームを介して、テキストを送信し、音声データを受信することで、合成のリアルタイム性を向上させます。
呼び出し制限
入力したテキストは 必ずUTF-8 エンコードを使っています。
入力したテキストは 1024 バイト(約300漢字)を超えてはいけません。
サービスアドレス
wss://api.voice.dolphin-ai.jp/v1/tts/wsインタラクションフロー

1. 認可
クライアントはサーバーとWebSocketのリンクを確立する時、以下のリクエストヘッダーを設定する必要があります。
| 名前 | タイプ | 必要かどうか | 説明 |
|---|---|---|---|
| Authorization | String | はい | 標準HTTPヘッダーで、認証情報を設定します。形式は標準の Bearer <Token> 形式である必要があります(Bearerの後のスペースをご注意ください)。 |
認可についての操作は、認証と認可をご参照ください。
2. スタートとパラメータ送信
クライアントは音声合成リクエストを送信し、リクエストメッセージ内でパラメータを設定する必要があります。パラメータはJSON形式で送信されます。
送信パラメータ(headerオブジェクト):
| パラメータ | タイプ | 必要かどうか | 説明 |
|---|---|---|---|
| namespace | String | はい | メッセージの属する名前空間:SpeechSynthesizer は音声合成を表します |
| name | String | はい | イベント名:StartSynthesis は開始階段を表します |
送信パラメータ(payloadオブジェクト):
| パラメータ | タイプ | 必要かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| text | String | はい | 合成待ちのテキストの長さの制限は、1024バイト(UTF-8エンコード)です。 | なし |
| lang_type | String | はい | 言語のオプションは、開発ガイド-言語とボイスのサポートをご参照ください。 | なし |
| voice | String | いいえ | ボイスのコードは、開発ガイド-言語とボイスのサポートをご参照ください。 | 日本語:Yuko 英語:Julie 中国語:Xiaohui |
| sample_rate | Integer | いいえ | 音声のサンプリングレートは、8000 / 16000 / 24000を選択できます。 | 24000 |
| format | String | いいえ | 音声エンコードの形式、wav / pcm / mp3 注意:wav はストリーミングをサポートしていません。 | pcm |
| speech_rate | Float | いいえ | 話速、パラメータ範囲 [0.2, 3]、通常は小数点以下1桁で十分です | 1 |
| volume | Float | いいえ | 音量、パラメータ範囲 [0.1, 3]、通常は小数点以下1桁で十分です | 1 |
| pitch_rate | Float | いいえ | イントネーション、パラメータ範囲[0.1, 3]、通常は小数点以下1桁で十分です | 1 |
| emotion | String | いいえ | 感情・スタイル、開発ガイド-言語とボイスのサポート を参照してください | なし |
| silence_duration | Integer | いいえ | 文末の無音時間、パラメータ範囲 [0, 10000]、単位はミリ秒(ms)です | 125 |
| enable_timestamp | Boolean | いいえ | タイムスタンプ関連、trueを渡すと有効になり、元のテキストのタイムスタンプを返すことができます。注意:元のテキストに連続した句読点やスペースは依然として処理されますが、タイムスタンプの連続性には影響しません | false |
送信の例:
{
"header":{
"namespace":"SpeechSynthesizer",
"name":"StartSynthesis"
},
"payload":{
"lang_type":"zh-cmn-Hans-CN",
"voice":"",
"text":"今天是星期三。",
"format":"pcm",
"sample_rate":16000,
"volume":1,
"speech_rate":1,
"pitch_rate":1,
"enable_timestamp":true
}
}レスポンスパラメータ(headerオブジェクト):
| パラメータ | タイプ | 説明 |
|---|---|---|
| namespace | String | メッセージの属する名前空間:SpeechSynthesizer は音声合成を表します |
| name | String | イベント名:SynthesisStarted は開始階段を表します |
| status | String | ステータスコード |
| status_text | String | ステータスコードの説明 |
| app_id | String | アプリケーションID |
| task_id | String | タスクのグローバル一意のID。問題のトラブルシューティングのために、この値を記録してください。 |
| message_id | String | 今回のメッセージのID |
レスポンス例:
{
"header": {
"namespace": "SpeechSynthesizer",
"name": "SynthesisStarted",
"status": "000000",
"status_text": "Success",
"app_id": "33a7d8c6-6cbe-40ff7-95f3-0a89bf6eb1fb",
"task_id": "c43bdfda-6319-49cc-be8d-a89852b104d9",
"message_id": "f0cfbfa3-ed78-400b-9c62-2a904ea48961"
},
"payload": {}3. 合成音声データの受信
サーバーは、合成された音声のバイナリデータ、音声の長さ(SynthesisDurationのイベントを通じて戻る)、タイムスタンプ情報(SynthesisTimestampのイベントを通じて戻る)を継続的に返し始めます。
注意:enable_timestampが有効な場合のみ、音声の長さ、タイムスタンプ情報が返されます。
この段階では、サーバーはこの接続内のすべてのリクエストメッセージを無視します。別の合成リクエストを送信する場合は、新しい接続を確立してください。
音声の長さの情報:
レスポンスパラメータ(headerオブジェクト):
| パラメータ | タイプ | 説明 |
|---|---|---|
| namespace | String | メッセージの属する名前空間:SpeechSynthesizer は音声合成を表します |
| name | String | イベント名:SynthesisDuration は合成の中間段階が開始されたことを示します。 |
| status | String | ステータスコード |
| status_text | String | ステータスコードの説明 |
| app_id | String | アプリケーションID |
| task_id | String | タスクのグローバル一意のID。問題のトラブルシューティングのために、この値を記録してください。 |
| message_id | String | 今回のメッセージのID |
レスポンスパラメータ(payloadオブジェクト):
| パラメータ | タイプ | 説明 |
|---|---|---|
| duration | String | 返される音声の長さ、単位はミリ秒(ms)です。 |
レスポンス例:
{
"header": {
"namespace": "SpeechSynthesizer",
"name": "SynthesisDuration",
"status": "000000",
"status_text": "Success",
"app_id": "33a7d8c6-6cbe-40ff7-95f3-0a89bf6eb1fb",
"task_id": "c43bdfda-0019-35cc-be0d-a85643b104d9",
"message_id": "259e92ca-24f4-4958-9fe1-aa93640fd4dd"
},
"payload": {
"duration": "1305"
}
}タイムスタンプの情報:
レスポンスパラメータ(headerオブジェクト):
| パラメータ | タイプ | 説明 |
|---|---|---|
| namespace | String | メッセージの属する名前空間:SpeechSynthesizer は音声合成を表します |
| name | String | イベント名:SynthesisTimestamp は合成の中間段階が開始されたことを示します。 |
| status | String | ステータスコード |
| status_text | String | ステータスコードの説明 |
| app_id | String | アプリケーションID |
| task_id | String | タスクのグローバル一意のID。問題のトラブルシューティングのために、この値を記録してください。 |
| message_id | String | 今回のメッセージのID |
レスポンスパラメータ(payloadオブジェクト):
| パラメータ | タイプ | 説明 |
|---|---|---|
| timestamp | String | タイムスタンプ情報 |
| ├─words | String | 文字レベルのタイムスタンプ情報 |
| ├─phonemes | String | 音素レベルのタイムスタンプ情報 |
その中で、文字レベルのタイムスタンプ情報 words オブジェクト:
| パラメータ | タイプ | 説明 |
|---|---|---|
| word | String | テキスト |
| start_time | Float | 開始時間、単位は秒 |
| end_time | Float | 終了時間、単位は秒 |
| unit_type | String | タイプ text は普通のテキストを示し、mark は句読点を示します。??はほかにあるかどうかわからないのを表します |
音素レベルのタイムスタンプ情報phonemesオブジェクト:
| パラメータ | タイプ | 説明 |
|---|---|---|
| phone | String | 音素 |
| start_time | Float | 開始時間、単位は秒 |
| end_time | Float | 終了時間、単位は秒 |
レスポンス例:
{
"header": {
"namespace": "SpeechSynthesizer",
"name": "SynthesisTimestamp",
"status": "000000",
"status_text": "Success",
"app_id": "33a7d8c6-0cbe-56ff7-95f3-0a89bf6eb1fb",
"task_id": "c43bdfda-6319-49cc-be8d-a89852b104d9",
"message_id": "e70e5628-be9a-426b-87d3-a2f4527a490a"
},
"payload": {
"timestamp": "{\"words\":[{\"word\":\"今\",\"start_time\":0.02,\"end_time\":0.175,\"unit_type\":\"text\"},{\"word\":\"天\",\"start_time\":0.175,\"end_time\":0.355,\"unit_type\":\"text\"},{\"word\":\"是\",\"start_time\":0.355,\"end_time\":0.55,\"unit_type\":\"text\"},{\"word\":\"星\",\"start_time\":0.55,\"end_time\":0.725,\"unit_type\":\"text\"},{\"word\":\"期\",\"start_time\":0.725,\"end_time\":0.865,\"unit_type\":\"text\"},{\"word\":\"三\",\"start_time\":0.865,\"end_time\":1.145,\"unit_type\":\"text\"},{\"word\":\"。\",\"start_time\":1.145,\"end_time\":1.305,\"unit_type\":\"mark\"}],\"phonemes\":[{\"phone\":\"C0j\",\"start_time\":0.02,\"end_time\":0.085},{\"phone\":\"C0in\",\"start_time\":0.085,\"end_time\":0.175},{\"phone\":\"C0t\",\"start_time\":0.175,\"end_time\":0.25},{\"phone\":\"C0ian\",\"start_time\":0.25,\"end_time\":0.355},{\"phone\":\"C0sh\",\"start_time\":0.355,\"end_time\":0.485},{\"phone\":\"C0iii\",\"start_time\":0.485,\"end_time\":0.55},{\"phone\":\"C0x\",\"start_time\":0.55,\"end_time\":0.655},{\"phone\":\"C0ing\",\"start_time\":0.655,\"end_time\":0.725},{\"phone\":\"C0q\",\"start_time\":0.725,\"end_time\":0.825},{\"phone\":\"C0i\",\"start_time\":0.825,\"end_time\":0.865},{\"phone\":\"C0s\",\"start_time\":0.865,\"end_time\":0.965},{\"phone\":\"C0an\",\"start_time\":0.965,\"end_time\":1.145},{\"phone\":\"。\",\"start_time\":1.145,\"end_time\":1.305}]}"
}
}4. 音声合成完了
音声合成が完了すると、サーバーは合成完了イベント通知を送信し、その後自動的に接続を切断します。
レスポンス例:
{
"header": {
"namespace": "SpeechSynthesizer",
"name": "SynthesisCompleted",
"status": "000000",
"status_text": "Success",
"app_id": "33a7d8c6-0cbe-56ff7-95f3-0a89bf6eb1fb",
"task_id": "c43bdfda-6319-49cc-be8d-a89852b104d9",
"message_id": "031aab78-c7ab-45ac-8f4c-4dfaf45855b6"
},
"payload": {}
}HTTP API(非ストリーミング)
POST リクエストを使用してテキストを送信し、すべての内容の合成が完了した後、一度にすべての音声データを返します。
呼び出し制限
- 入力テキストは UTF-8 エンコードを使用する必要があります。
- 入力テキストは 1024 バイト(約300漢字)を超えてはなりません。
インタラクションフロー
クライアントはテキスト内容を含む HTTP POST メソッドのリクエストをサーバーに送信し、サーバーは合成音声データを含む HTTP レスポンスを返します。
HTTP リクエストライン
| プロトコル | URL | 方法 |
|---|---|---|
| HTTP | https://api.voice.dolphin-ai.jp/v1/tts/ws | POST |
リクエストヘッダー
HTTP リクエストヘッダーは、「キーワード/値」のペアで構成され、各行に1つのペアが含まれます。キーワードと値は英語のコロン : で区切られます。設定内容は以下の通りです:
| 名前 | タイプ | 必要かどうか | 説明 |
|---|---|---|---|
| Content-type | String | はい | "application/json"を指定する必要があり、HTTP bodyのデータがJSON形式であることを表します |
リクエストパラメータ
クライアントが音声合成のリクエストを送信する際、リクエストボディ(body)にパラメータを設定する必要があります。各パラメータの詳細は以下の通りです:
| パラメータ | タイプ | 必要かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| text | String | はい | 合成待ちのテキストの長さの制限は、1024バイト(UTF-8エンコード)です。 | なし |
| lang_type | String | はい | 言語のオプションは、開発ガイド-言語とボイスのサポートをご参照ください。 | なし |
| voice | String | いいえ | ボイスのコードは、開発ガイド-言語とボイスのサポートをご参照ください。 | 日本語Yuko 英語Julie 中国語Xiaohui |
| sample_rate | Integer | いいえ | 音声のサンプリングレートは、8000、16000、24000を選択できます。 | 24000 |
| format | String | いいえ | 音声エンコードの形式、wav / pcm / mp3、 注意:wav はストリーミングをサポートしていません。 | pcm |
| speech_rate | Float | いいえ | 話速、パラメータ範囲 [0.2, 3]、通常は小数点以下1桁で十分です | 1 |
| volume | Float | いいえ | 音量、パラメータ範囲 [0.1, 3]、通常は小数点以下1桁で十分です | 1 |
| pitch_rate | Float | いいえ | イントネーション、パラメータ範囲[0.1, 3]、通常は小数点以下1桁で十分です | 1 |
| emotion | String | いいえ | 感情・スタイル、開発ガイド-言語とボイスのサポート を参照してください。 | なし |
| silence_duration | Integer | いいえ | 文末の無音時間、単位はミリ秒(ms)です | 125 |
| enable_timestamp | Boolean | いいえ | タイムスタンプ関連、trueを渡すと有効になり、元のテキストのタイムスタンプを返すことができます。注意:元のテキストに連続した句読点やスペースは依然として処理されますが、タイムスタンプの連続性には影響しません。 | false |
リクエストボディの例
curl --location --request POST 'https://api.voice.dolphin-ai.jp/v1/tts/ws' \
--header 'Content-Type: application/json' \
--data '{
"text":"今天天气不错。",
"lang_type":"zh-cmn-Hans-CN",
"format":"wav"
}'レスポンス結果
レスポンスの Headers 内の Content-Type フィールドは application/json です。レスポンス結果は Body に含まれます。結果のフィールドは以下の通りです:
| 名前 | タイプ | 説明 |
|---|---|---|
| status | String | ステータスコード |
| message | String | ステータスコードの説明 |
| data | Object | |
| ├─task_id | String | タスクのグローバル一意のID。問題のトラブルシューティングのために、この値を記録してください。 |
| ├─result | String | base64 エンコードされた音声データ |
| ├─duration | String | 音声の長さ(ミリ秒単位),仅当xxxx开启时返回 |
| ├─timestamp | String | タイムスタンプ情報enable_timestamp が有効な場合にのみ返されます |
| ├─├─words | String | 文字レベルのタイムスタンプ情報 |
| ├─├─├─word | String | テキスト |
| ├─├─├─start_time | Float | 開始時間、単位は秒(s) |
| ├─├─├─end_time | Float | 終了時間、単位は秒(s) |
| ├─├─├─unit_type | String | タイプtext は普通のテキストを示し、mark は句読点を示します。 |
| ├─├─phonemes | String | 音素レベルのタイムスタンプ情報 |
| ├─├─├─phone | String | 音素 |
| ├─├─├─start_time | Float | 開始時間、単位は秒(s) |
| ├─├─├─end_time | Float | 終了時間、単位は秒(s) |
成功したレスポンス
body内の status フィールドが 00000 の場合、成功したレスポンスを意味します。data 内の result フィールドは、合成された音声の base64 エンコードデータです。これを base64 デコードすると、音声ファイルが得られます。成功したレスポンスの例:
{
"status": "000000",
"message": "Success",
"data": {
"task_id": "569ba392-f7d4-4f60-8685-b572a821126d",
"duration": "1100",
"result": "//PoxAAAAAAAAAAA...",
"timestamp": "{\"words\":[{\"word\":\"今\",\"start_time\":0.02,\"end_time\":0.17,\"unit_type\":\"text\"},{\"word\":\"天\",\"start_time\":0.17,\"end_time\":0.345,\"unit_type\":\"text\"},{\"word\":\"天\",\"start_time\":0.345,\"end_time\":0.515,\"unit_type\":\"text\"},{\"word\":\"气\",\"start_time\":0.515,\"end_time\":0.66,\"unit_type\":\"text\"},{\"word\":\"不\",\"start_time\":0.66,\"end_time\":0.775,\"unit_type\":\"text\"},{\"word\":\"错\",\"start_time\":0.775,\"end_time\":1.055,\"unit_type\":\"text\"},{\"word\":\"。\",\"start_time\":1.055,\"end_time\":1.095,\"unit_type\":\"mark\"}],\"phonemes\":[{\"phone\":\"C0j\",\"start_time\":0.02,\"end_time\":0.08},{\"phone\":\"C0in\",\"start_time\":0.08,\"end_time\":0.17},{\"phone\":\"C0t\",\"start_time\":0.17,\"end_time\":0.235},{\"phone\":\"C0ian\",\"start_time\":0.235,\"end_time\":0.345},{\"phone\":\"C0t\",\"start_time\":0.345,\"end_time\":0.43},{\"phone\":\"C0ian\",\"start_time\":0.43,\"end_time\":0.515},{\"phone\":\"C0q\",\"start_time\":0.515,\"end_time\":0.625},{\"phone\":\"C0i\",\"start_time\":0.625,\"end_time\":0.66},{\"phone\":\"C0b\",\"start_time\":0.66,\"end_time\":0.73},{\"phone\":\"C0u\",\"start_time\":0.73,\"end_time\":0.775},{\"phone\":\"C0c\",\"start_time\":0.775,\"end_time\":0.9},{\"phone\":\"C0uo\",\"start_time\":0.9,\"end_time\":1.055},{\"phone\":\"。\",\"start_time\":1.055,\"end_time\":1.095}]}"
}
}失敗したレスポンス
body内の status フィールドが 000000 でない場合、すべて失敗したレスポンスを表します。このフィールドをレスポンスの成功・失敗を判断するための基準として利用できます。失敗したレスポンスの例:
{
"status": "300000",
"message": "lang_type Invalid Parameter",
"data": {
"task_id": "a9017448-efa3-4159-9b95-770d81859ed9",
"duration": "",
"result": "",
"timestamp": ""
}
}