使用语音合成 Node.js SDK 将文本转换为音频,并通过回调接收合成数据。本页提供安装方法、完整调用示例,以及连接配置、合成参数和事件说明。
前提条件
安装 SDK
在项目目录中安装 SDK:
npm install alibabacloud-nls
代码示例使用 CommonJS 导入 SDK。ES Module 项目可以使用命名导入:
import { SpeechSynthesizer } from "alibabacloud-nls";
代码示例
示例使用 alibabacloud-nls 1.0.4,完成一次短文本合成,将音频保存到程序工作目录中的 output.wav。运行前,在程序运行环境中设置 NLS_APP_KEY 和 NLS_TOKEN,分别用于项目 Appkey 和访问 Token。
"use strict";
const fs = require("fs/promises");
const Nls = require("alibabacloud-nls");
async function main() {
const appkey = process.env.NLS_APP_KEY;
const token = process.env.NLS_TOKEN;
if (!appkey || !token) {
throw new Error("Set NLS_APP_KEY and NLS_TOKEN.");
}
const client = new Nls.SpeechSynthesizer({
url: "wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1",
appkey,
token
});
const params = client.defaultStartParams("aixia");
params.text = "欢迎使用智能语音交互。";
const chunks = [];
let timer;
let finished = false;
client.on("data", (data) => chunks.push(data));
client.on("meta", (message) => console.log("Subtitle:", message));
client.on("completed", () => { finished = true; });
try {
await new Promise((resolve, reject) => {
timer = setTimeout(() => reject(new Error("Synthesis timed out.")), 60000);
client.on("failed", (message) => reject(new Error(message)));
client.on("closed", () => {
if (!finished) reject(new Error("Connection closed before completion."));
});
client.start(params, true, 6000).then(resolve, reject);
});
await fs.writeFile("output.wav", Buffer.concat(chunks));
console.log("Saved output.wav");
} finally {
clearTimeout(timer);
client.shutdown();
}
}
main().catch((error) => {
console.error(error.message || error);
process.exitCode = 1;
});
接口与参数
SpeechSynthesizer
SpeechSynthesizer 类用于语音合成,通过构造函数传入连接配置:
const client = new Nls.SpeechSynthesizer({ url, appkey, token });
|
参数 |
类型 |
说明 |
|
|
Object |
连接配置对象,包含以下必填字段。 |
|
|
String |
服务地址,需显式配置。示例使用 |
|
|
String |
项目 Appkey。 |
|
|
String |
访问 Token。 |
合成参数
在调用 start(params) 前设置合成参数。
|
参数 |
类型 |
必填 |
说明 |
|
|
String |
是 |
待合成文本,采用 UTF-8 编码,长度不超过 300 个字符。英文文本按正常单词间隔书写。 |
|
|
String |
否 |
发音人。省略该字段时,服务端使用 |
|
|
String |
否 |
音频编码格式,支持 |
|
|
Integer |
否 |
音频采样率,默认 16000 Hz。 |
|
|
Integer |
否 |
音量,取值范围为 0~100,默认 50。 |
|
|
Integer |
否 |
语速,取值范围为 -500~500,默认 0。默认语速因音色而异。 |
|
|
Integer |
否 |
语调,取值范围为 -500~500,默认 0。 |
|
|
Boolean |
否 |
是否开启字级别时间戳,默认 |
使用多情感音色时,在 text 中通过 SSML 的 <emotion> 标签设置情感。该标签仅适用于支持多情感的音色,其他音色使用该标签会导致合成失败。用法请参见emotion 标签。
可选择以下任一方式准备参数,并将得到的 params 对象传给 start()。两种方式的片段用于替换完整示例中的参数配置。
修改默认参数
defaultStartParams(voice) 返回以下对象。voice 为传入的音色;省略该参数时,该字段为 undefined,发送请求时不包含该字段。
{
voice: voice,
format: "wav",
sample_rate: 16000,
volume: 50,
speech_rate: 0,
pitch_rate: 0,
enable_subtitle: false
}
获取默认对象后,可直接修改字段:
const params = client.defaultStartParams("aixia");
params.text = "欢迎使用智能语音交互。";
params.speech_rate = 100;
自定义参数对象
const params = {
text: "欢迎使用智能语音交互。",
voice: "aixia",
format: "wav",
sample_rate: 16000,
volume: 50,
speech_rate: 100,
pitch_rate: 0,
enable_subtitle: false
};
on(which, handler)
注册事件回调,无返回值。应在发起任务前完成注册。
|
参数 |
类型 |
说明 |
|
|
String |
事件名称,见下表。 |
|
|
Function |
事件处理函数。 |
|
事件 |
说明 |
回调参数 |
|
|
字幕信息,需开启 |
1 个 String 参数。 |
|
|
合成音频分片。 |
1 个 Buffer 参数。 |
|
|
语音合成完成。 |
1 个 String 参数。 |
|
|
连接已关闭。 |
无参数。 |
|
|
任务失败,返回错误信息。 |
1 个 String 参数。 |
String 参数为 JSON 字符串。data 事件可以触发多次,按接收顺序保存音频分片;完整示例在合成完成后将分片写入文件。
async start(param, enablePing, pingInterval)
发起语音合成。音频通过 data 事件返回;返回的 Promise 在 completed 事件发生时 resolve,值为完成事件的 JSON 字符串。任务错误或连接错误通过 reject 返回。
|
参数 |
类型 |
说明 |
|
|
Object |
合成参数,见前面的合成参数说明。 |
|
|
Boolean |
是否自动发送 Ping 请求。默认 |
|
|
Number |
Ping 间隔,单位为毫秒。开启 Ping 且未指定该值时,使用 6000。 |
shutdown()
强制断开连接。无参数,无返回值。在调用结束或异常退出时释放连接。