音声クローニングでは、トレーニングなしで音声をクローニングできます。10~20 秒の音声から、自然な音質で元の音声に近いカスタムボイスを生成できます。音声クローニングとモデルの呼び出しは、連続する 2 つのステップです。このドキュメントでは、音声クローニングのパラメーターと API の詳細について説明します。モデルの呼び出しについては、リアルタイム (Qwen-Omni-Realtime) または 非リアルタイム (Qwen-Omni) をご参照ください。
このドキュメントは、Qwen-Omni および Qwen-Omni-Realtime の音声クローニング API のみを対象としています。テキスト読み上げモデルを使用する場合は、「音声合成」をご参照ください。
音声要件
高品質な入力音声は、良好なクローニング結果の基盤です。
|
項目 |
要件 |
|
対応フォーマット |
WAV (16 ビット)、MP3、M4A |
|
長さ |
10~20秒を推奨します。最大:60秒。 |
|
ファイルサイズ |
< 10 MB |
|
サンプルレート |
>= 24 kHz |
|
チャンネル |
モノラル |
|
内容 |
音声には、背景音のない連続したクリアな音声を少なくとも3秒含める必要があります。残りの部分には、短い無音区間(2秒以下)を含めることができます。音声全体を通して、背景音楽、ノイズ、または他の人の声は避けてください。入力には通常の話し声を使用してください。歌や歌声はアップロードしないでください。 |
|
言語 |
中国語 (zh)、英語 (en)、ドイツ語 (de)、イタリア語 (it)、ポルトガル語 (pt)、スペイン語 (es)、日本語 (ja)、韓国語 (ko)、フランス語 (fr)、ロシア語 (ru)、タイ語 (th)、インドネシア語 (id)、アラビア語 (ar)、チェコ語 (cs)、デンマーク語 (da)、オランダ語 (nl)、フィンランド語 (fi)、ヘブライ語 (he)、ヒンディー語 (hi)、アイスランド語 (is)、マレー語 (ms)、ノルウェー語 (no)、ペルシャ語 (fa)、ポーランド語 (pl)、スウェーデン語 (sv)、タガログ語 (tl)、トルコ語 (tr)、ウルドゥー語 (ur)、ベトナム語 (vi) 中国語の方言:東北、陝西、四川、河南、長沙、天津、杭州、遼寧、瀋陽、鞍山 |
クイックスタート:ボイスのクローンと使用
1. ワークフロー
音声クローニングとモデルの呼び出しは、密接に関連しながらも独立した 2 つのステップで、「最初に作成してから使用する」というワークフローに従います:
-
音声の作成
音声の作成 API を呼び出し、オーディオクリップをアップロードします。システムは音声を分析し、カスタムクローン音声を作成します。このステップでは、音声を駆動する omni model を宣言するため、
target_modelを指定する必要があります。すでに作成済みの音声がある場合 (音声の一覧表示 API を呼び出して確認)、このステップをスキップして次のステップに進んでください。
-
会話での音声の使用
Omni API (リアルタイムまたは非リアルタイム) を呼び出し、前のステップで取得した音声を渡します。このステップで指定する omni model は、前のステップの
target_modelと一致している必要があります。
2. モデル構成と前提条件
適切なモデルを選択し、前提条件を満たしてください。
モデル構成
音声クローニングには 2 つのモデルが必要です:
-
音声クローニングモデル: qwen-voice-enrollment
-
音声駆動用のオムニモデル:
-
qwen3.5-omni-plus-realtime
-
qwen3.5-omni-flash-realtime
-
qwen3.5-omni-plus
-
qwen3.5-omni-flash
-
前提条件
-
API キーの取得: API キーを作成してください。セキュリティのため、API キーを環境変数として設定してください。
-
SDK のインストール: 最新の DashScope SDK がインストールされていることを確認してください。
-
クローニング用の音声の準備: 音声は音声要件を満たす必要があります。
3. エンドツーエンド例
次の例では、会話でクローン音声を使用して、オリジナル音声によく似た出力を生成する方法を示します。
重要な原則:音声クローニングの際、target_model (音声を生成する omni モデル) は、後続の Omni API 呼び出しで指定するモデルと一致させる必要があります。一致しない場合、合成に失敗します。この例では、音声クローニング用にローカルオーディオファイル voice.mp3 を使用しています。コードを実行する際は、ご自身のファイルに置き換えてください。
リアルタイム
Qwen3.5-Omni-Realtime シリーズモデルに適用されます。詳細については、「リアルタイム (Qwen-Omni-Realtime)」をご参照ください。
Python
# 必要なライブラリ: dashscope >= 1.23.9, pyaudio
import os
import requests
import base64
import pathlib
import time
import pyaudio
from dashscope.audio.qwen_omni import MultiModality, OmniRealtimeCallback, OmniRealtimeConversation
import dashscope
# ======= 設定 =======
DEFAULT_TARGET_MODEL = "qwen3.5-omni-plus-realtime" # クローニングと会話で同じモデルを使用する必要があります
DEFAULT_PREFERRED_NAME = "guanyu"
DEFAULT_AUDIO_MIME_TYPE = "audio/mpeg"
VOICE_FILE_PATH = "voice.mp3" # 音声クローニング用のローカルオーディオファイルのパス
def create_voice(file_path: str,
target_model: str = DEFAULT_TARGET_MODEL,
preferred_name: str = DEFAULT_PREFERRED_NAME,
audio_mime_type: str = DEFAULT_AUDIO_MIME_TYPE) -> str:
"""
カスタムボイスを作成し、ボイスパラメーターを返します。
"""
# API キーは Singapore リージョンと Beijing リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/en/model-studio/get-api-key
# 環境変数を設定していない場合は、次の行を置き換えてください: api_key = "sk-xxx"
api_key = os.getenv("DASHSCOPE_API_KEY")
file_path_obj = pathlib.Path(file_path)
if not file_path_obj.exists():
raise FileNotFoundError(f"Audio file not found: {file_path}")
base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"
# Singapore リージョンの URL。Beijing リージョンの場合は次を使用: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
payload = {
"model": "qwen-voice-enrollment",
"input": {
"action": "create",
"target_model": target_model,
"preferred_name": preferred_name,
"audio": {"data": data_uri}
}
}
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
resp = requests.post(url, json=payload, headers=headers)
if resp.status_code != 200:
raise RuntimeError(f"Failed to create voice: {resp.status_code}, {resp.text}")
try:
return resp.json()["output"]["voice"]
except (KeyError, ValueError) as e:
raise RuntimeError(f"Failed to parse voice response: {e}")
class SimpleCallback(OmniRealtimeCallback):
def __init__(self, pya):
self.pya = pya
self.out = None
def on_open(self):
self.out = self.pya.open(
format=pyaudio.paInt16,
channels=1,
rate=24000,
output=True
)
def on_event(self, response):
if response['type'] == 'response.audio.delta':
self.out.write(base64.b64decode(response['delta']))
elif response['type'] == 'conversation.item.input_audio_transcription.completed':
print(f"[User] {response['transcript']}")
elif response['type'] == 'response.audio_transcript.done':
print(f"[LLM] {response['transcript']}")
if __name__ == '__main__':
# 環境変数を設定していない場合は、次の行を置き換えてください: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
# Singapore リージョンの URL。Beijing リージョンの場合は次を使用: wss://dashscope.aliyuncs.com/api-ws/v1/realtime
url = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime"
# ステップ 1: 音声クローニング
voice = create_voice(VOICE_FILE_PATH)
print(f"音声クローニングが完了しました。ボイス: {voice}")
# ステップ 2: クローンされた音声でリアルタイム会話を開始
pya = pyaudio.PyAudio()
callback = SimpleCallback(pya)
conv = OmniRealtimeConversation(model=DEFAULT_TARGET_MODEL, callback=callback, url=url)
conv.connect()
conv.update_session(
output_modalities=[MultiModality.AUDIO, MultiModality.TEXT],
voice=voice # クローンされた音声を使用
)
mic = pya.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True)
print("会話を開始しました。マイクに向かって話してください (終了するには Ctrl+C) ...")
try:
while True:
audio_data = mic.read(3200, exception_on_overflow=False)
conv.append_audio(base64.b64encode(audio_data).decode())
time.sleep(0.01)
except KeyboardInterrupt:
conv.close()
mic.close()
callback.out.close()
pya.terminate()
print("\n会話を終了しました")
Java
import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import javax.sound.sampled.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Base64;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
public class Main {
// ===== 定数 =====
// 音声クローニングとリアルタイム会話で同じモデルを使用
private static final String TARGET_MODEL = "qwen3.5-omni-plus-realtime";
private static final String PREFERRED_NAME = "guanyu";
// 音声クローニング用のローカルオーディオファイルの相対パス
private static final String AUDIO_FILE = "voice.mp3";
private static final String AUDIO_MIME_TYPE = "audio/mpeg";
// データ URI を生成
public static String toDataUrl(String filePath) throws IOException {
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
String encoded = Base64.getEncoder().encodeToString(bytes);
return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded;
}
// API を呼び出して音声を作成
public static String createVoice() throws Exception {
// API キーは Singapore リージョンと Beijing リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/en/model-studio/get-api-key
// 環境変数を設定していない場合は、次の行を置き換えてください: String apiKey = "sk-xxx"
String apiKey = System.getenv("DASHSCOPE_API_KEY");
String jsonPayload =
"{"
+ "\"model\": \"qwen-voice-enrollment\","
+ "\"input\": {"
+ "\"action\": \"create\","
+ "\"target_model\": \"" + TARGET_MODEL + "\","
+ "\"preferred_name\": \"" + PREFERRED_NAME + "\","
+ "\"audio\": {"
+ "\"data\": \"" + toDataUrl(AUDIO_FILE) + "\""
+ "}"
+ "}"
+ "}";
// 以下の URL は Singapore リージョン用です。Beijing リージョンのモデルを使用する場合は、URL を次に置き換えてください: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
String url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization";
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Authorization", "Bearer " + apiKey);
con.setRequestProperty("Content-Type", "application/json");
con.setDoOutput(true);
try (OutputStream os = con.getOutputStream()) {
os.write(jsonPayload.getBytes(StandardCharsets.UTF_8));
}
int status = con.getResponseCode();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(),
StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
response.append(line);
}
if (status == 200) {
JsonObject jsonObj = new Gson().fromJson(response.toString(), JsonObject.class);
return jsonObj.getAsJsonObject("output").get("voice").getAsString();
}
throw new IOException("Failed to create voice: " + status + " - " + response);
}
}
// シンプルなオーディオプレーヤー
static class SimpleAudioPlayer {
private final SourceDataLine line;
private final Queue<byte[]> audioQueue = new ConcurrentLinkedQueue<>();
private final Thread playerThread;
private final AtomicBoolean shouldStop = new AtomicBoolean(false);
public SimpleAudioPlayer() throws LineUnavailableException {
AudioFormat format = new AudioFormat(24000, 16, 1, true, false);
line = AudioSystem.getSourceDataLine(format);
line.open(format);
line.start();
playerThread = new Thread(() -> {
while (!shouldStop.get()) {
byte[] audio = audioQueue.poll();
if (audio != null) {
line.write(audio, 0, audio.length);
} else {
try { Thread.sleep(10); } catch (InterruptedException ignored) {}
}
}
}, "AudioPlayer");
playerThread.start();
}
public void play(String base64Audio) {
audioQueue.add(Base64.getDecoder().decode(base64Audio));
}
public void close() {
shouldStop.set(true);
try { playerThread.join(1000); } catch (InterruptedException ignored) {}
line.drain();
line.close();
}
}
public static void main(String[] args) {
try {
// 1. 音声クローニング: カスタムボイスを作成
String voice = createVoice();
System.out.println("音声クローニングが完了しました。ボイス: " + voice);
// 2. クローンされた音声をリアルタイム会話で使用
SimpleAudioPlayer player = new SimpleAudioPlayer();
AtomicBoolean shouldStop = new AtomicBoolean(false);
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model(TARGET_MODEL)
// API キーは Singapore リージョンと Beijing リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/en/model-studio/get-api-key
// 環境変数を設定していない場合は、次の行を置き換えてください: .apikey("sk-xxx")
.apikey(System.getenv("DASHSCOPE_API_KEY"))
// 以下の URL は Singapore リージョン用です。Beijing リージョンのモデルを使用する場合は、URL を次に置き換えてください: wss://dashscope.aliyuncs.com/api-ws/v1/realtime
.url("wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime")
.build();
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, new OmniRealtimeCallback() {
@Override public void onOpen() { System.out.println("接続が確立されました"); }
@Override public void onClose(int code, String reason) {
System.out.println("接続が閉じられました (" + code + "): " + reason);
shouldStop.set(true);
}
@Override public void onEvent(JsonObject event) {
String type = event.get("type").getAsString();
if ("response.audio.delta".equals(type)) {
player.play(event.get("delta").getAsString());
} else if ("conversation.item.input_audio_transcription.completed".equals(type)) {
System.out.println("[User] " + event.get("transcript").getAsString());
} else if ("response.audio_transcript.done".equals(type)) {
System.out.println("[LLM] " + event.get("transcript").getAsString());
}
}
});
conversation.connect();
conversation.updateSession(OmniRealtimeConfig.builder()
.modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
.voice(voice) // クローンされたカスタムボイスを使用
.enableTurnDetection(true)
.enableInputAudioTranscription(true)
.build()
);
System.out.println("会話を開始しました。マイクに向かって話してください (終了するには Ctrl+C) ...");
AudioFormat format = new AudioFormat(16000, 16, 1, true, false);
TargetDataLine mic = AudioSystem.getTargetDataLine(format);
mic.open(format);
mic.start();
ByteBuffer buffer = ByteBuffer.allocate(3200);
while (!shouldStop.get()) {
int bytesRead = mic.read(buffer.array(), 0, buffer.capacity());
if (bytesRead > 0) {
conversation.appendAudio(Base64.getEncoder().encodeToString(buffer.array()));
}
Thread.sleep(20);
}
conversation.close(1000, "正常終了");
player.close();
mic.close();
System.out.println("\n会話を終了しました");
} catch (NoApiKeyException e) {
System.err.println("API キーが見つかりません。DASHSCOPE_API_KEY 環境変数を設定してください。");
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
}
非リアルタイム
Qwen3.5-Omni シリーズのモデルに適用されます。 詳細については、「非リアルタイム (Qwen-Omni)」をご参照ください。
Python
# 要件:dashscope >= 1.23.9、soundfile、numpy
import os
import requests
import base64
import pathlib
import numpy as np
import soundfile as sf
import dashscope
# ======= 設定 =======
DEFAULT_TARGET_MODEL = "qwen3.5-omni-plus" # 音声クローニングと非リアルタイムの呼び出しでは、同じモデルを使用する必要があります
DEFAULT_PREFERRED_NAME = "guanyu"
DEFAULT_AUDIO_MIME_TYPE = "audio/mpeg"
VOICE_FILE_PATH = "voice.mp3" # 音声クローニング用のローカル音声ファイルへのパス
def create_voice(file_path: str,
target_model: str = DEFAULT_TARGET_MODEL,
preferred_name: str = DEFAULT_PREFERRED_NAME,
audio_mime_type: str = DEFAULT_AUDIO_MIME_TYPE) -> str:
"""
カスタム音声を作成し、音声パラメータを返します。
"""
# API キーはシンガポールリージョンと北京リージョンで異なります。 API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
# 環境変数が設定されていない場合は、次の行を api_key = "sk-xxx" に置き換えてください
api_key = os.getenv("DASHSCOPE_API_KEY")
file_path_obj = pathlib.Path(file_path)
if not file_path_obj.exists():
raise FileNotFoundError(f"Audio file not found: {file_path}")
base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"
# シンガポールリージョンの URL。 北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください
url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
payload = {
"model": "qwen-voice-enrollment",
"input": {
"action": "create",
"target_model": target_model,
"preferred_name": preferred_name,
"audio": {"data": data_uri}
}
}
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
resp = requests.post(url, json=payload, headers=headers)
if resp.status_code != 200:
raise RuntimeError(f"Failed to create voice: {resp.status_code}, {resp.text}")
try:
return resp.json()["output"]["voice"]
except (KeyError, ValueError) as e:
raise RuntimeError(f"Failed to parse voice response: {e}")
if __name__ == '__main__':
# シンガポールリージョンの URL。 北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1 に置き換えてください
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
# 1. 音声クローニング:カスタム音声を作成
voice = create_voice(VOICE_FILE_PATH)
print(f"Voice cloning complete. Voice: {voice}")
# 2. クローンした音声との非リアルタイム会話
messages = [{"role": "user", "content": [{"text": "Hello, please introduce yourself"}]}]
response = dashscope.MultiModalConversation.call(
# 環境変数が設定されていない場合は、api_key="sk-xxx" に置き換えてください
api_key=os.getenv("DASHSCOPE_API_KEY"),
model=DEFAULT_TARGET_MODEL,
messages=messages,
modalities=["text", "audio"],
audio={"voice": voice, "format": "wav"}, # クローンした音声を使用
stream=True
)
print("Model response:")
audio_base64_string = ""
for r in response:
try:
content = r.output.choices[0].message.content
for item in content:
if isinstance(item, dict):
if "audio" in item:
audio_base64_string += item["audio"].get("data", "")
elif "text" in item:
print(item["text"], end="")
except Exception:
pass
if audio_base64_string:
wav_bytes = base64.b64decode(audio_base64_string)
audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
sf.write("audio_cloned.wav", audio_np, samplerate=24000)
print("\nAudio saved to: audio_cloned.wav")
Java
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Main {
// ===== 定数 =====
// 音声クローニングと非リアルタイムの呼び出しでは、同じモデルを使用する必要があります
private static final String TARGET_MODEL = "qwen3.5-omni-plus";
private static final String PREFERRED_NAME = "guanyu";
// 音声クローニング用のローカル音声ファイルへのパス
private static final String AUDIO_FILE = "voice.mp3";
private static final String AUDIO_MIME_TYPE = "audio/mpeg";
// PCM データを標準の WAV ファイルとして書き込む
public static void writeWav(String path, byte[] pcmData, int sampleRate) throws IOException {
int channels = 1, bitsPerSample = 16;
int byteRate = sampleRate * channels * bitsPerSample / 8;
int blockAlign = channels * bitsPerSample / 8;
ByteBuffer header = ByteBuffer.allocate(44).order(ByteOrder.LITTLE_ENDIAN);
header.put("RIFF".getBytes()); header.putInt(36 + pcmData.length);
header.put("WAVE".getBytes()); header.put("fmt ".getBytes());
header.putInt(16); header.putShort((short) 1); header.putShort((short) channels);
header.putInt(sampleRate); header.putInt(byteRate);
header.putShort((short) blockAlign); header.putShort((short) bitsPerSample);
header.put("data".getBytes()); header.putInt(pcmData.length);
try (FileOutputStream fos = new FileOutputStream(path)) {
fos.write(header.array());
fos.write(pcmData);
}
}
// ファイルからデータ URI を生成
public static String toDataUrl(String filePath) throws IOException {
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
String encoded = Base64.getEncoder().encodeToString(bytes);
return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded;
}
// API を呼び出して音声を作成
public static String createVoice() throws Exception {
// API キーはシンガポールリージョンと北京リージョンで異なります。 API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
// 環境変数が設定されていない場合は、次の行を String apiKey = "sk-xxx" に置き換えてください
String apiKey = System.getenv("DASHSCOPE_API_KEY");
String jsonPayload =
"{"
+ "\"model\": \"qwen-voice-enrollment\","
+ "\"input\": {"
+ "\"action\": \"create\","
+ "\"target_model\": \"" + TARGET_MODEL + "\","
+ "\"preferred_name\": \"" + PREFERRED_NAME + "\","
+ "\"audio\": {"
+ "\"data\": \"" + toDataUrl(AUDIO_FILE) + "\""
+ "}"
+ "}"
+ "}";
// シンガポールリージョンの URL。 北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください
String url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization";
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Authorization", "Bearer " + apiKey);
con.setRequestProperty("Content-Type", "application/json");
con.setDoOutput(true);
try (OutputStream os = con.getOutputStream()) {
os.write(jsonPayload.getBytes(StandardCharsets.UTF_8));
}
int status = con.getResponseCode();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(),
StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
response.append(line);
}
if (status == 200) {
JsonObject jsonObj = new Gson().fromJson(response.toString(), JsonObject.class);
return jsonObj.getAsJsonObject("output").get("voice").getAsString();
}
throw new IOException("Failed to create voice: " + status + " - " + response);
}
}
public static void main(String[] args) {
try {
// API キーはシンガポールリージョンと北京リージョンで異なります。 API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
// 環境変数が設定されていない場合は、次の行を String apiKey = "sk-xxx" に置き換えてください
String apiKey = System.getenv("DASHSCOPE_API_KEY");
// 1. 音声クローニング:カスタム音声を作成
String voice = createVoice();
System.out.println("Voice cloning complete. Voice: " + voice);
// 2. クローンした音声との非リアルタイム会話 (OpenAI 互換 API)
String requestBody = "{"
+ "\"model\": \"" + TARGET_MODEL + "\","
+ "\"messages\": [{\"role\": \"user\", \"content\": \"Hello, please introduce yourself\"}],"
+ "\"modalities\": [\"text\", \"audio\"],"
+ "\"audio\": {\"voice\": \"" + voice + "\", \"format\": \"wav\"},"
+ "\"stream\": true,"
+ "\"stream_options\": {\"include_usage\": true}"
+ "}";
// シンガポールリージョンの URL。 北京リージョンの場合は、https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions に置き換えてください
String url = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions";
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Authorization", "Bearer " + apiKey);
con.setRequestProperty("Content-Type", "application/json");
con.setDoOutput(true);
try (OutputStream os = con.getOutputStream()) {
os.write(requestBody.getBytes(StandardCharsets.UTF_8));
}
// 3. ストリーミング SSE レスポンスを解析
StringBuilder audioBase64 = new StringBuilder();
System.out.println("Model response:");
try (BufferedReader br = new BufferedReader(
new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8))) {
String line;
while ((line = br.readLine()) != null) {
if (!line.startsWith("data: ") || line.equals("data: [DONE]")) continue;
String json = line.substring(6);
JsonObject chunk = new Gson().fromJson(json, JsonObject.class);
if (!chunk.has("choices") || chunk.getAsJsonArray("choices").size() == 0) continue;
JsonObject delta = chunk.getAsJsonArray("choices").get(0)
.getAsJsonObject().getAsJsonObject("delta");
if (delta.has("content") && !delta.get("content").isJsonNull()) {
System.out.print(delta.get("content").getAsString());
}
if (delta.has("audio") && !delta.get("audio").isJsonNull()) {
JsonObject audio = delta.getAsJsonObject("audio");
if (audio.has("data")) {
audioBase64.append(audio.get("data").getAsString());
}
}
}
}
// 4. 音声ファイルを保存 (API は未加工の PCM データを返すため、WAV ヘッダーが必要です)
if (audioBase64.length() > 0) {
byte[] pcmBytes = Base64.getDecoder().decode(audioBase64.toString());
writeWav("audio_cloned.wav", pcmBytes, 24000);
System.out.println("\nAudio saved to: audio_cloned.wav");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
API リファレンス
複数の API で同じアカウントを使用してください。
音声の作成
クローニング用の音声をアップロードし、カスタム音声を作成します。
-
URL
China (Beijing):
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customizationInternational (Singapore):
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization -
リクエストヘッダー
[パラメーター]
タイプ
必須
説明
Authorization
文字列
Bearer <your_api_key>形式の認証トークンです。<your_api_key>を実際の API キーに置き換えてください。Content-Type
文字列
リクエストボディのメディアタイプです。
application/jsonに設定してください。 -
リクエストボディ 次のリクエストボディには、すべてのパラメーターが含まれています。必要に応じて任意フィールドを省略できます。次のパラメーターの違いにご注意ください:
重要model:音声クローニングモデルです。qwen-voice-enrollmentに設定してください。target_model:音声を駆動する omni モデルです。後続のリアルタイムマルチモーダル API 呼び出しで使用するモデルと一致する必要があります。一致しない場合、合成に失敗します。{ "model": "qwen-voice-enrollment", "input": { "action": "create", "target_model": "qwen3.5-omni-plus-realtime", "preferred_name": "guanyu", "audio": { "data": "https://xxx.wav" }, "text": "Optional. The transcript of the audio in audio.data.", "language": "Optional. The language of the audio in audio.data, such as zh." } } -
リクエストパラメーター
パラメーター
タイプ
デフォルト
必須
説明
model
文字列
-
音声クローニングモデルです。
qwen-voice-enrollmentに設定してください。action
文字列
-
アクションタイプです。
createに設定してください。target_model
文字列
-
音声を駆動する omni モデル:
-
qwen3.5-omni-plus-realtime
-
qwen3.5-omni-flash-realtime
-
qwen3.5-omni-plus
-
qwen3.5-omni-flash
後続の API 呼び出しで使用する omni モデルと一致する必要があります。一致しない場合、合成に失敗します。
preferred_name
文字列
-
音声の判読可能な名前です。使用できるのは数字、英字、アンダースコアのみです。最大:16 文字。ロールやシナリオに関連する名前を使用してください。
このキーワードは最終的な音声名に含まれます。たとえば、キーワードが "guanyu" の場合、生成される音声名は "qwen-omni-vc-guanyu-voice-20250812105009984-838b" になります。
audio.data
文字列
-
クローニング用の音声です (録音時は Recording guide に従い、音声が Audio requirements を満たしていることを確認してください)。
音声データは、次のいずれかの方法で送信します:
-
形式:
data:<mediatype>;base64,<data>-
<mediatype>:MIME タイプ-
WAV:
audio/wav -
MP3:
audio/mpeg -
M4A:
audio/mp4
-
-
<data>:音声の Base64 エンコードされた文字列Base64 エンコーディングによりファイルサイズが増加します。元のファイルを十分に小さく保ち、エンコード後の結果が 10 MB 未満になるようにしてください。
-
例:
data:audio/wav;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//PAxABQ/BXRbMPe4IQAhl9
-
-
Audio URL ( uploading your audio to OSS を推奨します)
-
ファイルサイズは 10 MB を超えないようにしてください。
-
URL は、認証なしでパブリックにアクセス可能である必要があります。
-
text
文字列
-
audio.dataの音声に対応するトランスクリプトです。このパラメーターを指定すると、サーバーは音声とテキストを比較します。差分が大きすぎる場合、Audio.PreprocessError が返されます。
language
文字列
-
audio.dataの音声の言語です。サポートされている値:
zh(中国語)、en(英語)、de(ドイツ語)、it(イタリア語)、pt(ポルトガル語)、es(スペイン語)、ja(日本語)、ko(韓国語)、fr(フランス語)、ru(ロシア語)、th(タイ語)、id(インドネシア語)、ar(アラビア語)、cs(チェコ語)、da(デンマーク語)、nl(オランダ語)、fi(フィンランド語)、he(ヘブライ語)、hi(ヒンディー語)、is(アイスランド語)、ms(マレー語)、no(ノルウェー語)、fa(ペルシャ語)、pl(ポーランド語)、sv(スウェーデン語)、tl(タガログ語)、tr(トルコ語)、ur(ウルドゥー語)、vi(ベトナム語)。中国語の方言:
Dongbei、Shannxi、Sichuan、Henan、Changsha、Tianjin、Hangzhou、Liaoning、Shenyang、Anshan。このパラメーターを使用する場合は、クローニングに使用する音声の実際の言語に設定してください。
-
-
レスポンスパラメーター
主要なレスポンスパラメーター:
パラメーター
タイプ
説明
voice
文字列
音声名です。リアルタイムマルチモーダルAPIの
voiceパラメーターには、この値をそのまま使用してください。target_model
文字列
音声を駆動する omni モデル:
-
qwen3.5-omni-plus-realtime
-
qwen3.5-omni-flash-realtime
後続のリアルタイムマルチモーダル API 呼び出しで使用するモデルと一致する必要があります。一致しない場合、合成に失敗します。
request_id
文字列
リクエスト ID です。
count
整数
このリクエストで課金される「create voice」操作の回数です。コストは $
です。 音声を作成する場合、count は常に 1 です。
-
-
サンプルコード
重要model:音声クローニングモデルです。qwen-voice-enrollmentに設定してください。target_model:音声を駆動する omni モデルです。後続のリアルタイムマルチモーダル API 呼び出しで使用するモデルと一致する必要があります。一致しない場合、合成に失敗します。curl
API キーを環境変数として設定していない場合は、例内の
$DASHSCOPE_API_KEYを実際の API キーに置き換える必要があります。# ======= 重要 ======= # シンガポールリージョンのURL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用してください。 # APIキーはリージョンによって異なります。APIキーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key # === 実行前にこのコメントは削除してください === curl --location --request POST 'https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization' \ --header 'Authorization: Bearer $DASHSCOPE_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "qwen-voice-enrollment", "input": { "action": "create", "target_model": "qwen3.5-omni-plus-realtime", "preferred_name": "your_voice_name", "audio": { "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/speaker_audio.wav" } } }'python
import os import requests # APIキーはリージョンによって異なります。APIキーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key # 環境変数を設定していない場合、次の行を `api_key = "sk-xxx"` に置き換えてください。 api_key = os.getenv("DASHSCOPE_API_KEY") # シンガポールリージョンのURL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用してください。 url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization" payload = { "model": "qwen-voice-enrollment", # 変更しないでください "input": { "action": "create", "target_model": "qwen3.5-omni-plus-realtime", "preferred_name": "your_voice_name", "audio": { # サンプル音声のURL。独自の音声ファイルを使用するには、ローカルファイルをアップロードするか、Data URLを使用してください。 "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/speaker_audio.wav" } } } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print("HTTP status:", response.status_code) if response.status_code == 200: data = response.json() voice_name = data["output"]["voice"] request_id = data["request_id"] print(f"Voice created successfully. Voice name: {voice_name}") print(f"Request ID: {request_id}") else: print("Request failed:", response.text)java
import com.google.gson.Gson; import com.google.gson.JsonObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) { // APIキーはリージョンによって異なります。APIキーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key // 環境変数を設定していない場合、次の行を「String apiKey = "sk-xxx"」に置き換えてください。 String apiKey = System.getenv("DASHSCOPE_API_KEY"); // シンガポールリージョンのURL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用してください。 String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"; // JSONリクエストボディ String jsonPayload = "{" + "\"model\": \"qwen-voice-enrollment\"," // 変更しないでください + "\"input\": {" + "\"action\": \"create\"," + "\"target_model\": \"qwen3.5-omni-plus-realtime\"," + "\"preferred_name\": \"your_voice_name\"," + "\"audio\": {" // サンプル音声のURL。独自の音声ファイルを使用するには、ローカルファイルをアップロードするか、Data URLを使用してください。 + "\"data\": \"https://dashscope.oss-cn-beijing.aliyuncs.com/audios/speaker_audio.wav\"" + "}" + "}" + "}"; try { HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Authorization", "Bearer " + apiKey); con.setRequestProperty("Content-Type", "application/json"); con.setDoOutput(true); try (OutputStream os = con.getOutputStream()) { os.write(jsonPayload.getBytes("UTF-8")); } int status = con.getResponseCode(); BufferedReader br = new BufferedReader(new InputStreamReader( status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(), "UTF-8")); StringBuilder response = new StringBuilder(); String line; while ((line = br.readLine()) != null) { response.append(line); } br.close(); System.out.println("HTTP status: " + status); System.out.println("Response JSON: " + response.toString()); if (status == 200) { Gson gson = new Gson(); JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class); JsonObject output = jsonObj.getAsJsonObject("output"); String voiceName = output.get("voice").getAsString(); String requestId = jsonObj.get("request_id").getAsString(); System.out.println("\nVoice created successfully."); System.out.printf("- Voice Name: %s\n", voiceName); System.out.printf("- Request ID: %s\n", requestId); } } catch (Exception e) { e.printStackTrace(); } } }
ボイスの一覧表示
ページネーションを使用して、作成済みのボイスを照会します。
-
URL
China (Beijing):
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customizationInternational (Singapore):
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization -
リクエストヘッダー
[パラメーター]
タイプ
必須
説明
Authorization
文字列
Bearer <your_api_key>形式の認証トークンです。<your_api_key>を実際の API キーに置き換えてください。Content-Type
文字列
リクエストボディのメディアタイプです。
application/jsonに設定してください。 -
リクエストパラメーター
パラメーター
タイプ
デフォルト
必須
説明
model
文字列
-
音声クローニングモデルです。
qwen-voice-enrollmentに設定してください。action
文字列
-
アクションタイプです。
listに設定してください。page_index
整数
0
ページ番号のインデックスです。有効な値:0~1,000,000。
page_size
整数
10
ページあたりの項目数です。有効な値:0~1,000,000。
-
レスポンスパラメーター
主要なレスポンスパラメーター:
パラメーター
タイプ
説明
voice
文字列
ボイス名です。この値は、リアルタイムマルチモーダル API の
voiceパラメーターにそのまま設定してください。gmt_create
文字列
ボイスが作成された時刻です。
target_model
文字列
音声を駆動する omni モデル:
-
qwen3.5-omni-plus-realtime
-
qwen3.5-omni-flash-realtime
-
qwen3.5-omni-plus
-
qwen3.5-omni-flash
後続の API 呼び出しで使用する omni モデルと一致する必要があります。一致しない場合、合成に失敗します。
request_id
文字列
リクエスト ID です。
count
整数
本リクエストは、「音声の作成」操作の実際の実行回数に基づいて課金されます。本リクエストの料金は $
です。 ボイスの一覧表示は無料です。
countは常に 0 です。 -
-
サンプルコード
重要model:音声クローニングモデル。値は固定でqwen-voice-enrollmentです。この値を変更しないでください。cURL
API キーを環境変数として設定していない場合は、例内の
$DASHSCOPE_API_KEYを実際の API キーに置き換える必要があります。# ======= 重要 ======= # シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用してください。 # API キーはリージョンごとに異なります。API キーの取得はこちら: https://www.alibabacloud.com/help/model-studio/get-api-key # === 実行前にこれらのコメントを削除してください === curl --location --request POST 'https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization' \ --header 'Authorization: Bearer $DASHSCOPE_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "qwen-voice-enrollment", "input": { "action": "list", "page_size": 10, "page_index": 0 } }'Python
import os import requests # API キーはリージョンごとに異なります。API キーの取得はこちら: https://www.alibabacloud.com/help/model-studio/get-api-key # 環境変数を設定していない場合、次の行を api_key = "sk-xxx" のように実際のキーに置き換えてください。 api_key = os.getenv("DASHSCOPE_API_KEY") # シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用してください。 url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization" payload = { "model": "qwen-voice-enrollment", # 変更しないでください "input": { "action": "list", "page_size": 10, "page_index": 0 } } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print("HTTP status:", response.status_code) if response.status_code == 200: data = response.json() voice_list = data["output"]["voice_list"] print("Voice list:") for item in voice_list: print(f"- Voice: {item['voice']} Created: {item['gmt_create']} Model: {item['target_model']}") else: print("Request failed:", response.text)Java
import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) { // API キーはリージョンごとに異なります。API キーの取得はこちら: https://www.alibabacloud.com/help/model-studio/get-api-key // 環境変数を設定していない場合、次の行を String apiKey = "sk-xxx" のように実際のキーに置き換えてください。 String apiKey = System.getenv("DASHSCOPE_API_KEY"); // シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用してください。 String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"; // JSON リクエストボディ String jsonPayload = "{" + "\"model\": \"qwen-voice-enrollment\"," // 変更しないでください + "\"input\": {" + "\"action\": \"list\"," + "\"page_size\": 10," + "\"page_index\": 0" + "}" + "}"; try { HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Authorization", "Bearer " + apiKey); con.setRequestProperty("Content-Type", "application/json"); con.setDoOutput(true); try (OutputStream os = con.getOutputStream()) { os.write(jsonPayload.getBytes("UTF-8")); } int status = con.getResponseCode(); BufferedReader br = new BufferedReader(new InputStreamReader( status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(), "UTF-8")); StringBuilder response = new StringBuilder(); String line; while ((line = br.readLine()) != null) { response.append(line); } br.close(); System.out.println("HTTP status: " + status); System.out.println("Response JSON: " + response.toString()); if (status == 200) { Gson gson = new Gson(); JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class); JsonArray voiceList = jsonObj.getAsJsonObject("output").getAsJsonArray("voice_list"); System.out.println("\n Voice list:"); for (int i = 0; i < voiceList.size(); i++) { JsonObject voiceItem = voiceList.get(i).getAsJsonObject(); String voice = voiceItem.get("voice").getAsString(); String gmtCreate = voiceItem.get("gmt_create").getAsString(); String targetModel = voiceItem.get("target_model").getAsString(); System.out.printf("- Voice: %s Created: %s Model: %s\n", voice, gmtCreate, targetModel); } } } catch (Exception e) { e.printStackTrace(); } } }
音声の削除
特定の音声を削除し、対応するクォータを解放します。
-
URL
China (Beijing):
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customizationInternational (Singapore):
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization -
リクエストヘッダー
[パラメーター]
タイプ
必須
説明
Authorization
文字列
Bearer <your_api_key>形式の認証トークンです。<your_api_key>を実際の API キーに置き換えてください。Content-Type
文字列
リクエストボディのメディアタイプです。
application/jsonに設定してください。 -
リクエストボディ
次のリクエストボディには、すべてのパラメーターが含まれています。必要に応じて任意のフィールドを省略できます。
重要model:音声クローニングモデル。値は固定でqwen-voice-enrollmentです。この値を変更しないでください。{ "model": "qwen-voice-enrollment", "input": { "action": "delete", "voice": "yourVoice" } } -
リクエストパラメーター
パラメーター
タイプ
デフォルト
必須
説明
model
string
-
音声クローンモデル。
qwen-voice-enrollmentに設定します。action
string
-
アクションタイプ。
deleteに設定します。voice
string
-
削除する音声です。
-
レスポンスパラメーター
主要なレスポンスパラメーター:
パラメーター
タイプ
説明
request_id
string
リクエスト ID です。
count
integer
本リクエストは、「音声の作成」操作の実際の実行回数に基づいて課金されます。本リクエストの料金は $
です。 Deleting a voice is free.
countis always 0. -
サンプルコード
重要model:音声クローニングモデル。値は固定でqwen-voice-enrollmentです。この値を変更しないでください。cURL
API キーを環境変数として設定していない場合は、例内の
$DASHSCOPE_API_KEYを実際の API キーに置き換える必要があります。# ======= 重要 ======= # シンガポールリージョンの URL。北京リージョンの場合: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # リージョンによって API キーが異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key # === 実行前にこれらのコメントを削除してください === curl --location --request POST 'https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization' \ --header 'Authorization: Bearer $DASHSCOPE_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "qwen-voice-enrollment", "input": { "action": "delete", "voice": "yourVoice" } }'Python
import os import requests # リージョンによって API キーが異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key # 環境変数を設定していない場合は、次の行を次のように置き換えてください: api_key = "sk-xxx" api_key = os.getenv("DASHSCOPE_API_KEY") # シンガポールリージョンの URL。中国 (北京) リージョンの場合は、次を使用します: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization" voice_to_delete = "yourVoice" # 実際の音声名に置き換えてください payload = { "model": "qwen-voice-enrollment", # 変更しないでください "input": { "action": "delete", "voice": voice_to_delete } } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print("HTTP status:", response.status_code) if response.status_code == 200: data = response.json() request_id = data["request_id"] print(f"削除に成功しました") print(f"Request ID: {request_id}") else: print("リクエストに失敗しました:", response.text)Java
import com.google.gson.Gson; import com.google.gson.JsonObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) { // リージョンによって API キーが異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key // 環境変数を設定していない場合は、次の行を次のように置き換えてください: String apiKey = "sk-xxx" String apiKey = System.getenv("DASHSCOPE_API_KEY"); // シンガポールリージョンの URL。中国 (北京) リージョンの場合は、次を使用します: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"; String voiceToDelete = "yourVoice"; // 実際の音声名に置き換えてください // JSON リクエストボディを作成します String jsonPayload = "{" + "\"model\": \"qwen-voice-enrollment\"," // 変更しないでください + "\"input\": {" + "\"action\": \"delete\"," + "\"voice\": \"" + voiceToDelete + "\"" + "}" + "}"; try { // POST 接続を作成します HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Authorization", "Bearer " + apiKey); con.setRequestProperty("Content-Type", "application/json"); con.setDoOutput(true); // リクエストボディを送信します try (OutputStream os = con.getOutputStream()) { os.write(jsonPayload.getBytes("UTF-8")); } int status = con.getResponseCode(); BufferedReader br = new BufferedReader(new InputStreamReader( status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(), "UTF-8")); StringBuilder response = new StringBuilder(); String line; while ((line = br.readLine()) != null) { response.append(line); } br.close(); System.out.println("HTTP status: " + status); System.out.println("Response JSON: " + response.toString()); if (status == 200) { Gson gson = new Gson(); JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class); String requestId = jsonObj.get("request_id").getAsString(); System.out.println("削除に成功しました"); System.out.println("Request ID: " + requestId); } } catch (Exception e) { e.printStackTrace(); } } }
会話での使用
会話でクローン音声を使用するには、「クイックスタート:音声のクローンと使用」をご参照ください。
ボイスのクォータと自動クリーンアップ
合計上限:1 アカウントあたり 1,000 ボイス
現在、API でボイス数を確認する機能は提供されていません。API を呼び出してボイス数をカウントしてください。
自動クリーンアップ:ボイスが 1 年間、いずれのモデル呼び出しリクエストでも使用されていない場合、システムによって自動的に削除されます。
課金
音声クローニングとモデルの呼び出しは、個別に課金されます:
-
音声クローニング:$0.01/ボイス で課金されます。作成に失敗した場合は課金されません。
説明無料クォータ (中国サイトの北京リージョンおよび国際サイトのシンガポールリージョンでのみ利用可能):
-
Alibaba Cloud Model Studio の有効化から 90 日以内は、1,000 回のボイス作成が無料になります。
-
作成に失敗しても、無料クォータは減りません。
-
ボイスを削除しても、無料クォータは復元されません。
-
無料クォータを使い切るか、90 日の期間が終了すると、ボイスの作成は$0.01/ボイス で課金されます。
-
-
クローン音声との会話:モデル呼び出し時のトークン使用量に基づいて課金されます。詳細については、「モデル推論の料金」をご参照ください。
著作権と法的コンプライアンス
お客様は、提供する音声の所有権および合法的な使用について責任を負います。サービス規約をお読みください。
録音ガイド
録音機材
ノイズキャンセリング機能付きのマイクを使用するか、静かな環境でスマートフォンを近距離で使用して録音し、クリアな音質を確保します。
録音環境
場所
-
10 平方メートル以下の小さな密閉空間で録音します。
-
吸音フォーム、カーペット、カーテンなどの吸音材がある部屋を選びます。
-
残響が大きい広いホール、会議室、教室は避けてください。
ノイズコントロール
-
屋外の騒音:ドアや窓を閉めて、交通、工事、その他の外部の音を遮断します。
-
屋内の騒音:エアコン、扇風機、蛍光灯の安定器の電源を切ります。
-
スマートフォンで環境音を録音し、大音量で再生して、隠れたノイズ源を特定します。
残響コントロール
-
残響は音声がこもって聞こえる原因となり、明瞭度を低下させます。
-
滑らかな表面からの反射を減らすには:カーテンを閉めて、クローゼットのドアを開けて、机や棚を衣類や毛布で覆います。
-
本棚や布張りの家具などの不規則な物体を使用して、拡散反射を作り出します。
台本の準備
-
台本をターゲットのユースケースに合わせます。例えば、カスタマーサービスのシナリオでは、カスタマーサービスの対話スタイルを使用します。
-
台本に機密情報や違法なコンテンツ (政治的、ポルノ、暴力的な内容など) が含まれていないことを確認してください。これらはクローニングの失敗の原因となります。
-
短いフレーズ (「こんにちは」や「はい」など) は避け、完全な文章を使用してください。
-
読み上げ中は、意味的な一貫性を保ち、頻繁に間を置くことは避けてください。中断なく 3 秒以上連続することを推奨します。
-
ターゲットの感情 (友好的、真面目など) を伝えることはできますが、過度に劇的または芝居がかった話し方は避けてください。自然な口調を保ってください。
推奨手順
一般的な寝室を例に説明します:
-
ドアと窓を閉めて、外部の騒音を遮断します。
-
エアコン、扇風機、その他の家電製品の電源を切ります。
-
ガラスの反射を減らすためにカーテンを閉めます。
-
机の表面を衣類や毛布で覆い、机の表面からの反射を減らします。
-
台本に慣れ、キャラクターの口調を設定し、自然に話します。
-
破裂音による歪みや信号の弱さを避けるため、録音デバイスから約 10 cm の距離を保ちます。
エラーメッセージ
エラーが発生した場合は、トラブルシューティングには「エラーメッセージ」をご参照ください。