Go Demo
本文介紹了如何使用阿里云智能語音服務(wù)提供的Go SDK,包括SDK的安裝方法及SDK代碼示例。
前提條件
示例說明
錄音文件識別示例使用Go SDK的CommonRequest提交識別請求和查詢識別結(jié)果,采用RPC風(fēng)格的POP API調(diào)用方式。
關(guān)于阿里云Go SDK請參見使用阿里云Go SDK。
Go SDK CommonRequest的使用方法請參見使用CommonRequest進(jìn)行調(diào)用。
SDK安裝
阿里云Go SDK支持Go 1.7及以上版本,您可以通過如下方式安裝:
使用Glide(推薦)
glide get github.com/aliyun/alibaba-cloud-sdk-go
使用govendor:
go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
調(diào)用步驟
創(chuàng)建并初始化阿里云鑒權(quán)對象。鑒權(quán)使用阿里云賬號的AccessKey ID和AccessKey Secret。
創(chuàng)建錄音文件識別請求,并設(shè)置請求參數(shù)。
提交錄音文件識別請求,處理服務(wù)端返回的響應(yīng)同時(shí)獲取任務(wù)ID。
創(chuàng)建識別結(jié)果查詢請求,設(shè)置查詢參數(shù)為任務(wù)ID。
輪詢識別結(jié)果。
代碼示例
下載nls-sample-16k.wav。該錄音文件為PCM編碼格式16000 Hz采樣率,管控臺設(shè)置的模型為通用模型。如果使用其他錄音文件,請?zhí)钊雽?yīng)的編碼格式和采樣率,并在管控臺設(shè)置對應(yīng)的模型,模型設(shè)置請參見管理項(xiàng)目。
調(diào)用接口前,需配置環(huán)境變量,通過環(huán)境變量讀取訪問憑證。智能語音交互的AccessKey ID、AccessKey Secret和AppKey的環(huán)境變量名:ALIYUN_AK_ID、ALIYUN_AK_SECRET、NLS_APP_KEY。
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"fmt"
"encoding/json"
"time"
)
func main() {
// 地域ID,固定值。
const REGION_ID string = "cn-shanghai"
const ENDPOINT_NAME string = "cn-shanghai"
const PRODUCT string = "SpeechFileTranscriberLite"
const DOMAIN string = "speechfiletranscriberlite.cn-shanghai.aliyuncs.com"
const API_VERSION string = "2021-12-21"
const POST_REQUEST_ACTION string = "SubmitTask"
const GET_REQUEST_ACTION string = "GetTaskResult"
// 請求參數(shù)
const KEY_APP_KEY string = "appkey"
const KEY_FILE_LINK string = "file_link"
const KEY_ENABLE_WORDS string = "enable_words"
// 響應(yīng)參數(shù)
const KEY_TASK string = "Task"
const KEY_TASK_ID string = "TaskId"
const KEY_STATUS_TEXT string = "StatusText"
const KEY_RESULT string = "Result"
// 狀態(tài)值
const STATUS_SUCCESS string = "SUCCESS"
const STATUS_RUNNING string = "RUNNING"
const STATUS_QUEUEING string = "QUEUEING"
var accessKeyId string = os.Getenv("ALIYUN_AK_ID") //獲取AccessKey ID和AccessKey Secret請前往控制臺:https://ram.console.aliyun.com/manage/ak
var accessKeySecret string = os.Getenv("ALIYUN_AK_SECRET")
var appKey string = os.Getenv("NLS_APP_KEY")
var fileLink string = "https://gw.alipayobjects.com/os/bmw-prod/0574ee2e-f494-45a5-820f-63aee583045a.wav"
client, err := sdk.NewClientWithAccessKey(REGION_ID, accessKeyId, accessKeySecret)
if err != nil {
panic(err)
}
postRequest := requests.NewCommonRequest()
postRequest.Domain = DOMAIN
postRequest.Version = API_VERSION
postRequest.Product = PRODUCT
postRequest.ApiName = POST_REQUEST_ACTION
postRequest.Method = "POST"
mapTask := make(map[string]string)
mapTask[KEY_APP_KEY] = appKey
mapTask[KEY_FILE_LINK] = fileLink
// 設(shè)置是否輸出詞信息,默認(rèn)為false。
mapTask[KEY_ENABLE_WORDS] = "false"
task, err := json.Marshal(mapTask)
if err != nil {
panic(err)
}
postRequest.FormParams[KEY_TASK] = string(task)
postResponse, err := client.ProcessCommonRequest(postRequest)
if err != nil {
panic(err)
}
postResponseContent := postResponse.GetHttpContentString()
fmt.Println(postResponseContent)
if (postResponse.GetHttpStatus() != 200) {
fmt.Println("錄音文件識別請求失敗,Http錯誤碼: ", postResponse.GetHttpStatus())
return
}
var postMapResult map[string]interface{}
err = json.Unmarshal([]byte(postResponseContent), &postMapResult)
if err != nil {
panic(err)
}
var taskId string = ""
var statusText string = ""
statusText = postMapResult[KEY_STATUS_TEXT].(string)
if statusText == STATUS_SUCCESS {
fmt.Println("錄音文件識別請求成功響應(yīng)!")
taskId = postMapResult[KEY_TASK_ID].(string)
} else {
fmt.Println("錄音文件識別請求失敗!")
return
}
getRequest := requests.NewCommonRequest()
getRequest.Domain = DOMAIN
getRequest.Version = API_VERSION
getRequest.Product = PRODUCT
getRequest.ApiName = GET_REQUEST_ACTION
getRequest.Method = "GET"
getRequest.QueryParams[KEY_TASK_ID] = taskId
statusText = ""
for true {
getResponse, err := client.ProcessCommonRequest(getRequest)
if err != nil {
panic(err)
}
getResponseContent := getResponse.GetHttpContentString()
fmt.Println("識別查詢結(jié)果:", getResponseContent)
if (getResponse.GetHttpStatus() != 200) {
fmt.Println("識別結(jié)果查詢請求失敗,Http錯誤碼:", getResponse.GetHttpStatus())
break
}
var getMapResult map[string]interface{}
err = json.Unmarshal([]byte(getResponseContent), &getMapResult)
if err != nil {
panic(err)
}
statusText = getMapResult[KEY_STATUS_TEXT].(string)
if statusText == STATUS_RUNNING || statusText == STATUS_QUEUEING {
time.Sleep(10 * time.Second)
} else {
break
}
}
if statusText == STATUS_SUCCESS {
fmt.Println("錄音文件識別成功!")
} else {
fmt.Println("錄音文件識別失??!")
}
}