Node.js SDK

本文介绍如何使用阿里云智能语音服务提供的Node.js SDK,包括SDK的安装方法及SDK代码示例。

前提条件

在使用SDK前,请先阅读接口说明,详情请参见接口说明

下载安装

说明
  • SDK支持nodev14及以上版本。

  • 请确认已经安装nodejs&npm环境,并完成基本配置。

  1. 下载并安装SDK。

    通过以下命令完成SDK下载和安装。

    npm install alibabacloud-nls
  2. 导入SDK。

    在代码中使用require或者import导入SDK。

    const Nls = require('alibabacloud-nls')
    //Nls内部含SpeechRecognition, SpeechTranscription, SpeechSynthesizer
    //以下为使用import导入SDK
    //import { SpeechRecognition } from "alibabacloud-nls"
    //import { SpeechTranscription } from "alibabacloud-nls"
    //import { SpeechSynthesizer } from "alibabacloud-nls"

语音合成

Class: SpeechSynthesizer

SpeechSynthesizer类用于进行语音合成。

  • 构造函数参数说明:

参数

类型

参数说明

config

Object

连接配置对象。

  • config object说明:

参数

类型

参数说明

url

String

服务URL地址。

token

String

访问Token,详情可参见获取Token概述

appkey

String

对应项目Appkey。

defaultStartParams(voice)

返回一个默认的推荐参数,其中voice为您自行提供,采样率为16000 Hz,格式为WAV,音量50,语速语调皆为0,不开启字幕。您在拿到默认对象后可以根据自身需求,结合接口说明中的参数列表来添加和修改参数。

  • 参数说明:

    参数

    类型

    参数说明

    voice

    String

    发音人。

  • 返回值:

    object类型对象,字段如下:

    {
        "voice": voice, 
        "format": "wav",
        "sample_rate": 16000,
        "volume": 50,
        "speech_rate": 0,
        "pitch_rate": 0,
        "enable_subtitle": false
    }

on(which, handler)

设置事件回调。

  • 参数说明:

参数

类型

参数说明

which

String

事件名称。

handler

Function

回调函数。

支持的回调事件如下:

事件名称

事件说明

回调函数参数个数

回调函数参数说明

meta

字幕回调。

1

String类型,字幕信息。

data

合成音频回调。

1

Buffer类型,合成音频数据。

completed

语音合成完成。

1

String类型,完成信息。

closed

连接关闭。

0

无。

failed

错误。

1

String类型,错误信息。

  • 返回值:无。

async start(param, enablePing, pingInterval)

根据param发起一次一句话识别,param可以参考defaultStartParams方法的返回,具体参数见接口说明

  • 参数说明:

参数

类型

参数说明

param

Object

语音合成参数。

enablePing

Boolean

是否自动向云端发送ping请求,默认false。

  • true:发送。

  • false:不发送。

pingInterval

Number

发ping请求间隔时间,默认6000,单位为毫秒。

  • 返回值: Promise对象,当started事件发生后触发resolve,并携带started信息;当任何错误发生后触发reject,并携带异常信息。

代码示例

"use strict"

require('log-timestamp')(`${process.pid}`)
const fs = require("fs")
const Nls = require("alibabacloud-nls")
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs))
const util = require("util")
const readline = require("readline")
const args = process.argv.slice(2)
//const Memwatch = require("node-memwatch-new")

const URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
const APPKEY = "Your Appkey"      //获取Appkey请前往控制台:https://nls-portal.console.aliyun.com/applist
const TOKEN = "Your Token"      //获取Token具体操作,请参见:https://help.aliyun.com/document_detail/450514.html

let b1 = []
let loadIndex = 0
//let hd = new Memwatch.HeapDiff()
let needDump = true

async function runOnce(line) {
  console.log(`speak: ${line}`)
  loadIndex++

  //let dumpFile = fs.createWriteStream(`${process.pid}.wav`, {flags:"w"})
  let tts = new Nls.SpeechSynthesizer({
    url: URL,
    appkey:APPKEY,
    token:TOKEN
  })

  tts.on("meta", (msg)=>{
    console.log("Client recv metainfo:", msg)
  })

  tts.on("data", (msg)=>{
    console.log(`recv size: ${msg.length}`)
    //console.log(dumpFile.write(msg, "binary"))
  })

  tts.on("completed", (msg)=>{
    console.log("Client recv completed:", msg)
  })

  tts.on("closed", () => {
    console.log("Client recv closed")
  })

  tts.on("failed", (msg)=>{
    console.log("Client recv failed:", msg)
  })

  let param = tts.defaultStartParams()
  param.text = line
  param.voice = "aixia"
  try {
    await tts.start(param, true, 6000)
  } catch(error) {
    console.log("error on start:", error)
    return
  } finally {
    //dumpFile.end()
  }
  console.log("synthesis done")
  await sleep(2000)
}

async function test() {
  console.log("load test case:", args[0])
  const fileStream = fs.createReadStream(args[0])
  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  })

  for await (const line of rl) {
    b1.push(line)
  }

  while (true) {
    for (let text of b1) {
      await runOnce(text)
    }
  }
}

test()