使用实时语音识别 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 导致限流。
配置字段
字段 | 类型 | 说明 |
|
| 语音服务 WebSocket 地址,可使用 |
|
| 项目 Appkey。 |
|
| 访问 Token。使用 Token 初始化时必填。 |
|
| AccessKey ID。使用 JSON 初始化且未提供 Token 时,与 |
|
| AccessKey Secret。使用 JSON 初始化且未提供 Token 时,与 |
通过构造函数创建配置时会设置连接所需的参数;使用原始 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 用于设置识别参数。
字段 | 类型 | 说明 |
|
| 音频格式。可使用 |
|
| 音频采样率,单位为 Hz,需与音频及项目模型匹配。 |
|
| 是否返回中间识别结果。 |
|
| 是否开启标点预测。 |
|
| 是否开启逆文本正则化(ITN)。开启后,中文数字可转换为阿拉伯数字。 |
|
| 静音断句阈值,单位为毫秒。检测到语音后的静音时长超过阈值时触发断句。取值范围:200~6000,默认值:800。 |
|
| 是否返回词信息,包括词的文本、起止时间。 |
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)参数 | 类型 | 说明 |
|
| 连接配置,参见连接配置。 |
|
| 日志对象,为 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 服务端关闭连接通知的回调。主动调用 |
|
| 自定义参数,作为一个值传入各回调;消息回调的第一个参数为消息字符串,第二个参数为该自定义值。 |
开始识别
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) errordata 为音频字节,格式需与识别参数一致。返回 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 在请求上下文中携带的版本标识。 |
| PCM 音频格式,值为 |
| WAV 音频格式,值为 |
| OPUS 音频格式,值为 |
| OPU 音频格式,值为 |
| 获取 Token 的默认地域,值为 |
| 获取 Token 的默认域名,值为 |
| 获取 Token 的 API 版本,值为 |
| 默认 WebSocket 地址,值为 |
SDK 日志
创建日志对象
DefaultNlsLog() 无入参,返回全局默认日志对象 *NlsLogger。默认以 NLS 为前缀,输出到标准错误。也可通过以下方法创建独立日志对象:
func NewNlsLogger(w io.Writer, tag string, flag int) *NlsLogger参数 | 类型 | 说明 |
|
| 日志输出目标,支持任意实现 |
|
| 日志前缀。 |
|
| 日志标记,如日期和时间。取值请参见 Go log 常量。 |
配置日志
以下方法均无返回值。
方法 | 说明 |
|
|
|
|
| 设置日志输出目标。 |
| 设置日志前缀。 |
| 设置日志标记,取值请参见 Go log 常量。 |
输出日志
方法 | 说明 |
| 输出普通日志。 |
| 输出普通日志,并在末尾换行。 |
| 按格式字符串输出普通日志。 |
| 输出调试日志,并在末尾换行。 |
| 按格式字符串输出调试日志。 |
| 输出日志后调用 |
| 输出日志并换行,然后调用 |
| 按格式字符串输出日志,然后调用 |
| 输出日志后触发 |
| 按格式字符串输出日志后触发 |
格式化规则请参见 Go log 文档。