Go SDK

更新时间:
复制 MD 格式

使用实时语音识别 Go SDK 发送音频并通过回调获取识别结果。本页提供安装方法、完整调用示例以及连接配置、识别接口和日志说明。

前提条件

  • 已安装 Go 1.16 或以上版本,并完成环境配置。

  • 已获取项目 Appkey,并准备访问 Token 或用于获取 Token 的 AccessKey。项目配置请参见管理项目,Token 获取方法请参见获取 Token。

  • 了解音频要求和服务参数,详情请参见实时语音识别接口说明。

安装 SDK

在 Go Module 项目目录中安装 SDK:

go get github.com/aliyun/alibabacloud-nls-go-sdk

项目尚未初始化 Module 时,先执行 go mod init <模块路径>。SDK 的导入路径为 github.com/aliyun/alibabacloud-nls-go-sdk,包名为 nls。

代码示例

示例使用 Go SDK v1.1.1,完成一次音频文件识别。运行前准备以下内容:

  • 在程序运行环境中设置 NLS_APP_KEY 和 NLS_TOKEN。示例代码通过 os.Getenv 读取这两个变量,分别用于项目 Appkey 和访问 Token。

  • 下载示例音频 test1.pcm,保存到程序工作目录。该文件为 16 kHz、单声道、16 bit PCM 音频;使用其他文件时,修改 audioPath,并使音频格式、采样率与识别参数及项目模型匹配。

package main

import (
    "fmt"
    "io"
    "log"
    "os"
    "time"

    nls "github.com/aliyun/alibabacloud-nls-go-sdk"
)

func waitResult(ch <-chan bool) error {
    select {
    case success, ok := <-ch:
        if !ok || !success {
            return fmt.Errorf("recognition task failed")
        }
        return nil
    case <-time.After(20 * time.Second):
        return fmt.Errorf("timed out waiting for recognition event")
    }
}

func printEvent(text string, param interface{}) {
    fmt.Println(text)
}

func recognize() error {
    appkey := os.Getenv("NLS_APP_KEY")
    token := os.Getenv("NLS_TOKEN")
    if appkey == "" || token == "" {
        return fmt.Errorf("set NLS_APP_KEY and NLS_TOKEN")
    }
    audioPath := "test1.pcm"
    audio, err := os.Open(audioPath)
    if err != nil {
        return err
    }
    defer audio.Close()

    config := nls.NewConnectionConfigWithToken(nls.DEFAULT_URL, appkey, token)
    logger := nls.NewNlsLogger(os.Stderr, "NLS ", log.LstdFlags)
    st, err := nls.NewSpeechTranscription(
        config, logger, printEvent, nil, nil, printEvent, nil, printEvent, nil, nil,
    )
    if err != nil {
        return err
    }
    defer st.Shutdown()

    params := nls.DefaultSpeechTranscriptionParam()
    started, err := st.Start(params, nil)
    if err != nil {
        return err
    }
    if err := waitResult(started); err != nil {
        return err
    }

    // 每 10 ms 发送 320 字节,对应 16 kHz、16 bit、单声道 PCM。
    buffer := make([]byte, 320)
    for {
        n, readErr := io.ReadFull(audio, buffer)
        if readErr != nil && readErr != io.EOF && readErr != io.ErrUnexpectedEOF {
            return readErr
        }
        if n > 0 {
            if err := st.SendAudioData(buffer[:n]); err != nil {
                return err
            }
            time.Sleep(10 * time.Millisecond)
        }
        if readErr == io.EOF || readErr == io.ErrUnexpectedEOF {
            break
        }
    }

    completed, err := st.Stop()
    if err != nil {
        return err
    }
    return waitResult(completed)
}

func main() {
    if err := recognize(); err != nil {
        log.Fatal(err)
    }
}

每句话的最终结果通过 SentenceEnd 回调消息中的 payload.result 返回,TranscriptionCompleted 表示整个识别任务结束。任务失败时,TaskFailed 回调消息提供错误信息。

连接配置

ConnectionConfig 保存连接参数。建议缓存通过 AccessKey 获取的 Token,并根据返回的过期时间更新,避免频繁获取 Token 导致限流。

配置字段

字段

类型

说明

Url

string

语音服务 WebSocket 地址,可使用 nls.DEFAULT_URL。

Appkey

string

项目 Appkey。

Token

string

访问 Token。使用 Token 初始化时必填。

Akid

string

