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