日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Go SDK

更新時(shí)間:

本文介紹如何使用智能語音交互一句話識(shí)別的Go SDK,包括SDK的安裝方法及SDK代碼示例等。

前提條件

  • 在使用SDK前,請(qǐng)先閱讀接口說明,詳情請(qǐng)參見接口說明

  • 請(qǐng)確認(rèn)已經(jīng)安裝Golang環(huán)境,并完成基本配置。

  • SDK支持Go 1.16及以上版本。

下載安裝

  1. 下載并安裝SDK。

    通過以下命令完成SDK下載和安裝。

    go get github.com/aliyun/alibabacloud-nls-go-sdk
  2. 導(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"。

建立連接

重要

使用AkidAkkey來獲取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。

  • 若未已填寫Token字段,則需要填寫該字段。

  • 若已填寫Token字段,則該字段可不填寫。

Akkey

String

阿里云賬號(hào)AccessKey Secret。

  • 若未已填寫Token字段,則需要填寫該字段。

  • 若已填寫Token字段,則該字段可不填寫。

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ù)。

  • 參數(shù)說明:

    參數(shù)

    類型

    參數(shù)說明

    Url

    String

    訪問的公有云URL,如果不確定,可以使用常量DEFAULT_URL

    Appkey

    String

    對(duì)應(yīng)項(xiàng)目Appkey。獲取Appkey請(qǐng)前往控制臺(tái)

    Token

    String

    訪問Token,詳情可參見獲取Token概述

  • 返回值:

    *ConnectionConfig:連接配置對(duì)象指針。

3. func NewConnectionConfigFromJson(jsonStr string) (*ConnectionConfig, error)

通過JSON字符串來創(chuàng)建連接參數(shù)。

  • 參數(shù)說明:

    參數(shù)

    類型

    參數(shù)說明

    jsonStr

    String

    描述連接參數(shù)的JSON字符串,有效字段如下:urltokenakidakkeyappkey。其中必須包含urlappkey,如果包含Token則不需要包含akidakkey

  • 返回值:

    • *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é)果返回。

  • true:打開。

  • false:關(guān)閉。

EnablePunctuationPrediction

Boolean

是否打開標(biāo)點(diǎn)預(yù)測(cè)。

  • true:打開。

  • false:關(guān)閉。

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)
}