AccessKey ID。使用 JSON 初始化且未提供 Token 时,与 Akkey 一起填写。

Akkey

string

AccessKey Secret。使用 JSON 初始化且未提供 Token 时,与 Akid 一起填写。

通过构造函数创建配置时会设置连接所需的参数;使用原始 ConnectionConfig 结构体时,Token 需提前获取,填写 Akid 和 Akkey 不会自动获取 Token。

初始化方式

使用 Token

使用服务地址、项目 Appkey 和 Token 创建配置。

func NewConnectionConfigWithToken(url string, appkey string, token string) *ConnectionConfig

返回连接配置指针 *ConnectionConfig。

使用 AccessKey

使用 AccessKey 获取 Token 并创建配置。该方法使用 DEFAULT_DISTRIBUTE、DEFAULT_DOMAIN 和 DEFAULT_VERSION 指定的鉴权配置。

func NewConnectionConfigWithAKInfoDefault(url string, appkey string, akid string, akkey string) (*ConnectionConfig, error)

返回连接配置指针和错误。error 非 nil 时,先处理错误再使用配置。

使用 JSON

使用 JSON 字符串创建配置。

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

jsonStr 的有效字段为 url、appkey、token、akid 和 akkey。其中 url 和 appkey 必填;提供非空 token 时直接使用该 Token,否则需要提供 akid 和 akkey,由默认 AccessKey 初始化方法获取 Token。

返回连接配置指针和错误,JSON 格式错误、必要字段缺失或 Token 获取失败时返回错误。

识别参数与方法

识别参数

SpeechTranscriptionStartParam 用于设置识别参数。

字段

类型

说明

Format

string

音频格式。可使用 PCM、WAV、OPUS、OPU 常量。使用 OPUS 或 OPU 时需自行编码音频;发送的数据必须与设置的格式一致。

SampleRate

int

音频采样率,单位为 Hz,需与音频及项目模型匹配。

EnableIntermediateResult

bool

是否返回中间识别结果。true:开启;false:关闭。

EnablePunctuationPrediction

bool

是否开启标点预测。true:开启;false:关闭。

EnableInverseTextNormalization

bool

是否开启逆文本正则化(ITN)。开启后,中文数字可转换为阿拉伯数字。true:开启;false:关闭。

MaxSentenceSilence

int

静音断句阈值,单位为毫秒。检测到语音后的静音时长超过阈值时触发断句。取值范围:200~6000,默认值:800。

EnableWords

bool

是否返回词信息,包括词的文本、起止时间。true:开启;false:关闭。默认关闭。

DefaultSpeechTranscriptionParam() 无入参,返回 SpeechTranscriptionStartParam:Format 为 pcm,SampleRate 为 16000,中间结果、标点和 ITN 均为 true,MaxSentenceSilence 为 800,EnableWords 为 false。按需修改返回对象后传给 Start。

func DefaultSpeechTranscriptionParam() SpeechTranscriptionStartParam

直接构造参数结构体时,未赋值的布尔字段为 false。

创建识别实例

NewSpeechTranscription 创建实时语音识别实例,返回 *SpeechTranscription 和 error。

func NewSpeechTranscription(
    config *ConnectionConfig,
    logger *NlsLogger,
    taskfailed func(string, interface{}),
    started func(string, interface{}),
    sentencebegin func(string, interface{}),
    sentenceend func(string, interface{}),
    resultchanged func(string, interface{}),
    completed func(string, interface{}),
    closed func(interface{}),
    param interface{},
) (*SpeechTranscription, error)

参数

类型

说明

config

*ConnectionConfig

连接配置,参见连接配置。

logger

*NlsLogger

日志对象,为 nil 时使用默认日志对象。日志方法参见SDK 日志。

taskfailed

func(string, interface{})

TaskFailed 事件回调,接收任务失败消息。

started

func(string, interface{})

TranscriptionStarted 事件回调,表示识别任务已启动。

sentencebegin

func(string, interface{})

SentenceBegin 事件回调,表示检测到一句话的开始。

sentenceend

func(string, interface{})

SentenceEnd 事件回调,接收当前句子的最终识别结果。开启 EnableWords 后,可从消息的 payload.words 中获取词信息。

resultchanged

func(string, interface{})

TranscriptionResultChanged 事件回调,接收中间识别结果。

completed

func(string, interface{})

TranscriptionCompleted 事件回调,表示整个识别任务结束。

closed

