通过ebocket连接ummy实现实时语音识别与翻译大模型服务平台百炼

本文介绍如何通过WebSocket连接访问Gummy一句话识别、翻译服务。

DashScope SDK目前仅支持Java和Python。若想使用其他编程语言开发Gummy实时语音识别、翻译应用程序,可以通过WebSocket连接与服务进行通信。

WebSocket是一种支持全双工通信的网络协议。客户端和服务器通过一次握手建立持久连接,双方可以互相主动推送数据,因此在实时性和效率方面具有显著优势。

对于常用编程语言,有许多现成的WebSocket库和示例可供参考,例如:

Go:gorilla/websocket

PHP:Ratchet

建议您先了解WebSocket的基本原理和技术细节,再参照本文进行开发。

音频时长不能超过一分钟,否则将报错断连。

模型名

模型简介

单价

gummy-chat-v1

0.00015元/秒

语音识别与翻译功能分别计费,费用按各自调用量独立计算。两项服务的单价一致。

建立连接:客户端与服务端建立WebSocket连接。

开启任务:

客户端发送run-task指令以开启任务。

客户端收到服务端返回的task-started事件,标志着任务已成功开启,可以进行后续步骤。

发送音频流:

客户端开始发送音频流,并同时接收服务端持续返回的result-generated事件,该事件包含语音识别结果。

通知服务端结束任务:

客户端发送finish-task指令通知服务端结束任务,并继续接收服务端返回的result-generated事件。

任务结束:

客户端收到服务端返回的task-finished事件,标志着任务结束。

关闭连接:客户端关闭WebSocket连接。

在编写WebSocket客户端代码时,为了同时发送和接收消息,通常采用异步编程。您可以按照以下步骤来编写程序:

建立WebSocket连接:首先,初始化并建立与服务器的WebSocket连接。

异步监听服务器消息:启动一个单独的线程(具体实现方式因编程语言而异)来监听服务器返回的消息,根据消息内容进行相应的操作。

发送消息:在不同于监听服务器消息的线程中(例如主线程,具体实现方式因编程语言而异),向服务器发送消息。

关闭连接:在程序结束前,确保关闭WebSocket连接以释放资源。

当然,编程思路不止这一种,您或许有更好的想法。本文主要介绍通过WebSocket连接访问服务时的鉴权细节及客户端与服务端之间的消息交互。由于篇幅有限,其他思路将不再赘述。

接下来将按照上述思路,为您详细说明。

调用WebSocket库函数(具体实现方式因编程语言或库函数而异),将请求头和URL传入以建立WebSocket连接。

请求头中需添加如下鉴权信息:

WebSocket URL固定如下:

如上所述,您可以启动一个线程(具体实现因编程语言而异)来监听服务器返回的消息。WebSocket库通常会提供回调函数(观察者模式)来处理这些消息。您可以在回调函数中根据不同的消息类型实现相应的功能。

服务端返回给客户端的消息叫做事件,事件代表不同的处理阶段,为JSON格式,由header和payload这两部分组成:

header:包含基础信息,格式较为统一。

除task-failed外,所有事件的header格式统一。

header示例:

header参数:

参数

类型

说明

header

object

请求头

string

事件类型

task-started

result-generated

task-finished

task-failed

详细说明参见下文。

string

客户端生成的task_id

payload:包含基础信息外的其他信息。不同事件的payload格式可能不同。

共有如下四种事件:

当监听到服务端返回的task-started事件时,标志着任务已成功开启。只有在接收到该事件后,才能向服务器发送待识别音频或finish-task指令;否则,任务将执行失败。

task-started事件的payload没有内容。

示例:

客户端发送待识别音频和finish-task指令的同时,服务端持续返回result-generated事件,该事件包含语音识别的结果。

可以通过result-generated事件中的sentence_end是否为True来判断该结果是中间结果还是最终结果。

示例:

当sentence_end=false时,为中间结果,在中间结果中,不保证识别和翻译进度同步,需要等待一句话结束(sentence_end=true)时同步。

payload参数说明:

参数

类型

说明

output

object

参数

类型

说明

sentence_id

integer

句子ID。

begin_time

integer

句子开始时间,单位为ms。

end_time

integer

句子结束时间,单位为ms。

text

string

识别文本。

words

array[Word]

字时间戳信息。

sentence_end

boolean

当前文本是否构成完整的句子。

true:当前文本构成完整句子,识别结果为最终结果。

false:当前文本未构成完整句子,识别结果可能会更新。

参数

类型

说明

sentence_id

integer

句子ID。

lang

