本文介紹了如何使用阿里云智能語音服務提供的Go SDK,包括SDK的安裝方法及SDK代碼示例。
前提條件
示例說明
錄音文件識別示例使用Go SDK的CommonRequest提交識別請求和查詢識別結果,采用RPC風格的POP API調用方式。
關于阿里云Go SDK,請參見使用阿里云Go SDK。
Go SDK CommonRequest的使用方法,請參見使用CommonRequest進行調用。
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
調用步驟
創建并初始化阿里云鑒權對象。
鑒權使用阿里云賬號的AccessKey ID和AccessKey Secret。
創建錄音文件識別請求,并設置請求參數。
提交錄音文件識別請求,處理服務端返回的響應同時獲取任務ID。
創建識別結果查詢請求,設置查詢參數為任務ID。
輪詢識別結果。
代碼示例
下載nls-sample-16k.wav。該錄音文件為PCM編碼格式16000Hz采樣率,管控臺設置的模型為通用模型。如果使用其他錄音文件,請填入對應的編碼格式和采樣率,并在管控臺設置對應的模型,模型設置請參見管理項目。
調用接口前,需配置環境變量,通過環境變量讀取訪問憑證。智能語音交互的AccessKey ID、AccessKey Secret和AppKey的環境變量名: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 = "nls-filetrans"
const DOMAIN string = "filetrans.cn-shanghai.aliyuncs.com"
const API_VERSION string = "2018-08-17"
const POST_REQUEST_ACTION string = "SubmitTask"
const GET_REQUEST_ACTION string = "GetTaskResult"
// 請求參數
const KEY_APP_KEY string = "appkey" //此處appkey無需替換。
const KEY_FILE_LINK string = "file_link"
const KEY_VERSION string = "version"
const KEY_ENABLE_WORDS string = "enable_words"
// 響應參數
const KEY_TASK string = "Task"
const KEY_TASK_ID string = "TaskId"
const KEY_STATUS_TEXT string = "StatusText"
const KEY_RESULT string = "Result"
// 狀態值
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
// 新接入請使用4.0版本,已接入(默認2.0)如需維持現狀,請注釋掉該參數設置。
mapTask[KEY_VERSION] = "4.0"
// 設置是否輸出詞信息,默認為false。開啟時需要設置version為4.0。
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("錄音文件識別請求成功響應!")
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("識別查詢結果:", getResponseContent)
if (getResponse.GetHttpStatus() != 200) {
fmt.Println("識別結果查詢請求失敗,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("錄音文件識別失??!")
}
}
文檔內容是否對您有幫助?