func(interface{})

服务端关闭连接通知的回调。主动调用 Shutdown 时,应由调用方完成资源释放,不依赖此回调。

param

interface{}

自定义参数,作为一个值传入各回调;消息回调的第一个参数为消息字符串,第二个参数为该自定义值。

开始识别

Start 发起识别任务。

func (st *SpeechTranscription) Start(param SpeechTranscriptionStartParam, extra map[string]interface{}) (chan bool, error)
  • param:识别参数。

  • extra:额外的请求参数,按 key:value 添加到请求中;与 param 存在同名字段时,以 extra 的值为准。不需要额外参数时传 nil。

  • 返回值:error 表示发起过程中的错误;error 为 nil 时,等待返回通道中的布尔值。true 表示任务已启动,可以发送音频;false 表示任务失败。等待时应设置超时。

发送音频

func (st *SpeechTranscription) SendAudioData(data []byte) error

data 为音频字节,格式需与识别参数一致。返回 error,非 nil 时处理发送错误。

结束识别

音频发送完毕后调用 Stop,等待识别任务结束。

func (st *SpeechTranscription) Stop() (chan bool, error)

无入参。返回的 error 表示停止过程中的错误;error 为 nil 时,等待返回通道中的布尔值。true 表示收到任务完成事件;false 表示任务失败。每句话的最终结果由 sentenceend 回调接收,等待通道时应设置超时。

发送控制命令

Ctrl 发送 ControlTranscriber 消息,param 作为消息的 payload。

func (st *SpeechTranscription) Ctrl(param map[string]interface{}) error

返回 error,非 nil 时表示发送失败。

关闭连接

func (st *SpeechTranscription) Shutdown()

强制断开连接,无入参和返回值。识别完成或发生错误后,调用该方法释放连接。

SDK 常量

常量

说明

SDK_VERSION

SDK 在请求上下文中携带的版本标识。

PCM

PCM 音频格式,值为 pcm。

WAV

WAV 音频格式,值为 wav。

OPUS

OPUS 音频格式,值为 opus。

OPU

OPU 音频格式,值为 opu。

DEFAULT_DISTRIBUTE

获取 Token 的默认地域,值为 cn-shanghai。

DEFAULT_DOMAIN

获取 Token 的默认域名,值为 nls-meta.cn-shanghai.aliyuncs.com。

DEFAULT_VERSION

获取 Token 的 API 版本,值为 2019-02-28。

DEFAULT_URL

默认 WebSocket 地址,值为 wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1。

SDK 日志

创建日志对象

DefaultNlsLog() 无入参,返回全局默认日志对象 *NlsLogger。默认以 NLS 为前缀,输出到标准错误。也可通过以下方法创建独立日志对象:

func NewNlsLogger(w io.Writer, tag string, flag int) *NlsLogger

参数

类型

说明

w

io.Writer

日志输出目标,支持任意实现 io.Writer 的对象。

tag

string

日志前缀。

flag

int

日志标记,如日期和时间。取值请参见 Go log 常量。

配置日志

以下方法均无返回值。

方法

说明

SetLogSil(sil bool)

true:关闭 Print、Printf 和 Println 的输出;false:允许这些方法输出。不影响 Debug、Fatal 和 Panic 系列方法。

SetDebug(debug bool)

true:允许 Debugf 和 Debugln 输出;false:关闭调试输出。

SetOutput(w io.Writer)

设置日志输出目标。

SetPrefix(prefix string)

设置日志前缀。

SetFlags(flags int)

设置日志标记,取值请参见 Go log 常量。

输出日志

方法

说明

Print(v ...interface{})

输出普通日志。

Println(v ...interface{})

输出普通日志,并在末尾换行。

Printf(format string, v ...interface{})

按格式字符串输出普通日志。

Debugln(v ...interface{})

输出调试日志,并在末尾换行。

Debugf(format string, v ...interface{})

按格式字符串输出调试日志。

Fatal(v ...interface{})

输出日志后调用 os.Exit(1) 退出进程。

Fatalln(v ...interface{})

输出日志并换行,然后调用 os.Exit(1) 退出进程。

Fatalf(format string, v ...interface{})

按格式字符串输出日志,然后调用 os.Exit(1) 退出进程。

Panic(v ...interface{})

输出日志后触发 panic。

Panicf(format string, v ...interface{})

按格式字符串输出日志后触发 panic。

格式化规则请参见 Go log 文档。