string

翻译语种。

begin_time

integer

句子开始时间,单位为ms。

end_time

integer

句子结束时间,单位为ms。

text

string

识别文本。

words

array[Word]

字时间戳信息。

sentence_end

boolean

当前文本是否构成完整的句子。

true:当前文本构成完整句子,翻译结果为最终结果。

false:当前文本未构成完整句子,翻译结果可能会更新。

transcription或translations中的words为字时间戳信息,其中每一个word格式如下:

参数

类型

说明

begin_time

integer

字开始时间,单位为ms。

end_time

integer

字结束时间,单位为ms。

text

string

字。

当监听到服务端返回的task-finished事件时,说明任务已结束。此时可以关闭WebSocket连接并结束程序。

示例:

如果接收到task-failed事件,表示任务失败。此时需要关闭WebSocket连接并处理错误。通过分析报错信息,如果是由于编程问题导致的任务失败,您可以调整代码进行修正。

示例:

header参数说明:

参数

类型

说明

string

报错类型描述。

string

具体报错原因。

在与监听服务器消息不同的线程中(比如主线程,具体实现因编程语言而异),向服务器发送消息。

客户端发送给服务端的消息有两种:

音频流(须为单声道音频)。

指令:以Text Frame方式发送的JSON格式的数据,用于控制任务的起止和标识任务边界。

指令由header和payload这两部分组成:

header:包含基础信息,格式统一。

header示例:

header参数:

参数

类型

是否必选

说明

header

object

请求头

string

指令类型,可以选填

"run-task"

"finish-task"

用法参见下文。

string

当次任务ID,随机生成的32位唯一ID。

为32位通用唯一识别码(UUID),由32个随机生成的字母和数字组成。可以带横线(如 "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx")或不带横线(如 "2bf83b9abaeb4fda8d9axxxxxxxxxxxx")。大多数编程语言都内置了生成UUID的API,例如Python:

string

固定字符串:"duplex"

payload:包含基础信息外的其他信息。不同指令的payload格式可能不同。

向服务器发送消息需要遵循如下时序,否则会导致任务失败:首先发送run-task指令,待监听到服务器返回的task-started事件后,再发送待识别的音频流。在音频流发送结束后,发送finish-task指令。

该指令用于开启语音识别、翻译任务。task_id在后续发送finish-task指令时也需要使用,必须保持一致。

示例:

payload参数说明:

参数

类型

是否必选

说明

string

固定字符串:"audio"。

string

固定字符串:"asr"。

string

固定字符串:"recognition"。

string

object

固定格式:{}。

参数

类型

默认值

是否必须

说明

sample_rate

integer

设置待识别音频采样率(单位Hz)。只支持16000Hz。

format

string

设置待识别音频格式。

支持的音频格式:pcm、wav、mp3、opus、speex、aac、amr。

opus/speex:必须使用Ogg封装;

wav:必须为PCM编码;

amr:仅支持AMR-NB类型。

vocabulary_id

string

设置热词ID,若未设置则不生效。

source_language

string

auto

设置源(待识别/翻译语言)语言代码。如果无法提前确定语种,可不设置,默认为auto。

支持语音识别的语言代码:

zh:中文

en:英文

ja:日语

ko:韩语

yue:粤语

de:德语

fr:法语

ru:俄语

es:西班牙语

it:意大利语

pt:葡萄牙语

id:印尼语

ar:阿拉伯语

th:泰语

支持翻译的语言代码:

zh:中文

en:英文

ja:日语

ko:韩语

yue:粤语

de:德语

fr:法语

ru:俄语

es:西班牙语

it:意大利语

pt:葡萄牙语

id:印尼语

ar:阿拉伯语

th:泰语

hi:印地语

da:丹麦语

ur:乌尔都语

tr:土耳其语

nl:荷兰语

ms:马来语

vi:越南语

transcription_enabled

boolean

true

设置是否启用识别功能。

模型支持单独开启识别或翻译功能,也可同时启用两种功能,但至少需要开启其中一种能力。

语音识别与翻译功能分别计费,费用按各自调用量独立计算。两项服务的单价一致。

translation_enabled

boolean

false

设置是否启用翻译功能。要正常输出翻译结果,需配置translation_target_languages参数。

模型支持单独开启识别或翻译功能,也可同时启用两种功能,但至少需要开启其中一种能力。

translation_target_languages

array[string]

设置翻译目标语言代码。目标语言的代码与source_language参数一致。

目前支持的翻译包括:

