微信小程序
本文介紹如何使用智能語(yǔ)音交互一句話識(shí)別的微信小程序SDK,包括SDK的安裝方法及SDK代碼示例等。
前提條件
在使用SDK前,請(qǐng)先閱讀接口說(shuō)明,詳情請(qǐng)參見(jiàn)接口說(shuō)明。
微信基礎(chǔ)庫(kù)要求2.4.4及以上版本。
請(qǐng)確認(rèn)已經(jīng)安裝微信小程序開發(fā)環(huán)境,并完成基本配置。具體可參見(jiàn)微信開發(fā)者工具。
需要提前將如下URL添加到微信小程序后臺(tái)服務(wù)器域名中:
request合法域名:
https://nls-meta.cn-shanghai.aliyuncs.com
socket合法域名:
wss://nls-gateway-cn-shanghai.aliyuncs.com
下載安裝
下載并安裝SDK。
通過(guò)Github下載對(duì)應(yīng)SDK代碼,或直接下載alibabacloud-nls-wx-sdk-master.zip。
導(dǎo)入SDK。
您可將下載好的代碼放入工程合適目錄下,然后根據(jù)目錄位置通過(guò)require進(jìn)行導(dǎo)入。
獲取Token
getToken
獲取Token并以AKID(AccessKey ID)和AKKEY(AccessKey Secret)為key緩存對(duì)應(yīng)Token,如果緩存的Token過(guò)期則自動(dòng)刷新并獲取。緩存機(jī)制請(qǐng)參見(jiàn)微信小程序文檔的數(shù)據(jù)緩存部分。
參數(shù)說(shuō)明:無(wú)。
返回值:String類型的Token。
getTokenInner
直接獲取Token,不帶任何緩存機(jī)制,適用于用戶自定義緩存方式。
參數(shù)說(shuō)明:無(wú)。
返回值:String類型的Token。
頻繁調(diào)用該接口會(huì)被服務(wù)端拒絕訪問(wèn)。
一句話識(shí)別
Class: SpeechRecognition
SpeechRecognition類用于進(jìn)行一句話識(shí)別。
defaultStartParams()
返回一個(gè)默認(rèn)的推薦參數(shù),其中Format為PCM,采樣率為16000 Hz,中間結(jié)果、標(biāo)點(diǎn)預(yù)測(cè)和ITN均為打開狀態(tài)。您在拿到默認(rèn)對(duì)象后可以根據(jù)自身需求,結(jié)合接口說(shuō)明中的參數(shù)列表來(lái)添加和修改參數(shù)。
參數(shù)說(shuō)明:無(wú)。
返回值:
object類型對(duì)象,字段如下:
{ "format": "pcm", "sample_rate": 16000, "enable_intermediate_result": true, "enable_punctuation_prediction": true, "enable_inverse_text_normalization": true }
on(which, handler)
設(shè)置事件回調(diào)。
參數(shù)說(shuō)明:
參數(shù)
類型
參數(shù)說(shuō)明
which
String
事件名稱。
handler
Function
回調(diào)函數(shù)。
支持的回調(diào)事件如下:
事件名稱
事件說(shuō)明
回調(diào)函數(shù)參數(shù)個(gè)數(shù)
回調(diào)函數(shù)參數(shù)說(shuō)明
started
一句話識(shí)別開始。
1
String類型,開始信息。
changed
一句話識(shí)別中間結(jié)果。
1
String類型,中間結(jié)果信息。
completed
一句話識(shí)別完成。
1
String類型,完成信息。
closed
連接關(guān)閉。
0
無(wú)。
failed
錯(cuò)誤。
1
String類型,錯(cuò)誤信息。
返回值:無(wú)。
async start(param)
根據(jù)param發(fā)起一次一句話識(shí)別,param可以參考defaultStartParams方法的返回,具體參數(shù)見(jiàn)接口說(shuō)明。
參數(shù)說(shuō)明:
參數(shù)
類型
參數(shù)說(shuō)明
param
Object
一句話識(shí)別參數(shù)。
返回值: Promise對(duì)象,當(dāng)started事件發(fā)生后觸發(fā)resolve,并攜帶started信息;當(dāng)任何錯(cuò)誤發(fā)生后觸發(fā)reject,并攜帶異常信息。
async close(param)
停止一句話識(shí)別。
參數(shù)說(shuō)明:
參數(shù)
類型
參數(shù)說(shuō)明
param
Object
一句話識(shí)別結(jié)束參數(shù)。
返回值:
Promise對(duì)象,當(dāng)completed事件發(fā)生后觸發(fā)resolve,并攜帶completed信息;當(dāng)任何錯(cuò)誤發(fā)生后觸發(fā)reject,并攜帶異常信息。
shutdown()
強(qiáng)制斷開連接。
參數(shù)說(shuō)明:無(wú)。
返回值:無(wú)。
sendAudio(data)
發(fā)送音頻,音頻格式必須和參數(shù)中一致。
參數(shù)說(shuō)明:
參數(shù)
類型
參數(shù)說(shuō)明
data
ArrayBuffer
二進(jìn)制音頻數(shù)據(jù)。
返回值:無(wú)。
代碼示例
以下代碼示例僅供參考,代碼中使用微信小程序自帶錄音功能,實(shí)際使用時(shí),需要考慮微信小程序的限制,以及前端頁(yè)面設(shè)計(jì)和具體業(yè)務(wù)功能。
// pages/sr/sr.js
const app = getApp()
const AKID = "Your AKID"
const AKKEY = "Your AKKEY"
const getToken = require("../../utils/token").getToken
const SpeechRecognition = require("../../utils/sr")
const sleep = require("../../utils/util").sleep
Page({
/**
* 頁(yè)面的初始數(shù)據(jù)
*/
data: {
srStart : false,
srResult : "未開始識(shí)別"
},
/**
* 生命周期函數(shù)--監(jiān)聽頁(yè)面加載
*/
onLoad: async function (options) {
wx.getRecorderManager().onFrameRecorded((res)=>{
if (res.isLastFrame) {
console.log("record done")
}
if (this.data.sr && this.data.srStart) {
console.log("send " + res.frameBuffer.byteLength)
this.data.sr.sendAudio(res.frameBuffer)
}
})
wx.getRecorderManager().onStart(()=>{
console.log("start recording...")
})
wx.getRecorderManager().onStop((res) => {
console.log("stop recording...")
if (res.tempFilePath) {
wx.removeSavedFile({
filePath:res.tempFilePath
})
}
})
wx.getRecorderManager().onError((res) => {
console.log("recording failed:" + res)
})
try {
this.data.token = await getToken(AKID, AKKEY)
} catch (e) {
console.log("error on get token:", JSON.stringify(e))
return
}
let sr = new SpeechRecognition({
url : app.globalData.URL,
appkey: app.globalData.APPKEY,
token: this.data.token
})
sr.on("started", (msg)=> {
console.log("Client recv started")
this.setData({
srResult : msg
})
})
sr.on("changed", (msg)=>{
console.log("Client recv changed:", msg)
this.setData({
srResult : msg
})
})
sr.on("completed", (msg)=>{
console.log("Client recv completed:", msg)
this.setData({
srResult : msg
})
})
sr.on("closed", () => {
console.log("Client recv closed")
})
sr.on("failed", (msg)=>{
console.log("Client recv failed:", msg)
this.setData({
srResult : msg
})
})
this.data.sr = sr
},
/**
* 生命周期函數(shù)--監(jiān)聽頁(yè)面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函數(shù)--監(jiān)聽頁(yè)面顯示
*/
onShow: function () {
},
/**
* 生命周期函數(shù)--監(jiān)聽頁(yè)面隱藏
*/
onHide: function () {
},
/**
* 生命周期函數(shù)--監(jiān)聽頁(yè)面卸載
*/
onUnload: function () {
console.log("sr onUnload")
this.data.srStart = false
wx.getRecorderManager().stop()
if (this.data.sr) {
this.data.sr.shutdown()
} else {
console.log("sr is null")
}
},
/**
* 頁(yè)面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動(dòng)作
*/
onPullDownRefresh: function () {
},
/**
* 頁(yè)面上拉觸底事件的處理函數(shù)
*/
onReachBottom: function () {
},
/**
* 用戶點(diǎn)擊右上角分享
*/
onShareAppMessage: function () {
},
onSrStart: async function() {
if (!this.data.sr) {
console.log("sr is null")
return
}
if (this.data.srStart) {
console.log("sr is started!")
return
}
let sr = this.data.sr
try {
await sr.start(sr.defaultStartParams())
this.data.srStart = true
} catch (e) {
console.log("start failed:" + e)
return
}
wx.getRecorderManager().start({
duration: 600000,
numberOfChannels: 1,
sampleRate : 16000,
format: "PCM",
frameSize: 4
})
},
onSrStop: async function() {
wx.getRecorderManager().stop()
await sleep(500)
if (this.data.srStart && this.data.sr) {
try {
console.log("prepare close sr")
await this.data.sr.close()
this.data.srStart = false
} catch(e) {
console.log("close sr failed:" + e)
}
}
}
})