CosyVoice
重要 cosyvoice-v3.5-plus および cosyvoice-v3.5-flash モデルは中国 (北京) リージョンでのみ利用可能であり、音声デザインおよび音声クローニング専用です。これらのモデルはシステム音声をサポートしていません。音声合成に使用する前に、まずCosyVoice 音声クローニング/デザイン APIを使用してターゲット音声を作成する必要があります。音声が作成された後は、コード内の voice パラメーターを新しい音声 ID に更新し、model パラメーターを対応するモデルに設定してください。
システム音声以下の例は、システム音声を使用した音声合成の方法を示しています。詳細については、「音声一覧」をご参照ください。 ファイルへの保存Python# coding=utf-8
import os
import dashscope
from dashscope.audio.tts_v2 import *
# シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
# モデルを指定します。
# モデルのバージョンによって、対応する音声が異なります:
# cosyvoice-v3-flash/cosyvoice-v3-plus:longanyang などの音声を使用します。
# cosyvoice-v2:longxiaochun_v2 などの音声を使用します。
# 各音声は異なる言語をサポートしています。中国語以外の言語(日本語や韓国語など)を合成する場合は、対象言語をサポートする音声を選択してください。詳細については、CosyVoice 音声一覧をご参照ください。
model = "cosyvoice-v3-flash"
# 音声を指定します。
voice = "longanyang"
# SpeechSynthesizer をインスタンス化し、コンストラクター内で model および voice パラメーターを渡します。
synthesizer = SpeechSynthesizer(model=model, voice=voice)
# 合成するテキストを送信し、バイナリ形式のオーディオデータを受信します。
audio = synthesizer.call("今日の天気はどうですか?")
# 最初にテキストを送信すると、WebSocket 接続が確立される必要があります。したがって、最初のパケット遅延には接続確立にかかる時間が含まれます。
print('[Metric] Request ID: {}, first-packet latency: {} ms'.format(
synthesizer.get_last_request_id(),
synthesizer.get_first_package_delay()))
# オーディオをローカルファイルに保存します。
with open('output.mp3', 'wb') as f:
f.write(audio)
Javaimport com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.utils.Constants;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
public class Main {
// モデルを指定します。
// モデルのバージョンによって、対応する音声が異なります:
// cosyvoice-v3-flash/cosyvoice-v3-plus:longanyang などの音声を使用します。
// cosyvoice-v2:longxiaochun_v2 などの音声を使用します。
// 各音声は異なる言語をサポートしています。中国語以外の言語(日本語や韓国語など)を合成する場合は、対象言語をサポートする音声を選択してください。詳細については、CosyVoice 音声一覧をご参照ください。
private static String model = "cosyvoice-v3-flash";
// 音声を指定します。
private static String voice = "longanyang";
public static void streamAudioDataToSpeaker() {
// リクエストパラメーターを設定します。
SpeechSynthesisParam param =
SpeechSynthesisParam.builder()
// シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
// 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model(model) // モデルを指定します。
.voice(voice) // 音声を指定します。
.build();
// 同期モード:コールバックを無効化します(2 番目のパラメーターを null に設定)。
SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
ByteBuffer audio = null;
try {
// オーディオデータが返されるまでスレッドをブロックします。
audio = synthesizer.call("今日の天気はどうですか?");
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// タスク完了後に WebSocket 接続を閉じます。
synthesizer.getDuplexApi().close(1000, "bye");
}
if (audio != null) {
// オーディオデータをローカルファイル output.mp3 に保存します。
File file = new File("output.mp3");
// 最初にテキストを送信すると、WebSocket 接続が確立される必要があります。したがって、最初のパケット遅延には接続確立にかかる時間が含まれます。
System.out.println(
"[Metric] Request ID: "
+ synthesizer.getLastRequestId()
+ ", first-packet latency (ms): "
+ synthesizer.getFirstPackageDelay());
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(audio.array());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
// 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
streamAudioDataToSpeaker();
System.exit(0);
}
}
リアルタイム音声の再生以下の例は、Qwen 大規模言語モデル(LLM)からストリーミングされるテキストを音声に変換し、リアルタイムで再生する方法を示しています。 PythonPython の例を実行する前に、pip を使用してサードパーティ製のオーディオ再生ライブラリをインストールする必要があります。 # coding=utf-8
# pyaudio のインストール手順:
# APPLE Mac OS X
# brew install portaudio
# pip install pyaudio
# Debian/Ubuntu
# sudo apt-get install python-pyaudio python3-pyaudio
# または
# pip install pyaudio
# CentOS
# sudo yum install -y portaudio portaudio-devel && pip install pyaudio
# Microsoft Windows
# python -m pip install pyaudio
import os
import pyaudio
import dashscope
from dashscope.audio.tts_v2 import *
from http import HTTPStatus
from dashscope import Generation
# シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
# モデルのバージョンによって、対応する音声が異なります:
# cosyvoice-v3-flash/cosyvoice-v3-plus:longanyang などの音声を使用します。
# cosyvoice-v2:longxiaochun_v2 などの音声を使用します。
# 各音声は異なる言語をサポートしています。中国語以外の言語(日本語や韓国語など)を合成する場合は、対象言語をサポートする音声を選択してください。詳細については、CosyVoice 音声一覧をご参照ください。
model = "cosyvoice-v3-flash"
voice = "longanyang"
class Callback(ResultCallback):
_player = None
_stream = None
def on_open(self):
print("websocket がオープンしました。")
self._player = pyaudio.PyAudio()
self._stream = self._player.open(
format=pyaudio.paInt16, channels=1, rate=22050, output=True
)
def on_complete(self):
print("音声合成タスクが正常に完了しました。")
def on_error(self, message: str):
print(f"音声合成タスクが失敗しました。{message}")
def on_close(self):
print("websocket がクローズされました。")
# プレーヤーを停止します。
self._stream.stop_stream()
self._stream.close()
self._player.terminate()
def on_event(self, message):
print(f"音声合成メッセージを受信しました:{message}")
def on_data(self, data: bytes) -> None:
print("オーディオ結果の長さ:", len(data))
self._stream.write(data)
def synthesizer_with_llm():
callback = Callback()
synthesizer = SpeechSynthesizer(
model=model,
voice=voice,
format=AudioFormat.PCM_22050HZ_MONO_16BIT,
callback=callback,
)
messages = [{"role": "user", "content": "自己紹介をお願いします"}]
responses = Generation.call(
model="qwen-turbo",
messages=messages,
result_format="message", # 結果フォーマットを 'message' に設定します。
stream=True, # ストリーム出力を有効化します。
incremental_output=True, # 増分出力を有効化します。
)
for response in responses:
if response.status_code == HTTPStatus.OK:
print(response.output.choices[0]["message"]["content"], end="")
synthesizer.streaming_call(response.output.choices[0]["message"]["content"])
else:
print(
"Request id: %s, Status code: %s, error code: %s, error message: %s"
% (
response.request_id,
response.status_code,
response.code,
response.message,
)
)
synthesizer.streaming_complete()
print('requestId: ', synthesizer.get_last_request_id())
if __name__ == "__main__":
synthesizer_with_llm()
クローン音声 音声クローニングと音声合成は、それぞれ独立したが関連性のある 2 つのステップであり、「作成 → 使用」のワークフローに従います: 音声録音ファイルの準備 音声クローニング:入力音声フォーマット の要件を満たす音声ファイルを、Object Storage Service (OSS) などの一般公開可能な場所にアップロードします。URL が一般公開可能であることを確認してください。 音声の作成 音声の作成 API を呼び出します。このステップでは、作成した音声と連携して使用する音声合成モデルを指定するために、target_model/targetModel パラメーターを必ず指定する必要があります。 すでに音声を作成済みの場合は、このステップをスキップできます。既存の音声を確認するには、音声一覧の照会 API を呼び出してください。 音声合成への音声の使用 音声の作成 API を使用して音声を作成すると、システムから voice_id/voiceID が返されます。 この voice_id または voiceID を、その後の音声合成呼び出しにおける voice パラメーターの値として使用します。 非ストリーミング、片方向ストリーミング、双方向ストリーミング合成など、複数の呼び出しモードがサポートされています。 音声合成モデルは、音声作成時に target_model/targetModel パラメーターで指定したものと同じである必要があります。そうでない場合、合成は失敗します。
サンプルコード import os
import time
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService, SpeechSynthesizer
# 1. 環境の準備。
# API キーは環境変数として設定することを推奨します。
# シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
if not dashscope.api_key:
raise ValueError("DASHSCOPE_API_KEY 環境変数が設定されていません。")
# シンガポールリージョン向けの WebSocket URL。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
# シンガポールリージョン向けの HTTP URL。中国 (北京) リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
# 2. クローニングパラメーターの定義。
TARGET_MODEL = "cosyvoice-v3.5-plus"
# 音声に意味のあるプレフィックスを指定します。
VOICE_PREFIX = "myvoice" # 数字および小文字のみ許可されます。プレフィックスは 10 文字未満である必要があります。
# 音声ファイルの一般公開可能な URL を指定します。
AUDIO_URL = "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/cosyvoice/cosyvoice-zeroshot-sample.wav" # これはサンプル URL です。ご自身の URL に置き換えてください。
# 3. 音声の作成(非同期タスク)。
print("--- ステップ 1:音声登録の作成 ---")
service = VoiceEnrollmentService()
try:
voice_id = service.create_voice(
target_model=TARGET_MODEL,
prefix=VOICE_PREFIX,
url=AUDIO_URL
)
print(f"音声登録の送信が正常に完了しました。リクエスト ID:{service.get_last_request_id()}")
print(f"生成された音声 ID:{voice_id}")
except Exception as e:
print(f"音声作成中にエラーが発生しました:{e}")
raise e
# 4. 音声ステータスのポーリング。
print("\n--- ステップ 2:音声ステータスのポーリング ---")
max_attempts = 30
poll_interval = 10 # 秒
for attempt in range(max_attempts):
try:
voice_info = service.query_voice(voice_id=voice_id)
status = voice_info.get("status")
print(f"試行 {attempt + 1}/{max_attempts}:音声ステータスは '{status}' です")
if status == "OK":
print("音声は合成に使用可能です。")
break
elif status == "UNDEPLOYED":
print(f"音声処理が失敗しました。ステータス:{status}。音声品質を確認するか、サポートへお問い合わせください。")
raise RuntimeError(f"音声処理が失敗しました。ステータス:{status}")
# "DEPLOYING" などの中間ステータスの場合は、ポーリングを継続します。
time.sleep(poll_interval)
except Exception as e:
print(f"ステータスポーリング中にエラーが発生しました:{e}")
time.sleep(poll_interval)
else:
print("ポーリングがタイムアウトしました。複数回の試行後も音声が準備できませんでした。")
raise RuntimeError("ポーリングがタイムアウトしました。複数回の試行後も音声が準備できませんでした。")
# 5. クローン音声を使用した音声合成。
print("\n--- ステップ 3:新規音声による音声合成 ---")
try:
synthesizer = SpeechSynthesizer(model=TARGET_MODEL, voice=voice_id)
text_to_synthesize = "おめでとうございます!ご自身の音声をクローンし、合成することに成功しました!"
# call() メソッドはバイナリ形式のオーディオデータを返します。
audio_data = synthesizer.call(text_to_synthesize)
print(f"音声合成が正常に完了しました。リクエスト ID:{synthesizer.get_last_request_id()}")
# 6. オーディオファイルの保存。
output_file = "my_custom_voice_output.mp3"
with open(output_file, "wb") as f:
f.write(audio_data)
print(f"オーディオが {output_file} に保存されました")
except Exception as e:
print(f"音声合成中にエラーが発生しました:{e}")
デザイン音声 音声デザインと音声合成は、それぞれ独立したが関連性のある 2 つのステップであり、「作成 → 使用」のワークフローに従います: 音声デザインのための音声説明およびプレビュー用テキストの準備 音声の作成 API を呼び出してカスタム音声を作成し、音声 ID およびプレビュー音声を取得します。 このステップでは、作成した音声と連携して使用する音声合成モデルを指定するために、target_model パラメーターを必ず指定する必要があります。 プレビュー音声を聴取します。期待通りであれば、次のステップに進んでください。そうでない場合は、音声を再設計してください。 すでに音声を作成済みの場合は、このステップをスキップできます。既存の音声を確認するには、音声一覧の照会 API を呼び出してください。 音声合成への音声の使用。 音声の作成 API を使用して音声を作成すると、システムから voice_id/voiceID が返されます。 この voice_id または voiceID を、その後の音声合成呼び出しにおける voice パラメーターの値として使用します。 非ストリーミング、片方向ストリーミング、双方向ストリーミング合成など、複数の呼び出しモードがサポートされています。 音声合成モデルは、音声作成時に target_model/targetModel パラメーターで指定したものと同じである必要があります。そうでない場合、合成は失敗します。
サンプルコード カスタム音声を生成し、プレビュー結果を確認します。結果に満足した場合は、次のステップに進んでください。そうでない場合は、音声を再生成してください。 Pythonimport requests
import base64
import os
def create_voice_and_play():
# シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: api_key = "sk-xxx"
api_key = os.getenv("DASHSCOPE_API_KEY")
if not api_key:
print("エラー:DASHSCOPE_API_KEY 環境変数が設定されていません。")
return None, None, None
# リクエストデータを準備します。
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
data = {
"model": "voice-enrollment",
"input": {
"action": "create_voice",
"target_model": "cosyvoice-v3.5-plus",
"voice_prompt": "落ち着いた中年男性アナウンサーで、深みがあり豊かで磁石のような声、一定の話速、明瞭な発音が特徴で、ニュース放送やドキュメンタリー解説に適しています。",
"preview_text": "リスナーの皆様、こんにちは。夜のニュースへようこそ。",
"prefix": "announcer"
},
"parameters": {
"sample_rate": 24000,
"response_format": "wav"
}
}
# 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
try:
# リクエストを送信します。
response = requests.post(
url,
headers=headers,
json=data,
timeout=60 # タイムアウトを追加します。
)
if response.status_code == 200:
result = response.json()
# 音声 ID を取得します。
voice_id = result["output"]["voice_id"]
print(f"音声 ID:{voice_id}")
# プレビュー音声データを取得します。
base64_audio = result["output"]["preview_audio"]["data"]
# Base64 形式の音声データをデコードします。
audio_bytes = base64.b64decode(base64_audio)
# 音声ファイルをローカルデバイスに保存します。
filename = f"{voice_id}_preview.wav"
# 音声データをローカルファイルに書き込みます。
with open(filename, 'wb') as f:
f.write(audio_bytes)
print(f"音声はローカルファイルに保存されました:{filename}")
print(f"ファイルパス:{os.path.abspath(filename)}")
return voice_id, audio_bytes, filename
else:
print(f"リクエストが失敗しました。ステータスコード:{response.status_code}")
print(f"レスポンス内容:{response.text}")
return None, None, None
except requests.exceptions.RequestException as e:
print(f"ネットワークリクエストエラーが発生しました:{e}")
return None, None, None
except KeyError as e:
print(f"レスポンスデータの形式が無効です。必要なフィールドが見つかりません:{e}")
print(f"レスポンス内容:{response.text if 'response' in locals() else 'No response'}")
return None, None, None
except Exception as e:
print(f"予期しないエラーが発生しました:{e}")
return None, None, None
if __name__ == "__main__":
print("音声の作成を開始します...")
voice_id, audio_data, saved_filename = create_voice_and_play()
if voice_id:
print(f"\n音声 '{voice_id}' が作成されました。")
print(f"音声ファイルは '{saved_filename}' に保存されました。")
print(f"ファイルサイズ:{os.path.getsize(saved_filename)} バイト")
else:
print("\n音声の作成に失敗しました。")
JavaGson 依存関係をインポートする必要があります。Maven や Gradle を使用している場合は、以下のように依存関係を追加してください。 Maven次の内容を pom.xml ファイルに追加します: <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.13.1</version>
</dependency>
Gradle次の内容を build.gradle ファイルに追加します: // https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation("com.google.code.gson:gson:2.13.1")
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
public class Main {
public static void main(String[] args) {
Main example = new Main();
example.createVoice();
}
public void createVoice() {
// シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
// 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: String apiKey = "sk-xxx"
String apiKey = System.getenv("DASHSCOPE_API_KEY");
// JSON リクエストボディ文字列を作成します。
String jsonBody = "{\n" +
" \"model\": \"voice-enrollment\",\n" +
" \"input\": {\n" +
" \"action\": \"create_voice\",\n" +
" \"target_model\": \"cosyvoice-v3.5-plus\",\n" +
" \"voice_prompt\": \"落ち着いた中年男性アナウンサーで、深みがあり豊かで磁石のような声、一定の話速、明瞭な発音が特徴で、ニュース放送やドキュメンタリー解説に適しています。\",\n" +
" \"preview_text\": \"リスナーの皆様、こんにちは。夜のニュースへようこそ。\",\n" +
" \"prefix\": \"announcer\"\n" +
" },\n" +
" \"parameters\": {\n" +
" \"sample_rate\": 24000,\n" +
" \"response_format\": \"wav\"\n" +
" }\n" +
"}";
HttpURLConnection connection = null;
try {
// 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
connection = (HttpURLConnection) url.openConnection();
// リクエストメソッドおよびヘッダーを設定します。
connection.setRequestMethod("POST");
connection.setRequestProperty("Authorization", "Bearer " + apiKey);
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
connection.setDoInput(true);
// リクエストボディを送信します。
try (OutputStream os = connection.getOutputStream()) {
byte[] input = jsonBody.getBytes("UTF-8");
os.write(input, 0, input.length);
os.flush();
}
// レスポンスを取得します。
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// レスポンス内容を読み取ります。
StringBuilder response = new StringBuilder();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
}
// JSON レスポンスを解析します。
JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
JsonObject outputObj = jsonResponse.getAsJsonObject("output");
JsonObject previewAudioObj = outputObj.getAsJsonObject("preview_audio");
// 音声 ID を取得します。
String voiceId = outputObj.get("voice_id").getAsString();
System.out.println("音声 ID: " + voiceId);
// Base64 エンコードされた音声データを取得します。
String base64Audio = previewAudioObj.get("data").getAsString();
// Base64 形式の音声データをデコードします。
byte[] audioBytes = Base64.getDecoder().decode(base64Audio);
// 音声をローカルファイルに保存します。
String filename = voiceId + "_preview.wav";
saveAudioToFile(audioBytes, filename);
System.out.println("音声はローカルファイルに保存されました: " + filename);
} else {
// エラーレスポンスを読み取ります。
StringBuilder errorResponse = new StringBuilder();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
String responseLine;
while ((responseLine = br.readLine()) != null) {
errorResponse.append(responseLine.trim());
}
}
System.out.println("リクエストが失敗しました。ステータスコード: " + responseCode);
System.out.println("エラーレスポンス: " + errorResponse.toString());
}
} catch (Exception e) {
System.err.println("リクエストエラーが発生しました: " + e.getMessage());
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
private void saveAudioToFile(byte[] audioBytes, String filename) {
try {
File file = new File(filename);
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(audioBytes);
}
System.out.println("音声は次の場所に保存されました: " + file.getAbsolutePath());
} catch (IOException e) {
System.err.println("音声ファイルの保存中にエラーが発生しました: " + e.getMessage());
e.printStackTrace();
}
}
}
前のステップで生成したカスタム音声を音声合成に使用します。 この手順では、ノンストリーミング呼び出し の例を参照します。 voice パラメーターの値を、音声デザインによって生成されたカスタム音声 ID に置き換えます。 基本原則:音声デザインで使用したモデル(target_model)と、その後の音声合成で使用するモデル(model)は同一である必要があります。そうでない場合、合成は失敗します。 Python# coding=utf-8
import dashscope
from dashscope.audio.tts_v2 import *
import os
# シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
# 音声デザインと音声合成で同じモデルを使用します。
model = "cosyvoice-v3.5-plus"
# 音声パラメーターの値を、音声デザインで生成したカスタム音声 ID に置き換えます。
voice = "your_voice_id"
# SpeechSynthesizer をインスタンス化し、コンストラクター内で model および voice パラメーターを渡します。
synthesizer = SpeechSynthesizer(model=model, voice=voice)
# 合成するテキストを送信し、バイナリ形式のオーディオデータを受信します。
audio = synthesizer.call("今日の天気はどうですか?")
# 最初にテキストを送信すると、WebSocket 接続が確立される必要があります。したがって、最初のパケット遅延には接続確立にかかる時間が含まれます。
print('[Metric] Request ID: {}, first-packet latency: {} ms'.format(
synthesizer.get_last_request_id(),
synthesizer.get_first_package_delay()))
# オーディオをローカルファイルに保存します。
with open('output.mp3', 'wb') as f:
f.write(audio)
Javaimport com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.utils.Constants;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
public class Main {
// 音声デザインと音声合成で同じモデルを使用します。
private static String model = "cosyvoice-v3.5-plus";
// 音声パラメーターの値を、音声デザインで生成したカスタム音声 ID に置き換えます。
private static String voice = "your_voice_id";
public static void streamAudioDataToSpeaker() {
// リクエストパラメーターを設定します。
SpeechSynthesisParam param =
SpeechSynthesisParam.builder()
// シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
// 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model(model) // モデルを指定します。
.voice(voice) // 音声を指定します。
.build();
// 同期モード:コールバックを無効化します(2 番目のパラメーターを null に設定)。
SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
ByteBuffer audio = null;
try {
// オーディオデータが返されるまでスレッドをブロックします。
audio = synthesizer.call("今日の天気はどうですか?");
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// タスク完了後に WebSocket 接続を閉じます。
synthesizer.getDuplexApi().close(1000, "bye");
}
if (audio != null) {
// オーディオデータをローカルファイル output.mp3 に保存します。
File file = new File("output.mp3");
// 最初にテキストを送信すると、WebSocket 接続が確立される必要があります。したがって、最初のパケット遅延には接続確立にかかる時間が含まれます。
System.out.println(
"[Metric] Request ID: "
+ synthesizer.getLastRequestId()
+ ", first-packet latency (ms): "
+ synthesizer.getFirstPackageDelay());
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(audio.array());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
// 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
streamAudioDataToSpeaker();
System.exit(0);
}
}
|