Logo
短いテキストの音声合成

短いテキストの音声合成 API

機能紹介

音声合成は、入力されたテキストを音声のバイナリデータに変換する機能を提供します。

wav、pcm、mp3エンコード形式のデータの出力をサポートしています。

ボイス、感情、話速、イントネーションs、音量の設定をサポートしています。

WebSocket API(ストリーミング)

WebSocketの双方向ストリームを介して、テキストを送信し、音声データを受信することで、合成のリアルタイム性を向上させます。

呼び出し制限

入力したテキストは 必ずUTF-8 エンコードを使っています。

入力したテキストは 1024 バイト(約300漢字)を超えてはいけません。

サービスアドレス

wss://api.voice.dolphin-ai.jp/v1/tts/ws

インタラクションフロー

tts_jp.jpg

1. 認可

クライアントはサーバーとWebSocketのリンクを確立する時、以下のリクエストヘッダーを設定する必要があります。

名前タイプ必要かどうか説明
AuthorizationStringはい標準HTTPヘッダーで、認証情報を設定します。形式は標準の Bearer <Token> 形式である必要があります(Bearerの後のスペースをご注意ください)。

認可についての操作は、認証と認可をご参照ください。

2. スタートとパラメータ送信

クライアントは音声合成リクエストを送信し、リクエストメッセージ内でパラメータを設定する必要があります。パラメータはJSON形式で送信されます。

送信パラメータ(headerオブジェクト):

パラメータタイプ必要かどうか説明
namespaceStringはいメッセージの属する名前空間:SpeechSynthesizer は音声合成を表します
nameStringはいイベント名:StartSynthesis は開始階段を表します

送信パラメータ(payloadオブジェクト):

パラメータタイプ必要かどうか説明デフォルト値
textStringはい合成待ちのテキストの長さの制限は、1024バイト(UTF-8エンコード)です。なし
lang_typeStringはい言語のオプションは、開発ガイド-言語とボイスのサポートをご参照ください。なし
voiceStringいいえボイスのコードは、開発ガイド-言語とボイスのサポートをご参照ください。日本語:Yuko
英語:Julie
中国語:Xiaohui
sample_rateIntegerいいえ音声のサンプリングレートは、8000 / 16000 / 24000を選択できます。24000
formatStringいいえ音声エンコードの形式、wav / pcm / mp3
注意:wav はストリーミングをサポートしていません。
pcm
speech_rateFloatいいえ話速、パラメータ範囲 [0.2, 3]、通常は小数点以下1桁で十分です1
volumeFloatいいえ音量、パラメータ範囲 [0.1, 3]、通常は小数点以下1桁で十分です1
pitch_rateFloatいいえイントネーション、パラメータ範囲[0.1, 3]、通常は小数点以下1桁で十分です1
emotionStringいいえ感情・スタイル、開発ガイド-言語とボイスのサポート を参照してくださいなし
silence_durationIntegerいいえ文末の無音時間、パラメータ範囲 [0, 10000]、単位はミリ秒(ms)です125
enable_timestampBooleanいいえタイムスタンプ関連、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オブジェクト):

パラメータタイプ説明
namespaceStringメッセージの属する名前空間:SpeechSynthesizer は音声合成を表します
nameStringイベント名:SynthesisStarted は開始階段を表します
statusStringステータスコード
status_textStringステータスコードの説明
app_idStringアプリケーションID
task_idStringタスクのグローバル一意のID。問題のトラブルシューティングのために、この値を記録してください。
message_idString今回のメッセージの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オブジェクト):

パラメータタイプ説明
namespaceStringメッセージの属する名前空間:SpeechSynthesizer は音声合成を表します
nameStringイベント名:SynthesisDuration は合成の中間段階が開始されたことを示します。
statusStringステータスコード
status_textStringステータスコードの説明
app_idStringアプリケーションID
task_idStringタスクのグローバル一意のID。問題のトラブルシューティングのために、この値を記録してください。
message_idString今回のメッセージのID

レスポンスパラメータ(payloadオブジェクト):

パラメータタイプ説明
durationString返される音声の長さ、単位はミリ秒(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オブジェクト):