中文(zh) → 英文(en)/日语(ja)/韩语(ko)/法语(fr)/德语(de)/西班牙语(es)/俄语(ru)/意大利语(it)

英文(en) → 中文(zh)/日语(ja)/韩语(ko)/葡萄牙语(pt)/法语(fr)/德语(de)/俄语(ru)/越南语(vi)/西班牙语(es)/荷兰语(nl)/丹麦语(da)/阿拉伯语(ar)/意大利语(it)/印地语(hi)/粤语(yue)/土耳其语(tr)/马来语(ms)/乌尔都语(ur)/印尼语(id)

日语(ja) → 泰语(th)/英文(en)/中文(zh)/越南语(vi)/法语(fr)/意大利语(it)/德语(de)/西班牙语(es)

韩语(ko) → 泰语(th)/英文(en)/中文(zh)/越南语(vi)/法语(fr)/西班牙语(es)/俄语(ru)/德语(de)

法语(fr) → 泰语(th)/英文(en)/日语(ja)/中文(zh)/越南语(vi)/德语(de)/意大利语(it)/西班牙语(es)/俄语(ru)/葡萄牙语(pt)

德语(de) → 泰语(th)/英文(en)/日语(ja)/中文(zh)/法语(fr)/越南语(vi)/俄语(ru)/西班牙语(es)/意大利语(it)/葡萄牙语(pt)

西班牙语(es) → 泰语(th)/英文(en)/日语(ja)/中文(zh)/法语(fr)/越南语(vi)/意大利语(it)/德语(de)/俄语(ru)/葡萄牙语(pt)

俄语(ru) → 泰语(th)/英文(en)/日语(ja)/中文(zh)/法语(fr)/越南语(vi)/德语(de)/西班牙语(es)/意大利语(it)/粤语(yue)/葡萄牙语(pt)

意大利语(it) → 泰语(th)/英文(en)/日语(ja)/中文(zh)/法语(fr)/越南语(vi)/西班牙语(es)/俄语(ru)/德语(de)

葡萄牙语(pt) → 英文(en)

印尼语(id) → 英文(en)

阿拉伯语(ar) → 英文(en)

泰语(th) → 日语(ja)/越南语(vi)/法语(fr)

印地语(hi) → 英文(en)

丹麦语(da) → 英文(en)

乌尔都语(ur) → 英文(en)

土耳其语(tr) → 英文(en)

荷兰语(nl) → 英文(en)

马来语(ms) → 英文(en)

越南语(vi) → 日语(ja)/法语(fr)

粤语(yue) → 中文(zh)/英文(en)

目前暂不支持同时翻译为多种语言,请仅设置一个目标语言以完成翻译。

max_end_silence

integer

700

设置最大结束静音时长,单位为毫秒(ms),取值范围为200ms至6000ms。

若语音结束后静音时长超过该预设值,系统将判定当前语句已结束。

客户端需在收到task-started事件后,再发送待识别的音频流。

可以发送实时音频流(比如从话筒中实时获取到的)或者录音文件音频流,音频应是单声道。

音频通过WebSocket的二进制通道上传。建议每次发送100ms的音频,并间隔100ms。

该指令用于结束语音识别任务。音频发送完毕后,客户端可以发送此指令以结束任务。

示例:

payload参数说明:

参数

类型

是否必选

说明

object

固定格式:{}。

在程序正常结束、运行中出现异常或接收到task-finished、task-failed事件时,关闭WebSocket连接。通常通过调用工具库中的close函数来实现。

WebSocket服务支持连接复用以提升资源的利用效率,避免建立连接开销。

当服务收到 run-task 指令后,将启动一个新的任务,并在任务完成时下发 task-finished 指令以结束该任务。结束任务后webSocket连接可以被复用,发送run-task指令开启下一个任务。

在复用连接中的不同任务需要使用不同 task_id。

如果在任务执行过程中发生失败,服务将依然下发 task-failed 指令,并关闭该连接。此时这个连接无法继续复用。

如果在任务结束后60秒没有新的任务,连接会超时自动断开。

语音服务选择 WebSocket 而非 HTTP/HTTPS/RESTful,根本在于其依赖全双工通信能力——WebSocket 允许服务端与客户端主动双向传输数据(如实时推送语音合成/识别进度),而基于 HTTP 的 RESTful 仅支持客户端发起的单向请求-响应模式,无法满足实时交互需求。

需将参数translation_enabled设置为true。

需通过参数translation_target_languages指定翻译目标语言。注意,该参数类型为数组而非字符串。

关注阿里云公众号或下载阿里云APP,关注云资讯,随时随地运维管控云服务

THE END