本教程将带你快速掌握如何使用 DashScope 的 SpeechSynthesizer
类实现语音合成,涵盖三种调用方式(同步、异步、流式),附带完整代码示例和关键注意事项。
确保已安装 Python 3.7+,并通过 pip 安装 DashScope SDK:
pip install dashscope
若需流式调用实时播放音频(如示例中的 pyaudio
),还需安装:
brew install portaudio && pip install pyaudio
sudo apt-get install python-pyaudio python3-pyaudio && pip install pyaudio
pip install pyaudio
API Key
。import dashscope
dashscope.api_key = "your-api-key" # 替换为你的实际 Key
用于语音合成的核心类,初始化时需指定关键参数:
from dashscope.audio.tts_v2 import SpeechSynthesizer
synthesizer = SpeechSynthesizer(
model="cosyvoice-v2", # 模型名称(必填)
voice="longxiaochun_v2", # 音色(必填)
format=AudioFormat.PCM_22050HZ_MONO_16BIT # 仅流式调用需指定音频格式
)
关键参数:
参数 | 说明 |
---|---|
model |
使用的模型(如 cosyvoice-v2 ) |
voice |
音色(如 longxiaochun_v2 ) |
format |
音频格式(流式调用需设为 PCM_22050HZ_MONO_16BIT ,其他调用方式可忽略) |
特点:
代码示例:
from dashscope.audio.tts_v2 import SpeechSynthesizer
# 初始化合成器
synthesizer = SpeechSynthesizer(model="cosyvoice-v2", voice="longxiaochun_v2")
# 同步调用:提交文本,获取二进制音频
audio_data = synthesizer.call("今天天气怎么样?") # 文本长度需 ≤2000 字符
# 保存音频到本地
with open("output_sync.mp3", "wb") as f:
f.write(audio_data)
# 打印请求指标
print(f"[Metric] 请求ID: {synthesizer.get_last_request_id()}, 首包延迟: {synthesizer.get_first_package_delay()}毫秒")
特点:
ResultCallback
接口,以回调方式逐步接收音频数据流。代码示例:
from dashscope.audio.tts_v2 import SpeechSynthesizer, ResultCallback
from datetime import datetime
# 自定义回调类:将音频写入文件
class AudioFileCallback(ResultCallback):
def __init__(self):
self.file = None
def on_open(self):
print("连接建立")
self.file = open("output_async.mp3", "wb")
def on_complete(self):
print("语音合成完成")
def on_error(self, message: str):
print(f"合成异常: {message}")
def on_close(self):
print("连接关闭")
if self.file:
self.file.close()
def on_data(self, data: bytes) -> None:
self.file.write(data)
print(f"收到音频数据块,长度: {len(data)} 字节")
# 初始化回调与合成器
callback = AudioFileCallback()
synthesizer = SpeechSynthesizer(
model="cosyvoice-v2",
voice="longxiaochun_v2",
callback=callback # 绑定回调接口
)
# 触发合成(音频通过回调逐步写入文件)
synthesizer.call("今天天气怎么样?")
# 打印请求指标
print(f"[Metric] 请求ID: {synthesizer.get_last_request_id()}, 首包延迟: {synthesizer.get_first_package_delay()}毫秒")
特点:
关键限制:
streaming_call
提交的文本长度 ≤2000 字符。streaming_complete()
结束任务,否则结尾文本可能无法合成!代码示例:
import time
import pyaudio
from dashscope.audio.tts_v2 import SpeechSynthesizer, ResultCallback, AudioFormat
# 自定义回调类:实时播放音频
class AudioPlayCallback(ResultCallback):
def __init__(self):
self._player = None
self._stream = None
def on_open(self):
print("连接建立")
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("连接关闭")
if self._stream:
self._stream.stop_stream()
self._stream.close()
if self._player:
self._player.terminate()
def on_data(self, data: bytes) -> None:
self._stream.write(data)
print(f"收到音频数据块,长度: {len(data)} 字节")
# 初始化回调与合成器
callback = AudioPlayCallback()
synthesizer = SpeechSynthesizer(
model="cosyvoice-v2",
voice="longxiaochun_v2",
format=AudioFormat.PCM_22050HZ_MONO_16BIT, # 流式调用必须指定格式
callback=callback
)
# 待合成的长文本(分片)
test_text = [
"流式文本语音合成SDK,",
"可以将输入的文本",
"合成为语音二进制数据,",
"相比于非流式语音合成,",
"流式合成的优势在于实时性",
"更强。用户在输入文本的同时",
"可以听到接近同步的语音输出,",
"极大地提升了交互体验,",
"减少了用户等待时间。",
"适用于调用大规模",
"语言模型(LLM),以",
"流式输入文本的方式",
"进行语音合成的场景。",
]
# 分片提交文本(每次调用 streaming_call)
for text in test_text:
synthesizer.streaming_call(text) # 提交文本片段
time.sleep(0.1) # 模拟处理间隔(需控制间隔 ≤23秒)
# 结束任务(必须调用!否则结尾文本可能无法合成)
synthesizer.streaming_complete()
# 打印请求指标
print(f"[Metric] 请求ID: {synthesizer.get_last_request_id()}, 首包延迟: {synthesizer.get_first_package_delay()}毫秒")
API Key 配置
dashscope.api_key
。文本长度限制
streaming_call
≤2000 字符,累计 ≤20 万字符。超时机制
streaming_call
的间隔不得超过 23 秒,否则触发超时异常。必须调用 streaming_complete()
音频格式兼容性
format=AudioFormat.PCM_22050HZ_MONO_16BIT
,其他调用方式无需指定。场景 | 推荐调用方式 |
---|---|
短文本、离线生成音频文件 | 同步调用 |
短文本、需实时播放音频 | 异步调用 |
长文本、需实时流式播放 | 流式调用 |