パラメータタイプ説明
namespaceStringメッセージの属する名前空間:SpeechSynthesizer は音声合成を表します
nameStringイベント名:SynthesisTimestamp は合成の中間段階が開始されたことを示します。
statusStringステータスコード
status_textStringステータスコードの説明
app_idStringアプリケーションID
task_idStringタスクのグローバル一意のID。問題のトラブルシューティングのために、この値を記録してください。
message_idString今回のメッセージのID

レスポンスパラメータ(payloadオブジェクト):

パラメータタイプ説明
timestampStringタイムスタンプ情報
├─wordsString文字レベルのタイムスタンプ情報
├─phonemesString音素レベルのタイムスタンプ情報

その中で、文字レベルのタイムスタンプ情報 words オブジェクト:

パラメータタイプ説明
wordStringテキスト
start_timeFloat開始時間、単位は秒
end_timeFloat終了時間、単位は秒
unit_typeStringタイプ
text は普通のテキストを示し、mark は句読点を示します。??はほかにあるかどうかわからないのを表します

音素レベルのタイムスタンプ情報phonemesオブジェクト:

パラメータタイプ説明
phoneString音素
start_timeFloat開始時間、単位は秒
end_timeFloat終了時間、単位は秒

レスポンス例:

{
    "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方法
HTTPhttps://api.voice.dolphin-ai.jp/v1/tts/wsPOST

リクエストヘッダー

HTTP リクエストヘッダーは、「キーワード/値」のペアで構成され、各行に1つのペアが含まれます。キーワードと値は英語のコロン : で区切られます。設定内容は以下の通りです:

名前タイプ必要かどうか説明
Content-typeStringはい"application/json"を指定する必要があり、HTTP bodyのデータがJSON形式であることを表します

リクエストパラメータ

クライアントが音声合成のリクエストを送信する際、リクエストボディ(body)にパラメータを設定する必要があります。各パラメータの詳細は以下の通りです:

パラメータタイプ必要かどうか説明デフォルト値
textStringはい合成待ちのテキストの長さの制限は、1024バイト(UTF-8エンコード)です。なし
lang_typeStringはい言語のオプションは、開発ガイド-言語とボイスのサポートをご参照ください。なし
voiceStringいいえボイスのコードは、開発ガイド-言語とボイスのサポートをご参照ください。日本語Yuko
英語Julie
中国語Xiaohui
sample_rateIntegerいいえ音声のサンプリングレートは、8000、16000、24000を選択できます。24000
formatStringいいえ音声エンコードの形式、wav / pcm / mp3、
注意:wav はストリーミングをサポートしていません。
pcm
speech_rateFloatいいえ話速、パラメータ範囲 [0.2, 3]、通常は小数点以下1桁で十分です1
volumeFloatいいえ音量、パラメータ範囲 [0.1, 3]、通常は小数点以下1桁で十分です1
pitch_rateFloatいいえイントネーション、パラメータ範囲[0.1, 3]、通常は小数点以下1桁で十分です1
emotionStringいいえ感情・スタイル、開発ガイド-言語とボイスのサポート を参照してください。なし
silence_durationIntegerいいえ文末の無音時間、単位はミリ秒(ms)です125
enable_timestampBooleanいいえタイムスタンプ関連、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 に含まれます。結果のフィールドは以下の通りです:

名前タイプ説明
statusStringステータスコード
messageStringステータスコードの説明
dataObject
├─task_idStringタスクのグローバル一意のID。問題のトラブルシューティングのために、この値を記録してください。
├─resultStringbase64 エンコードされた音声データ
├─durationString音声の長さ(ミリ秒単位),仅当xxxx开启时返回
├─timestampStringタイムスタンプ情報enable_timestamp が有効な場合にのみ返されます
├─├─wordsString文字レベルのタイムスタンプ情報
├─├─├─wordStringテキスト
├─├─├─start_timeFloat開始時間、単位は秒(s)
├─├─├─end_timeFloat終了時間、単位は秒(s)
├─├─├─unit_typeStringタイプ
text は普通のテキストを示し、mark は句読点を示します。
├─├─phonemesString音素レベルのタイムスタンプ情報
├─├─├─phoneString音素
├─├─├─start_timeFloat開始時間、単位は秒(s)
├─├─├─end_timeFloat終了時間、単位は秒(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": ""
    }
}