トレーニングなしで 10~20 秒の音声から音声をクローンします。このドキュメントでは、音声クローニング API のパラメーターと使用方法について説明します。モデルの呼び出しについては、「 Qwen-Omni-Realtime 」または「 非リアルタイム (Qwen-Omni) 」をご参照ください。
重要このドキュメントは、Qwen-Omni および Qwen-Omni-Realtime の音声クローニング API にのみ適用されます。テキスト読み上げ (text-to-speech) モデルを使用する場合は、「音声合成」をご参照ください。
重要Alibaba Cloud Model Studio は、中国 (北京) およびシンガポールリージョン向けにワークスペース固有のドメインをリリースしました。新しい専用ドメインは、推論リクエストに対して優れたパフォーマンスと高い安定性を提供します。新しいドメインへの移行を推奨します。
- 中国 (北京):
https://dashscope.aliyuncs.comからhttps://{WorkspaceId}.cn-beijing.maas.aliyuncs.com - シンガポール:
https://dashscope-intl.aliyuncs.comからhttps://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com
{WorkspaceId} は、Alibaba Cloud Model Studio コンソールの [ワークスペース詳細] ページで確認できるワークスペース ID です。既存のドメインは引き続き完全に機能します。
音声の要件
高品質の入力音声を使用すると、より良いクローニング結果が得られます。
項目 | 要件 |
|---|---|
サポート形式 | WAV (16-bit)、MP3、M4A |
長さ | 10~20 秒を推奨します。最大:60 秒。 |
ファイルサイズ | < 10 MB |
サンプルレート | >= 24 kHz |
チャンネル | Mono |
コンテンツ | 音声には、バックグラウンドノイズのない、3 秒以上の連続したクリアなスピーチが含まれている必要があります。残りの部分には、短い無音 (2 秒以下) が含まれていてもかまいません。音声全体を通して、BGM、ノイズ、または他の声は避けてください。通常の話し言葉の音声をインプットとして使用してください。歌や歌唱の音声はアップロードしないでください。 |
言語 | 中国語 (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. ワークフロー
音声クローニングは、「最初に作成し、次に使用する」というワークフローに従います。
-
音声の作成
音声の作成 API を呼び出し、音声クリップをアップロードします。システムは音声を分析し、カスタムのクローン音声を作成します。このステップでは、どの Omni モデルが音声を駆動するかを宣言するために、
target_modelを指定する必要があります。すでに作成済みの音声がある場合 (確認するには 音声のリスト表示 API を呼び出します)、このステップをスキップして次のステップに進みます。
-
会話で音声を使用する
Omni API (リアルタイムまたは非リアルタイム) を呼び出し、前のステップで取得した音声を渡します。このステップで指定された Omni モデルは、前のステップの
target_modelと一致する必要があります。
2. モデル構成と前提条件
開始する前に、モデルを選択し、前提条件を完了してください。
モデル構成
音声クローニングには 2 つのモデルが必要です。
-
音声クローニングモデル:qwen-voice-enrollment
-
音声を駆動する Omni モデル:
- qwen3.8-omni-flash-realtime
- 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 API 呼び出しのモデルと一致する必要があります。そうでない場合、合成は失敗します。サンプルファイルの voice.mp3 をご自身の音声に置き換えてください。
リアルタイム
Qwen3.5-Omni-Realtime シリーズモデルに適用可能です。詳細については、「Qwen-Omni-Realtime」をご参照ください。
# 要件: 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
# 中国 (北京) リージョン。{WorkspaceId} をお使いの Model Studio のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
dashscope.base_http_api_url = "https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1"
# ======= 設定 =======
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 キーが異なります。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"音声ファイルが見つかりません: {file_path}")
base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"
# 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
url = "https://{WorkspaceId}.ap-southeast-1.maas.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"音声の作成に失敗しました: {resp.status_code}, {resp.text}")
try:
return resp.json()["output"]["voice"]
except (KeyError, ValueError) as e:
raise RuntimeError(f"音声レスポンスの解析に失敗しました: {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"[ユーザー] {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")
# 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
url = "wss://{WorkspaceId}.ap-southeast-1.maas.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会話が終了しました")
import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
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 {
// 中国 (北京) リージョン。{WorkspaceId} をお使いの Model Studio のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
Constants.baseHttpApiUrl = "https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1";
// ===== 定数 =====
// 音声クローニングとリアルタイム会話で同じモデルを使用
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 キーが異なります。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 です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
String url = "https://{WorkspaceId}.ap-southeast-1.maas.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("音声の作成に失敗しました: " + 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 キーが異なります。API キーの取得方法:https://www.alibabacloud.com/help/model-studio/get-api-key
// 環境変数を設定していない場合は、次の行を `.apikey("sk-xxx")` に置き換えてください。
.apikey(System.getenv("DASHSCOPE_API_KEY"))
// 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
.url("wss://{WorkspaceId}.ap-southeast-1.maas.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("[ユーザー] " + 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, "Normal exit");
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)」をご参照ください。
# 要件: dashscope >= 1.23.9, soundfile, numpy
import os
import requests
import base64
import pathlib
import numpy as np
import soundfile as sf
import dashscope
# 中国 (北京) リージョン。{WorkspaceId} をお使いの Model Studio のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
dashscope.base_http_api_url = "https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1"
# ======= 設定 =======
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"音声ファイルが見つかりません: {file_path}")
base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"
# 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
url = "https://{WorkspaceId}.ap-southeast-1.maas.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"音声の作成に失敗しました: {resp.status_code}, {resp.text}")
try:
return resp.json()["output"]["voice"]
except (KeyError, ValueError) as e:
raise RuntimeError(f"音声レスポンスの解析に失敗しました: {e}")
if __name__ == '__main__':
# 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
# 1. 音声クローニング:カスタム音声を作成
voice = create_voice(VOICE_FILE_PATH)
print(f"音声クローニングが完了しました。音声: {voice}")
# 2. クローンした音声での非リアルタイム会話
messages = [{"role": "user", "content": [{"text": "こんにちは、自己紹介をお願いします"}]}]
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("モデルの応答:")
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("\n音声が保存されました: audio_cloned.wav")
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 です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
String url = "https://{WorkspaceId}.ap-southeast-1.maas.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("音声の作成に失敗しました: " + 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);
// 2. クローンした音声での非リアルタイム会話 (OpenAI 互換 API)
String requestBody = "{"
+ "\"model\": \"" + TARGET_MODEL + "\","
+ "\"messages\": [{\"role\": \"user\", \"content\": \"こんにちは、自己紹介をお願いします\"}],"
+ "\"modalities\": [\"text\", \"audio\"],"
+ "\"audio\": {\"voice\": \"" + voice + "\", \"format\": \"wav\"},"
+ "\"stream\": true,"
+ "\"stream_options\": {\"include_usage\": true}"
+ "}";
// 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
String url = "https://{WorkspaceId}.ap-southeast-1.maas.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("モデルの応答:");
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("\n音声が保存されました: audio_cloned.wav");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
API リファレンス
すべての API で同じアカウントを使用してください。
音声の作成
クローニング用の音声をアップロードし、カスタム音声を作成します。
-
URL
中国北部 2 (北京):
POST https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/audio/tts/customization
シンガポール:
POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/tts/customization
-
リクエストヘッダー
パラメーター
型
必須
説明
Authorization
string
はい
認証トークン。フォーマットは
Bearer <your_api_key>です。<your_api_key>を実際の API キーに置き換えてください。Content-Type
string
はい
リクエストボディのメディアタイプ。
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": "任意。audio.data 内の音声のトランスクリプト。",
"language": "任意。audio.data 内の音声の言語。例:zh。"
},
"parameters": {
"voice_clone_mode": "normal",
"skip_audio_process": false
}
}
-
リクエストパラメーター
パラメーター 型 デフォルト値 必須 説明 model
string
はい
音声クローニングモデル。
qwen-voice-enrollmentに設定します。action
string
はい
アクションタイプを
createに設定します。target_model
string
対応
音声を駆動する Omni モデル:
- qwen3.8-omni-flash-realtime
- qwen3.5-omni-plus-realtime
- qwen3.5-omni-flash-realtime
- qwen3.5-omni-plus
- qwen3.5-omni-flash
これは、後続の API 呼び出しで使用される Omni モデルと一致する必要があります。そうでない場合、合成は失敗します。
preferred_name
string
はい
音声の人間が読める名前。使用可能な文字:数字、文字、アンダースコア。最大:16 文字。
このキーワードは最終的な音声名に表示されます。例えば、キーワードが "guanyu" の場合、結果の音声名は "qwen-omni-vc-guanyu-voice-20250812105009984-838b" となります。
audio.data
string
対応
クローニング用の音声 (録音時には録音ガイドに従い、音声が音声の要件を満たしていることを確認してください)。
音声データは、以下のいずれかの方法で送信します。
-
フォーマット:
data:<mediatype>;base64,<data>-
<mediatype>:MIME タイプ- WAV:
audio/wav - MP3:
audio/mpeg - M4A:
audio/mp4
- WAV:
-
<data>:音声の Base64 エンコードされた文字列Base64 エンコーディングはファイルサイズを増加させます。エンコード後の結果が 10 MB 未満になるようにしてください。
-
例:
data:audio/wav;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//PAxABQ/BXRbMPe4IQAhl9サンプルコードの表示
import base64, pathlib # input.mp3 は音声クローニング用のローカル音声ファイルです。ご自身のファイルパスに置き換えてください。ファイルが音声要件を満たしていることを確認してください。 file_path = pathlib.Path("input.mp3") base64_str = base64.b64encode(file_path.read_bytes()).decode() data_uri = f"data:audio/mpeg;base64,{base64_str}"import java.nio.file.*; import java.util.Base64; public class Main { /** * filePath は音声クローニング用のローカル音声ファイルです。ご自身のファイルパスに置き換えてください。ファイルが音声要件を満たしていることを確認してください。 */ public static String toDataUrl(String filePath) throws Exception { byte[] bytes = Files.readAllBytes(Paths.get(filePath)); String encoded = Base64.getEncoder().encodeToString(bytes); return "data:audio/mpeg;base64," + encoded; } // 使用例 public static void main(String[] args) throws Exception { System.out.println(toDataUrl("input.mp3")); } }
-
-
音声 URL (音声を OSS にアップロードすることを推奨します)
- ファイルサイズは 10 MB を超えてはなりません。
- URL は認証なしで公開アクセス可能でなければなりません。
text
string
非対応
audio.data内の音声と一致するトランスクリプト。提供された場合、サーバーは音声をテキストと照合して検証します。不一致が大きすぎる場合、Audio.PreprocessError が返されます。
language
string
非対応
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(ベトナム語)。中国語の方言:
東北、陝西、四川、河南、長沙、天津、杭州、遼寧、瀋陽、鞍山。これをクローニングに使用する音声の実際の言語に設定してください。
-
レスポンスパラメーター
レスポンス例の表示
{ "output": { "voice": "yourVoice", "target_model": "qwen3.5-omni-plus-realtime" }, "usage": { "count": 1 }, "request_id": "yourRequestId" }主要なレスポンスパラメーター:
パラメーター
型
説明
voice
string
音声名。この値をリアルタイムマルチモーダル API の
voiceパラメーターとして直接使用します。target_model
string
音声を駆動する Omni モデル:
qwen3.8-omni-flash-realtime
qwen3.5-omni-plus-realtime
qwen3.5-omni-flash-realtime
これは、後続のリアルタイムマルチモーダル API 呼び出しで使用されるモデルと一致する必要があります。そうでない場合、合成は失敗します。
request_id
string
リクエスト ID。
count
integer
このリクエストに対して課金される「音声作成」操作の数。コストは $ count × 0.01 です。
音声を作成する場合、count は常に 1 です。
-
サンプルコード
重要
model: 音声クローニングモデル。qwen-voice-enrollmentに設定します。target_model:音声を駆動する Omni モデル。これは、後続のリアルタイムマルチモーダル API 呼び出しで使用されるモデルと一致する必要があります。そうでない場合、合成は失敗します。curl
API キーを環境変数として設定していない場合は、例の
$DASHSCOPE_API_KEYを実際の API キーに置き換える必要があります。# ======= 重要 ======= # 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 # リージョンによって API キーが異なります。API キーの取得方法:https://www.alibabacloud.com/help/model-studio/get-api-key # === 実行前にこれらのコメントを削除してください === curl --location --request POST 'https://{WorkspaceId}.ap-southeast-1.maas.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 です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 url = "https://{WorkspaceId}.ap-southeast-1.maas.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 ステータス:", response.status_code) if response.status_code == 200: data = response.json() voice_list = data["output"]["voice_list"] print("音声リスト:") for item in voice_list: print(f"- 音声: {item['voice']} 作成日時: {item['gmt_create']} モデル: {item['target_model']}") else: print("リクエストに失敗しました:", 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 です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 String apiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.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); System.out.println("レスポンス 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 音声リスト:"); 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("- 音声: %s 作成日時: %s モデル: %s\n", voice, gmtCreate, targetModel); } } } catch (Exception e) { e.printStackTrace(); } } }
音声のリスト表示
作成した音声をページネーションで照会します。
-
URL
中国北部 2 (北京):
POST https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/audio/tts/customization
シンガポール:
POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/tts/customization
-
リクエストヘッダー
パラメーター
型
必須
説明
Authorization
string
はい
認証トークン。フォーマットは
Bearer <your_api_key>です。<your_api_key>を実際の API キーに置き換えてください。Content-Type
string
はい
リクエストボディのメディアタイプ。
application/jsonに設定します。 -
リクエストパラメーター
パラメーター
型
デフォルト値
必須
説明
model
string
-
対応
音声クローニングモデル。
qwen-voice-enrollmentに設定します。action
string
-
対応
アクションタイプ。
listに設定します。page_index
integer
0
非対応
ページ番号インデックス。有効な値:0~1,000,000。
page_size
integer
10
非対応
1ページあたりのアイテム数。有効な値:0~1,000,000。
-
レスポンスパラメーター
レスポンス例の表示
{ "output": { "voice_list": [ { "voice": "yourVoice1", "gmt_create": "2025-08-11 17:59:32", "target_model": "qwen3.5-omni-plus-realtime" }, { "voice": "yourVoice2", "gmt_create": "2025-08-11 17:38:10", "target_model": "qwen3.5-omni-plus-realtime" } ] }, "usage": { "count": 0 }, "request_id": "yourRequestId" }主要なレスポンスパラメーター:
パラメーター
型
説明
voice
string
音声名。この値をリアルタイムマルチモーダル API の
voiceパラメーターで直接使用します。gmt_create
string
音声が作成された時刻。
target_model
string
音声を駆動する Omni モデル:
qwen3.8-omni-flash-realtime
qwen3.5-omni-plus-realtime
qwen3.5-omni-flash-realtime
qwen3.5-omni-plus
qwen3.5-omni-flash
これは、後続の API 呼び出しで使用される Omni モデルと一致する必要があります。そうでない場合、合成は失敗します。
request_id
string
リクエスト ID。
count
integer
このリクエストは、実際の「音声作成」操作の数に基づいて課金されます。このリクエストのコストは $ count × 0.01 です。
音声のリスト表示は無料です。
countは常に 0 です。 -
サンプルコード
重要
model:音声クローニングモデル。値はqwen-voice-enrollmentに固定されています。この値を変更しないでください。cURL
API キーを環境変数として設定していない場合は、例の
$DASHSCOPE_API_KEYを実際の API キーに置き換える必要があります。# ======= 重要 ======= # 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 # リージョンによって API キーが異なります。API キーの取得方法:https://www.alibabacloud.com/help/model-studio/get-api-key # === 実行前にこれらのコメントを削除してください === curl --location --request POST 'https://{WorkspaceId}.ap-southeast-1.maas.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 です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 url = "https://{WorkspaceId}.ap-southeast-1.maas.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 ステータス:", response.status_code) if response.status_code == 200: data = response.json() voice_list = data["output"]["voice_list"] print("音声リスト:") for item in voice_list: print(f"- 音声: {item['voice']} 作成日時: {item['gmt_create']} モデル: {item['target_model']}") else: print("リクエストに失敗しました:", 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 です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 String apiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.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); System.out.println("レスポンス 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 音声リスト:"); 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("- 音声: %s 作成日時: %s モデル: %s\n", voice, gmtCreate, targetModel); } } } catch (Exception e) { e.printStackTrace(); } } }
音声の削除
特定の音声を削除し、対応するクォータを解放します。
-
URL
中国北部 2 (北京):
POST https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/audio/tts/customization
シンガポール:
POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/tts/customization
-
リクエストヘッダー
パラメーター
型
必須
説明
Authorization
string
はい
認証トークン。フォーマットは
Bearer <your_api_key>です。<your_api_key>を実際の API キーに置き換えてください。Content-Type
string
はい
リクエストボディのメディアタイプには、
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
-
対応
削除する音声。
-
レスポンスパラメーター
レスポンス例の表示
{ "usage": { "count": 0 }, "request_id": "yourRequestId" }主要なレスポンスパラメーター:
パラメーター
型
説明
request_id
string
リクエスト ID。
count
integer
このリクエストは、実際の「音声作成」操作の数に基づいて課金されます。このリクエストのコストは $ count × 0.01 です。
音声の削除は無料です。
countは常に 0 です。 -
サンプルコード
重要
model:音声クローニングモデル。値はqwen-voice-enrollmentに固定されています。この値を変更しないでください。cURL
API キーを環境変数として設定していない場合は、例の
$DASHSCOPE_API_KEYを実際の API キーに置き換える必要があります。# ======= 重要 ======= # 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 # リージョンによって API キーが異なります。API キーの取得方法:https://www.alibabacloud.com/help/model-studio/get-api-key # === 実行前にこれらのコメントを削除してください === curl --location --request POST 'https://{WorkspaceId}.ap-southeast-1.maas.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 です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 url = "https://{WorkspaceId}.ap-southeast-1.maas.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 ステータス:", response.status_code) if response.status_code == 200: data = response.json() request_id = data["request_id"] print(f"正常に削除されました") print(f"リクエスト 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 です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。 String apiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.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); System.out.println("レスポンス 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("リクエスト ID: " + requestId); } } catch (Exception e) { e.printStackTrace(); } } }
会話での使用
クローンした音声を会話で使用するには、「クイックスタート」をご参照ください。
音声クォータと自動クリーンアップ
合計制限:アカウントごとに 1,000 音声。
専用のカウントエンドポイントは存在しません。音声数をカウントするには、音声のリスト表示 API を呼び出してください。
自動クリーンアップ:1 年間使用されなかった音声は自動的に削除されます。
課金
音声クローニングとモデル呼び出しは別々に課金されます。
-
音声クローニング:$0.01/音声で課金されます。作成に失敗した場合は課金されません。
注記無料クォータ (中国サイトの北京リージョンおよび国際サイトのシンガポールリージョンのみ):
- Model Studio をアクティベートしてから 90 日以内に 1,000 回の無料音声作成。
- 作成に失敗しても無料クォータは消費されません。
- 音声を削除しても無料クォータは復元されません。
- 無料クォータを使い切るか、90 日間の期間が終了すると、音声作成は $0.01/音声で課金されます。
-
クローンした音声での会話:モデル呼び出しのトークン使用量に基づいて課金されます。詳細については、「モデル推論の料金」をご参照ください。
著作権および法的コンプライアンス
提供する音声の所有権と合法的な使用については、お客様が責任を負うものとします。利用規約をお読みください。
録音ガイド
録音機材
ノイズキャンセリングマイクを使用するか、静かな環境でスマートフォンを近距離で使用して録音してください。
録音環境
場所
- 10 平方メートル以下の小さな密閉空間で録音してください。
- 吸音フォーム、カーペット、カーテンなどの吸音材がある部屋を選んでください。
- 残響の多い広いホール、会議室、教室は避けてください。
ノイズコントロール
- 屋外の騒音:ドアや窓を閉めて、交通、建設、その他の外部の音を遮断してください。
- 屋内の騒音:エアコン、扇風機、蛍光灯の安定器をオフにしてください。
- スマートフォンで環境音を録音し、大音量で再生して隠れた騒音源を特定してください。
残響コントロール
- 残響は音声がこもって聞こえ、明瞭度を低下させます。
- 滑らかな表面からの反射を減らす:カーテンを閉め、クローゼットのドアを開け、机や棚を衣類や毛布で覆ってください。
- 本棚や布張りの家具などの不規則なオブジェクトを使用して、拡散反射を作り出してください。
スクリプトの準備
- ターゲットのユースケースに合わせてスクリプトを作成してください。例えば、カスタマーサービスシナリオには、カスタマーサービスの対話スタイルを使用します。
- スクリプトに政治的、ポルノ、暴力的などの機密または違法なコンテンツが含まれていないことを確認してください。これらはクローニングの失敗の原因となります。
- 「こんにちは」や「はい」などの短いフレーズは避け、完全な文章を使用してください。
- 意味的な一貫性を保ち、頻繁な間を避けて読んでください。中断なしに最低 3 秒間連続することが推奨されます。
- フレンドリーまたは真面目など、ターゲットの感情を伝えることはできますが、過度に劇的または芝居がかった表現は避けてください。自然なトーンを保ってください。
推奨手順
一般的な寝室を例に挙げます。
- 外部の騒音を遮断するためにドアと窓を閉めます。
- エアコン、扇風機、その他の電化製品の電源を切ります。
- ガラスの反射を減らすためにカーテンを閉めます。
- 机の表面を衣類や毛布で覆うと、反射を軽減できます。
- スクリプトに慣れ、キャラクターのトーンを設定し、自然に話します。
- 破裂音による歪みや信号の弱さを避けるため、録音デバイスから約 10 cm の距離を保ちます。
エラーメッセージ
エラーが発生した場合は、「エラーコード」を参照してトラブルシューティングを行ってください。