本文介绍如何通过WebSocket连接访问Gummy一句话识别、翻译服务。
DashScope SDK目前仅支持Java和Python。若想使用其他编程语言开发Gummy实时语音识别、翻译应用程序,可以通过WebSocket连接与服务进行通信。
WebSocket是一种支持全双工通信的网络协议。客户端和服务器通过一次握手建立持久连接,双方可以互相主动推送数据,因此在实时性和效率方面具有显著优势。
对于常用编程语言,有许多现成的WebSocket库和示例可供参考,例如:
Go:
gorilla/websocket
PHP:
Ratchet
Node.js:
ws
建议您先了解WebSocket的基本原理和技术细节,再参照本文进行开发。
音频时长不能超过一分钟,否则将报错断连。
一句话的结束,通过静音时长来判断,当语音后面出现的静音时长超过预设的静音时长(默认为700ms,可在发送run-task指令时通过请求参数
max_end_silence
设置),系统会认为当前的一句话已结束。如果语音时长超过了一分钟,则认为这一分钟内的语音是一句话。
模型列表
模型名 | 模型简介 |
gummy-chat-v1 | Gummy一句话识别、翻译模型,在识别、翻译出一句话后会结束任务。默认进行标点符号预测和逆文本正则化(INT,Inverse Text Normalization)。支持定制热词。 |
前提条件
已开通服务并获得API-KEY:获取API Key。建议您配置API Key到环境变量,从而避免在代码里显示配置API Key,降低泄漏风险。
约束
接口调用方式限制:不支持前端直接调用API,需通过后端中转。
客户端与服务端的交互流程
按时间顺序,客户端与服务端的交互流程如下:
建立连接:客户端与服务端建立WebSocket连接。
开启任务:
客户端发送
run-task
指令以开启任务。客户端收到服务端返回的
task-started
事件,标志着任务已成功开启,可以进行后续步骤。
发送音频流:
客户端开始发送音频流,并同时接收服务端持续返回的
result-generated
事件,该事件包含语音识别结果。
通知服务端结束任务:
客户端发送
finish-task
指令通知服务端结束任务,并继续接收服务端返回的result-generated
事件。
任务结束:
客户端收到服务端返回的
task-finished
事件,标志着任务结束。
关闭连接:客户端关闭WebSocket连接。
WebSocket客户端编程与消息处理
在编写WebSocket客户端代码时,为了同时发送和接收消息,通常采用异步编程。您可以按照以下步骤来编写程序:
建立WebSocket连接:首先,初始化并建立与服务器的WebSocket连接。
异步监听服务器消息:启动一个单独的线程(具体实现方式因编程语言而异)来监听服务器返回的消息,根据消息内容进行相应的操作。
发送消息:在不同于监听服务器消息的线程中(例如主线程,具体实现方式因编程语言而异),向服务器发送消息。
关闭连接:在程序结束前,确保关闭WebSocket连接以释放资源。
当然,编程思路不止这一种,您或许有更好的想法。本文主要介绍通过WebSocket连接访问服务时的鉴权细节及客户端与服务端之间的消息交互。由于篇幅有限,其他思路将不再赘述。
接下来将按照上述思路,为您详细说明。
一、建立WebSocket连接
调用WebSocket库函数(具体实现方式因编程语言或库函数而异),将请求头和URL传入以建立WebSocket连接。
请求头中需添加如下鉴权信息:
{
"Authorization": "bearer <your_dashscope_api_key>", // 将<your_dashscope_api_key>替换成您自己的API Key
"user-agent": "your_platform_info", //可选
"X-DashScope-WorkSpace": workspace, // 可选
"X-DashScope-DataInspection": "enable"
}
WebSocket URL固定如下:
wss://dashscope.aliyuncs.com/api-ws/v1/inference
二、异步监听服务器返回的消息
如上所述,您可以启动一个线程(具体实现因编程语言而异)来监听服务器返回的消息。WebSocket库通常会提供回调函数(观察者模式)来处理这些消息。您可以在回调函数中根据不同的消息类型实现相应的功能。
服务端返回给客户端的消息叫做事件,事件代表不同的处理阶段,为JSON格式,由header
和payload
这两部分组成:
payload
:包含基础信息外的其他信息。不同事件的payload
格式可能不同。
共有如下四种事件:
三、给服务器发送消息
在与监听服务器消息不同的线程中(比如主线程,具体实现因编程语言而异),向服务器发送消息。
客户端发送给服务端的消息有两种:
音频流(须为单声道音频)。
向服务器发送消息需要遵循如下时序,否则会导致任务失败:首先发送run-task
指令,待监听到服务器返回的task-started
事件后,再发送待识别的音频流。在音频流发送结束后,发送finish-task
指令。
payload.parameters支持参数:
参数 | 类型 | 默认值 | 是否必须 | 说明 |
参数 | 类型 | 默认值 | 是否必须 | 说明 |
sample_rate | integer | - | 是 | 设置待识别音频采样率(单位Hz)。只支持16000Hz。 |
format | string | - | 是 | 设置待识别音频格式。 支持的音频格式:pcm、pcm编码的wav、mp3、ogg封装的opus、ogg封装的speex、aac、amr。 |
vocabulary_id | string | - | 否 | 设置热词ID,若未设置则不生效。 在本次语音识别中,将应用与该热词ID对应的热词信息。具体使用方法请参见定制热词。 |
source_language | string | auto | 否 | 设置源(待识别/翻译语言)语言代码。如果无法提前确定语种,可不设置,默认为 目前支持的语言代码:
|
transcription_enabled | boolean | true | 否 | 设置是否启用识别功能。 模型支持单独开启识别或翻译功能,也可同时启用两种功能,但至少需要开启其中一种能力。 |
translation_enabled | boolean | false | 否 | 设置是否启用翻译功能。要正常输出翻译结果,需配置 模型支持单独开启识别或翻译功能,也可同时启用两种功能,但至少需要开启其中一种能力。 |
translation_target_languages | array[string] | - | 否 | 设置翻译目标语言代码。目标语言的代码与 目前支持的翻译包括: 中->英,中->日,中->韩, 英->中,英->日,英->韩, (日、韩、粤、德、法、俄、意、西)->(中、英)。 目前暂不支持同时翻译为多种语言,请仅设置一个目标语言以完成翻译。 |
max_end_silence | integer | 700 | 否 | 设置最大结束静音时长,单位为毫秒(ms),取值范围为200ms至6000ms。 若语音结束后静音时长超过该预设值,系统将判定当前语句已结束。 |
四、关闭WebSocket连接
在程序正常结束、运行中出现异常或接收到task-finished
、task-failed
事件时,关闭WebSocket连接。通常通过调用工具库中的close
函数来实现。
关于建连开销和连接复用
WebSocket服务支持连接复用以提升资源的利用效率,避免建立连接开销。
当服务收到 run-task
指令后,将启动一个新的任务,并在任务完成时下发 task-finished
指令以结束该任务。结束任务后webSocket连接可以被复用,发送run-task
指令开启下一个任务。
在复用连接中的不同任务需要使用不同 task_id。
如果在任务执行过程中发生失败,服务将依然下发
task-failed
指令,并关闭该连接。此时这个连接无法继续复用。如果在任务结束后60秒没有新的任务,连接会超时自动断开。
示例代码
示例代码请参见Gummy实时语音识别、翻译websocket API,在发送run-task指令时,请留意参数(模型名等)的差异;监听result-generated事件时,请关注响应结果的不同。
错误码
在使用API过程中,如果调用失败并返回错误信息,请参见错误信息进行解决。
常见问题
请参见GitHub QA。
- 本页导读 (1)
- 模型列表
- 前提条件
- 约束
- 客户端与服务端的交互流程
- WebSocket客户端编程与消息处理
- 一、建立WebSocket连接
- 二、异步监听服务器返回的消息
- 三、给服务器发送消息
- 四、关闭WebSocket连接
- 关于建连开销和连接复用
- 示例代码
- 错误码
- 常见问题