本文介紹如何使用阿里云智能語音服務提供的Node.js SDK,包括SDK的安裝方法及SDK代碼示例。
前提條件
在使用SDK前,請先閱讀接口說明,詳情請參見接口說明。
下載安裝
SDK支持nodev14及以上版本。
請確認已經安裝nodejs&npm環境,并完成基本配置。
下載并安裝SDK。
通過以下命令完成SDK下載和安裝。
npm install alibabacloud-nls
導入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。
|
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具體操作,請參見:http://bestwisewords.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()