本文介绍如何使用阿里云智能语音服务提供的Python SDK,包括SDK的安装方法及SDK代码示例。
前提条件
获取鉴权需要的Appkey以及Token。具体操作,请参见管理项目和通过SDK获取Token。
如果通过SDK方式接入,需要下载安装SDK。具体操作,请参见快速开始。
下载安装
下载Python SDK。
从Github获取Python SDK,或直接下载streamInputTts-github-python。
安装SDK依赖。
进入SDK根目录使用如下命令安装SDK依赖:
python -m pip install -r requirements.txt
安装SDK。
依赖安装完成后使用如下命令安装SDK:
python -m pip install .
安装完成后通过以下代码导入SDK。
# -*- coding: utf-8 -*-
import nls
上述命令均需要在SDK根目录中执行。
关键接口
startStreamInputTts:与服务端进行websocket建连操作,并完成回调、参数设置等操作
""" 发起长文本合成任务,同步接收服务端确认 Parameters: ----------- text: str utf-8 text, support ssml voice: str voice for text-to-speech, default is xiaoyun aformat: str audio binary format, support: 'pcm', 'wav', 'mp3', default is 'pcm' sample_rate: int audio sample rate, default is 24000, support:8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000 volume: int audio volume, from 0~100, default is 50 speech_rate: int speech rate from -500~500, default is 0 pitch_rate: int pitch for voice from -500~500, default is 0 ex: dict dict which will merge into 'payload' field in request """ def startTts( self, text, voice="longxiaochun", aformat="pcm", sample_rate=24000, volume=50, speech_rate=0, pitch_rate=0, ex:dict=None, )
waitForComplete:以阻塞的方式等待语音合成结束,并与服务端断开websocket连接
""" 等待语音合成结束 """ def waitForComplete(self)
回调函数说明
Python回调函数在创建对象时作为参数配置,说明见下表:
参数
参数说明
on_data
当存在合成数据后的回调参数。回调参数包含以下两个:
对应start方法中aformat的二进制音频数据
用户自定义参数
其中,用户自定义参数为下方callback_args字段中返回的参数内容。
on_sentence_begin
收到SentenceBegin事件时回调。回调参数包含以下两个
JSON形式的字符串
用户自定义参数
其中,用户自定义参数为下方callback_args字段中返回的参数内容。
on_sentence_synthesis
时间戳预留接口。CosyVoice目前不支持时间戳功能,不需处理。
on_sentence_end
时间戳预留接口,CosyVoice目前不支持时间戳功能,不需处理。
on_complete
时间戳预留接口,CosyVoice目前不支持时间戳功能,不需处理。
on_error
当SDK或云端出现错误时的回调参数。回调参数包含以下两个:
JSON形式的字符串
用户自定义参数
其中,用户自定义参数为下方callback_args字段中返回的参数内容。
on_close
当和云端连接断开时的回调参数。回调参数为用户自定义参数,即用户自定义参数为下方callback_args字段中返回的参数内容。
调用示例
以下Python代码示例使用了带有SSML文本输入请求语音合成,使用扬声器进行音频播放并保存。
代码运行前需要替换 your-appkey 以及 your-token。
# coding=utf-8
#
# Installation instructions for pyaudio:
# APPLE Mac OS X
# brew install portaudio
# pip install pyaudio
# Debian/Ubuntu
# sudo apt-get install python-pyaudio python3-pyaudio
# or
# pip install pyaudio
# CentOS
# sudo yum install -y portaudio portaudio-devel && pip install pyaudio
# Microsoft Windows
# python -m pip install pyaudio
import nls
import time
# 设置打开日志输出
nls.enableTrace(False)
# 将音频保存进文件
SAVE_TO_FILE = True
# 将音频通过播放器实时播放,需要具有声卡。在服务器上运行请将此开关关闭
PLAY_REALTIME_RESULT = True
if PLAY_REALTIME_RESULT:
import pyaudio
if __name__ == "__main__":
if SAVE_TO_FILE:
file = open("output.wav", "wb")
if PLAY_REALTIME_RESULT:
player = pyaudio.PyAudio()
stream = player.open(
format=pyaudio.paInt16, channels=1, rate=24000, output=True
)
# 创建SDK实例
# 配置回调函数
def test_on_data(data, *args):
if SAVE_TO_FILE:
file.write(data)
if PLAY_REALTIME_RESULT:
stream.write(data)
def test_on_message(message, *args):
print("on message=>{}".format(message))
def test_on_close(*args):
print("on_close: args=>{}".format(args))
def test_on_error(message, *args):
print("on_error message=>{} args=>{}".format(message, args))
sdk = nls.NlsStreamInputTtsSynthesizer(
# 由于目前阶段大模型音色只在北京地区服务可用,因此需要调整url到北京
url="wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1",
token="your-token",
appkey="your-appkey",
on_data=test_on_data,
on_sentence_begin=test_on_message,
on_sentence_synthesis=test_on_message,
on_sentence_end=test_on_message,
on_completed=test_on_message,
on_error=test_on_error,
on_close=test_on_close,
callback_args=[],
)
# 发送文本消息
sdk.startTts(
text='''<speak bgm="http://nls.alicdn.com/bgm/2.wav">今天天气怎么样</speak>''',
voice="longxiaochun_v2", # 语音合成说话人
aformat="wav", # 合成音频格式
sample_rate=24000, # 合成音频采样率
volume=50, # 合成音频的音量
speech_rate=0, # 合成音频语速
pitch_rate=0, # 合成音频的音调
)
sdk.waitForComplete()
print('finished, task_id: {}'.format(sdk.get_last_task_id()))
if SAVE_TO_FILE:
file.close()
if PLAY_REALTIME_RESULT:
stream.stop_stream()
stream.close()
player.terminate()
常见SDK错误码
更多错误码详情参见错误码查询。