Go SDK
本文介紹如何使用智能語音交互一句話識(shí)別的Go SDK,包括SDK的安裝方法及SDK代碼示例等。
前提條件
在使用SDK前,請(qǐng)先閱讀接口說明,詳情請(qǐng)參見接口說明。
請(qǐng)確認(rèn)已經(jīng)安裝Golang環(huán)境,并完成基本配置。
SDK支持Go 1.16及以上版本。
下載安裝
下載并安裝SDK。
通過以下命令完成SDK下載和安裝。
go get github.com/aliyun/alibabacloud-nls-go-sdk
導(dǎo)入SDK。
在代碼中通過添加以下字段導(dǎo)入SDK。
import ("github.com/aliyun/alibabacloud-nls-go-sdk")
SDK常量
常量 | 含義 |
SDK_VERSION | SDK版本。 |
PCM | PCM音頻格式。 |
WAV | WAV音頻格式。 |
OPUS | OPUS音頻格式。 |
OPU | OPU音頻格式。 |
DEFAULT_DISTRIBUTE | 獲取Token時(shí)使用的默認(rèn)區(qū)域,默認(rèn)為"cn-shanghai"。 |
DEFAULT_DOMAIN | 獲取Token時(shí)使用的默認(rèn)URL,默認(rèn)為"nls-meta.cn-shanghai.aliyuncs.com"。 |
DEFAULT_VERSION | 獲取Token時(shí)使用的協(xié)議版本,默認(rèn)為"2019-02-28"。 |
DEFAULT_URL | 默認(rèn)公有云URL,默認(rèn)為"wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"。 |
建立連接
使用Akid和Akkey來獲取Token時(shí),建議針對(duì)Token進(jìn)行緩存,并根據(jù)獲取Token時(shí)獲得的過期時(shí)間參數(shù)進(jìn)行及時(shí)更新;請(qǐng)勿頻繁調(diào)用獲取Token的接口,否則會(huì)造成云端限流。
1.ConnectionConfig
用于建立連接的基礎(chǔ)參數(shù)。
參數(shù)說明:
參數(shù) | 類型 | 參數(shù)說明 |
Url | String | 訪問的公有云URL,如果不確定,可以使用常量DEFAULT_URL。 |
Token | String | 訪問Token,詳情可參見獲取Token概述。 |
Akid | String | 阿里云賬號(hào)AccessKey ID。
|
Akkey | String | 阿里云賬號(hào)AccessKey Secret。
|
Appkey | String | 對(duì)應(yīng)項(xiàng)目Appkey。獲取Appkey請(qǐng)前往控制臺(tái)。 |
2.func NewConnectionConfigWithToken(url string, appkey string, token string) *ConnectionConfig
通過URL,Appkey和Token創(chuàng)建連接參數(shù)。
3. func NewConnectionConfigFromJson(jsonStr string) (*ConnectionConfig, error)
通過JSON字符串來創(chuàng)建連接參數(shù)。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
jsonStr
String
描述連接參數(shù)的JSON字符串,有效字段如下:url,token,akid,akkey,appkey。其中必須包含url和appkey,如果包含Token則不需要包含akid和akkey。
返回值:
*ConnectionConfig:連接配置對(duì)象指針。
error:錯(cuò)誤異常。
一句話識(shí)別
1. SpeechRecognitionStartParam
一句話識(shí)別參數(shù)。
參數(shù) | 類型 | 參數(shù)說明 |
Format | String | 音頻格式,默認(rèn)值:PCM。取值為OPUS、OPU和PCM,如果是OPUS或OPU時(shí),您需要自行編碼。 |
SampleRate | Integer | 采樣率,默認(rèn)值:16000 Hz。 |
EnableIntermediateResult | Boolean | 是否打開中間結(jié)果返回。
|
EnablePunctuationPrediction | Boolean | 是否打開標(biāo)點(diǎn)預(yù)測(cè)。
|
EnableInverseTextNormalization | Boolean | ITN(逆文本inverse text normalization)中文數(shù)字轉(zhuǎn)換阿拉伯?dāng)?shù)字。設(shè)置為True時(shí),中文數(shù)字將轉(zhuǎn)為阿拉伯?dāng)?shù)字輸出,默認(rèn)值:False。 |
2. func DefaultSpeechRecognitionParam() SpeechRecognitionStartParam
返回一個(gè)默認(rèn)的推薦參數(shù),其中Format為PCM,采樣率為16000 Hz,中間結(jié)果,標(biāo)點(diǎn)預(yù)測(cè)和ITN均為打開狀態(tài)。
參數(shù)說明:無。
返回值:無。
3. func NewSpeechRecognition(...) (*SpeechRecognition, error)
創(chuàng)建一個(gè)SpeechRecognition實(shí)例。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
config
*ConnectionConfig
參見建立連接相關(guān)內(nèi)容。
logger
*NlsLogger
參見SDK日志相關(guān)內(nèi)容。
taskfailed
func(string, interface{})
識(shí)別過程中的錯(cuò)誤處理回調(diào)參數(shù),interface{}為用戶自定義參數(shù)。
started
func(string, interface{})
建連完成回調(diào)參數(shù)。
resultchanged
func(string, interface{})
識(shí)別中間結(jié)果回調(diào)參數(shù)。
completed
func(string, interface{})
最終識(shí)別結(jié)果回調(diào)參數(shù)。
closed
func(interface{})
連接斷開回調(diào)參數(shù)。
param
interface{}
用戶自定義參數(shù)。
返回值:
*SpeechRecognition:一句話識(shí)別對(duì)象指針。
error:錯(cuò)誤異常。
4. func (sr *SpeechRecognition) Start(param SpeechRecognitionStartParam, extra map[string]interface{}) (chan bool, error)
根據(jù)param發(fā)起一次一句話識(shí)別請(qǐng)求。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
param
SpeechRecognitionStartParam
一句話識(shí)別參數(shù)。
extra
map[string]interface{}
額外
key:value
參數(shù)。
返回值:
chan bool:用于同步語音識(shí)別開始的管道,在管道就緒之后才能發(fā)送音頻數(shù)據(jù)。
error:錯(cuò)誤異常。
5. func (sr *SpeechRecognition) Stop() (chan bool, error)
停止一句話識(shí)別。
參數(shù)說明:無。
返回值:
chan bool:用于同步語音識(shí)別結(jié)束的管道。
error:錯(cuò)誤異常。
6. func (sr *SpeechRecognition) Shutdown()
強(qiáng)制斷開連接。
參數(shù)說明:無。
返回值:無。
7. func (sr *SpeechRecognition) SendAudioData(data []byte) error
發(fā)送音頻,音頻格式必須和參數(shù)中一致。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
data
[]byte
音頻數(shù)據(jù)。
返回值:
error:異常錯(cuò)誤。
SDK日志
1. func DefaultNlsLog() *NlsLogger
用于創(chuàng)建全局唯一的默認(rèn)日志對(duì)象,默認(rèn)日志以NLS為前綴,輸出到標(biāo)準(zhǔn)錯(cuò)誤。
參數(shù)說明:無。
返回值:
NlsLogger:日志對(duì)象指針。
2. func NewNlsLogger(w io.Writer, tag string, flag int) *NlsLogger
創(chuàng)建一個(gè)新的日志。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
w
io.Writer
任意實(shí)現(xiàn)io.Writer接口的對(duì)象。
tag
String
日志前綴,會(huì)打印到日志行首部。
flag
Integer
日志flag,具體請(qǐng)參見Go官方log文檔。
返回值:
NlsLogger:日志對(duì)象指針。
3. func (logger *NlsLogger) SetLogSil(sil bool)
設(shè)置日志是否輸出到對(duì)應(yīng)的io.Writer。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
sil
Boolean
是否禁止日志輸出。
true:禁止。
false:允許。
返回值:無。
4. func (logger *NlsLogger) SetDebug(debug bool)
設(shè)置是否打印Debug日志,僅影響通過Debugf或Debugln進(jìn)行輸出的日志。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
debug
Boolean
是否允許Debug日志輸出。
true:允許。
false:禁止。
返回值:無。
5. func (logger *NlsLogger) SetOutput(w io.Writer)
設(shè)置日志輸出方式。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
w
io.Writer
任意實(shí)現(xiàn)io.Writer接口的對(duì)象。
返回值:無。
6. func (logger *NlsLogger) SetPrefix(prefix string)
設(shè)置日志行的標(biāo)簽。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
prefix
String
日志行標(biāo)簽,會(huì)輸出在日志行行首。
返回值:無。
7. func (logger *NlsLogger) SetFlags(flags int)
設(shè)置日志屬性。
參數(shù)說明:
參數(shù)
類型
參數(shù)說明
flags
Integer
日志屬性,具體請(qǐng)參見Go官方文檔。
返回值:無。
8. 日志打印
日志打印方法:
方法名 | 方法說明 |
func (l *NlsLogger) Print(v ...interface{}) | 標(biāo)準(zhǔn)日志輸出。 |
func (l *NlsLogger) Println(v ...interface{}) | 標(biāo)準(zhǔn)日志輸出,行尾自動(dòng)換行。 |
func (l *NlsLogger) Printf(format string, v ...interface{}) | 帶Format的日志輸出,F(xiàn)ormat方式見具體請(qǐng)參見Go官方文檔。 |
func (l *NlsLogger) Debugln(v ...interface{}) | Debug信息日志輸出,行尾自動(dòng)換行。 |
func (l *NlsLogger) Debugf(format string, v ...interface{}) | 帶Format的Debug信息日志輸出。 |
func (l *NlsLogger) Fatal(v ...interface{}) | 致命錯(cuò)誤日志輸出,輸出后自動(dòng)進(jìn)程退出。 |
func (l *NlsLogger) Fatalln(v ...interface{}) | 致命錯(cuò)誤日志輸出,行尾自動(dòng)換行,輸出后自動(dòng)進(jìn)程退出。 |
func (l *NlsLogger) Fatalf(format string, v ...interface{}) | 帶Format的致命錯(cuò)誤日志輸出,輸出后自動(dòng)進(jìn)程退出。 |
func (l *NlsLogger) Panic(v ...interface{}) | 致命錯(cuò)誤日志輸出,輸出后自動(dòng)進(jìn)程退出并打印崩潰信息。 |
func (l *NlsLogger) Panicln(v ...interface{}) | 致命錯(cuò)誤日志輸出,行尾自動(dòng)換行,輸出后自動(dòng)進(jìn)程退出并打印崩潰信息。 |
func (l *NlsLogger) Panicf(format string, v ...interface{}) | 帶Format的致命錯(cuò)誤日志輸出,輸出后自動(dòng)進(jìn)程退出并打印崩潰信息。 |
代碼示例
package main
import (
"errors"
"flag"
"fmt"
"log"
"os"
"os/signal"
"sync"
"time"
"github.com/aliyun/alibabacloud-nls-go-sdk"
)
const (
AKID = "Your AKID"
AKKEY = "Your AKKEY"
//online key
APPKEY = "Your APPKEY" //獲取Appkey請(qǐng)前往控制臺(tái):https://nls-portal.console.aliyun.com/applist
TOKEN = "Your TOKEN" //獲取Token具體操作,請(qǐng)參見:http://m.bestwisewords.com/document_detail/450514.html
)
func onTaskFailed(text string, param interface{}) {
logger, ok := param.(*nls.NlsLogger)
if !ok {
log.Default().Fatal("invalid logger")
return
}
logger.Println("TaskFailed:", text)
}
func onStarted(text string, param interface{}) {
logger, ok := param.(*nls.NlsLogger)
if !ok {
log.Default().Fatal("invalid logger")
return
}
logger.Println("onStarted:", text)
}
func onResultChanged(text string, param interface{}) {
logger, ok := param.(*nls.NlsLogger)
if !ok {
log.Default().Fatal("invalid logger")
return
}
logger.Println("onResultChanged:", text)
}
func onCompleted(text string, param interface{}) {
logger, ok := param.(*nls.NlsLogger)
if !ok {
log.Default().Fatal("invalid logger")
return
}
logger.Println("onCompleted:", text)
}
func onClose(param interface{}) {
logger, ok := param.(*nls.NlsLogger)
if !ok {
log.Default().Fatal("invalid logger")
return
}
logger.Println("onClosed:")
}
func waitReady(ch chan bool, logger *nls.NlsLogger) error {
select {
case done := <-ch:
{
if !done {
logger.Println("Wait failed")
return errors.New("wait failed")
}
logger.Println("Wait done")
}
case <-time.After(20 * time.Second):
{
logger.Println("Wait timeout")
return errors.New("wait timeout")
}
}
return nil
}
var lk sync.Mutex
var fail = 0
var reqNum = 0
func testMultiInstance(num int) {
pcm, err := os.Open("tests/test1.pcm")
if err != nil {
log.Default().Fatalln(err)
}
buffers := nls.LoadPcmInChunk(pcm, 320)
param := nls.DefaultSpeechRecognitionParam()
config, _ := nls.NewConnectionConfigWithAKInfoDefault(nls.DEFAULT_URL, APPKEY, AKID, AKKEY)
var wg sync.WaitGroup
for i := 0; i < num; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
strId := fmt.Sprintf("ID%d ", id)
logger := nls.NewNlsLogger(os.Stderr, strId, log.LstdFlags|log.Lmicroseconds)
logger.SetLogSil(false)
logger.SetDebug(true)
logger.Printf("Test Normal Case for SpeechRecognition:%s", strId)
sr, err := nls.NewSpeechRecognition(config, logger,
onTaskFailed, onStarted, onResultChanged,
onCompleted, onClose, logger)
if err != nil {
logger.Fatalln(err)
return
}
test_ex := make(map[string]interface{})
test_ex["test"] = "hello"
for {
lk.Lock()
reqNum++
lk.Unlock()
logger.Println("SR start")
ready, err := sr.Start(param, test_ex)
if err != nil {
lk.Lock()
fail++
lk.Unlock()
sr.Shutdown()
continue
}
err = waitReady(ready, logger)
if err != nil {
lk.Lock()
fail++
lk.Unlock()
sr.Shutdown()
continue
}
for _, data := range buffers.Data {
if data != nil {
sr.SendAudioData(data.Data)
time.Sleep(10 * time.Millisecond)
}
}
logger.Println("send audio done")
ready, err = sr.Stop()
if err != nil {
lk.Lock()
fail++
lk.Unlock()
sr.Shutdown()
continue
}
err = waitReady(ready, logger)
if err != nil {
lk.Lock()
fail++
lk.Unlock()
sr.Shutdown()
continue
}
logger.Println("Sr done")
sr.Shutdown()
}
}(i)
}
wg.Wait()
}
func main() {
coroutineId := flag.Int("num", 1, "coroutine number")
flag.Parse()
log.Default().Printf("start %d coroutines", *coroutineId)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
for range c {
lk.Lock()
log.Printf(">>>>>>>>REQ NUM: %d>>>>>>>>>FAIL: %d", reqNum, fail)
lk.Unlock()
os.Exit(0)
}
}()
testMultiInstance(*coroutineId)
}