本文介绍Qwen-Audio-3.0-ASR-Flash-Streaming/Fun-ASR-Realtime实时语音识别Java SDK的参数和接口细节。
用户指南:关于模型介绍和选型建议请参见语音识别。
Recognition类提供了非流式调用和双向流式调用等接口。请根据实际需求选择合适的调用方式:
提交单个语音实时转写任务,通过传入本地文件的方式同步阻塞地拿到转写结果。
实例化Recognition类,调用
提交单个语音实时转写任务,通过实现回调接口的方式流式输出实时识别结果。
提交单个语音实时转写任务,通过实现工作流(Flowable)的方式流式输出实时识别结果。
Flowable 是一个用于工作流和业务流程管理的开源框架,它基于 Apache 2.0 许可证发布。关于Flowable的使用,请参见Flowable API详情。
在DashScope Java SDK中,采用了OkHttp3的连接池技术,以减少重复建立连接的开销。详情请参见实时语音识别高并发场景。
SDK的接口地址需在初始化前设置为下方地址(包含WorkspaceId)。如需切换到其他地域,请修改
切换到新加坡地域:
通过
双向流式调用时,服务端会通过回调的方式,将关键流程信息和数据返回给客户端。您需要实现回调方法,处理服务端返回的信息或者数据。
回调方法的实现,通过继承抽象类
如遇报错问题,请参见错误码进行排查。
若问题仍未解决,请加入开发者群反馈遇到的问题,并提供Request ID,以便进一步排查问题。
将请求参数
可使用FFmpeg工具,更多用法请参见FFmpeg官网。
识别本地文件有两种方式:
前提条件
快速开始
Recognition类提供了非流式调用和双向流式调用等接口。请根据实际需求选择合适的调用方式:
- 非流式调用:针对本地文件进行识别,并一次性返回完整的处理结果。适合处理录制好的音频。
- 双向流式调用:可直接对音频流进行识别,并实时输出结果。音频流可以来自外部设备(如麦克风)或从本地文件读取。适合需要即时反馈的场景。
非流式调用
提交单个语音实时转写任务,通过传入本地文件的方式同步阻塞地拿到转写结果。
实例化Recognition类,调用call方法绑定请求参数和待识别文件,进行识别并最终获取识别结果。
点击查看完整示例
点击查看完整示例
双向流式调用:基于回调
提交单个语音实时转写任务,通过实现回调接口的方式流式输出实时识别结果。
-
启动流式语音识别
实例化Recognition类,调用
call方法绑定请求参数和回调接口(ResultCallback)并启动流式语音识别。 -
流式传输
循环调用Recognition类的
sendAudioFrame方法,将从本地文件或设备(如麦克风)读取的二进制音频流分段发送至服务端。 在发送音频数据的过程中,服务端会通过回调接口(ResultCallback)的onEvent方法,将识别结果实时返回给客户端。 建议每次发送的音频时长约为100毫秒,数据大小保持在1KB至16KB之间。 -
结束处理
调用Recognition类的
stop方法结束语音识别。 该方法会阻塞当前线程,直到回调接口(ResultCallback)的onComplete或者onError回调触发后才会释放线程阻塞。
点击查看完整示例
点击查看完整示例
双向流式调用:基于Flowable
提交单个语音实时转写任务,通过实现工作流(Flowable)的方式流式输出实时识别结果。
Flowable 是一个用于工作流和业务流程管理的开源框架,它基于 Apache 2.0 许可证发布。关于Flowable的使用,请参见Flowable API详情。
点击查看完整示例
点击查看完整示例
直接调用Recognition类的
streamCall方法开始识别。streamCall方法返回一个Flowable<RecognitionResult>实例,您可以调用Flowable实例的blockingForEach、subscribe等方法处理识别结果。识别结果封装在RecognitionResult中。streamCall方法需要传入两个参数:RecognitionParam实例(请求参数):通过它可以设置语音识别所需的模型、采样率、音频格式等参数。Flowable<ByteBuffer>实例:您需要创建一个Flowable<ByteBuffer>类型的实例,并在其中实现解析音频流的方法。
高并发调用
在DashScope Java SDK中,采用了OkHttp3的连接池技术,以减少重复建立连接的开销。详情请参见实时语音识别高并发场景。
接口地址
SDK的接口地址需在初始化前设置为下方地址(包含WorkspaceId)。如需切换到其他地域,请修改 Constants.baseWebsocketApiUrl为对应地域的URL。
- 华北2(北京)
- 新加坡
wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference调用时请将{WorkspaceId}替换为真实的Workspace ID。请求参数
通过RecognitionParam的链式方法配置模型、采样率、音频格式等参数。配置完成的参数对象传入Recognition类的call/streamCall方法中使用。
点击查看示例
点击查看示例
| 参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
| model | String | 是 | 指定模型名。支持Qwen-Audio-3.0-ASR-Flash-Streaming和Fun-ASR-Realtime系列模型,详情请参见支持的模型与地域。 |
| sampleRate | Integer | 是 | 采样率(Hz)。取值范围:8k模型仅支持 8000 Hz,其他模型支持任意采样率。 |
| format | String | 是 | 音频格式。取值范围:
|
| vocabularyId | String | 否 | 预编译热词列表 ID。需预先调用创建热词列表接口生成,识别时传入该 ID 即可使用列表中的热词。适用于词汇已知且相对稳定、需要跨请求复用同一词表的场景。使用方法请参见预编译热词。 |
| vocabulary | Map<String, Integer> | 否 | 即时热词。以键值对形式传入,键为热词文本(string),值为热词权重(integer),无需预先创建热词列表。权重取值范围为 [1, 5] 或 50:取 [1, 5] 时值越大模型越倾向输出该词;取 50 时为超级热词,召回率大幅提升,但超级热词数量最多不超过 50 个。适用于临时性、会话级别的热词优化。与预编译热词同时配置时,系统会合并两类热词;合并后超过 2000 个时,随机选择 2000 个使用。使用方法请参见即时热词。vocabulary需要通过 RecognitionParam 实例的 parameter 方法或者 parameters 方法进行设置: |
| semantic_punctuation_enabled | boolean | 否 | 是否启用语义断句。默认值:false。
semantic_punctuation_enabled需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置: |
| max_sentence_silence | Integer | 否 | VAD 断句静音阈值(ms)。当一段语音后的静音时长超过该阈值时,系统会判定该句子已结束。当semantic_punctuation_enabled为true时,不作为sentence_end返回依据,但设置过小可能会影响识别效果。默认值:1300。取值范围:[200, 6000]。max_sentence_silence需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置: |
| multi_threshold_mode_enabled | boolean | 否 | 是否启用多阈值模式。启用后可防止 VAD 断句切割过长。默认值:false。multi_threshold_mode_enabled需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置: |
| punctuation_prediction_enabled | boolean | 否 | 设置是否在识别结果中自动添加标点:
punctuation_prediction_enabled需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置: |
| heartbeat | boolean | 否 | 是否启用心跳包。默认值:false。
使用该字段时,SDK版本不能低于2.19.1。 heartbeat需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置: |
| language_hints | String[] | 否 | 待识别音频语种。无默认值,不设置时模型自动识别。对于 Qwen-Audio-3.0-ASR-Flash-Streaming 系列模型,最多支持设置 4 个值,即便设置超出 4 个,也仅前 4 个生效;对于 Fun-ASR-Realtime 系列模型,仅支持设置 1 个值,即便设置多个,也仅第一个生效。
点击查看支持的语言代码
language_hints需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置: |
| speech_noise_threshold | float | 否 | 语音与噪音的判定阈值,用于调整语音活动检测(VAD)的灵敏度。取值范围:[-1.0, 1.0]。取值说明:
speech_noise_threshold需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置: |
| special_word_filter | String | 否 | 指定在语音识别过程中需要处理的敏感词,并支持对不同敏感词设置不同的处理方式。详情请参见敏感词过滤。special_word_filter需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置: |
| input | Map<String, Object> | 否 | 输入对象,用于传入对话上下文(context)。上下文用于辅助识别、提升专有词汇的识别准确率。使用方法详见快速开始。Map 中需包含 context 键,值为 List<Map<String, Object>> 类型的消息数组,每条消息包含以下字段:
使用该字段时,SDK版本不能低于2.22.23。 input通过RecognitionParam实例的input方法进行设置: |
| apiKey | String | 否 | 用户API Key。 |
关键接口
Recognition类
Recognition通过“import com.alibaba.dashscope.audio.asr.recognition.Recognition;”方式引入。它的关键接口如下:
| 接口/方法 | 参数 | 返回值 | 描述 |
|---|---|---|---|
| 无 | 基于回调形式的流式实时识别,该方法不会阻塞当前线程。 | |
| 识别结果 | 基于本地文件的非流式调用,该方法会阻塞当前线程直到全部音频读完,该方法要求所识别文件具有可读权限。 | |
| Flowable<RecognitionResult> | 基于Flowable的流式实时识别。 | |
| 无 | 推送音频,每次推送的音频流不宜过大或过小,建议每包音频时长为100ms左右,大小在1KB~16KB之间。识别结果通过回调接口(ResultCallback)的onEvent方法获取。 | |
| 无 | 无 | 停止实时识别。该方法会阻塞当前线程,直到回调实例ResultCallback的onComplete或者onError被调用之后才会解除对当前线程的阻塞。 | |
| code: WebSocket关闭码(Close Code)reason:关闭原因这两个参数可参考The WebSocket Protocol文档进行配置 | true | 在任务结束后,无论是否出现异常都需要关闭WebSocket连接,避免造成连接泄漏。关于如何复用连接提升效率请参考实时语音识别高并发场景。 | |
| 无 | requestId | 获取当前任务的requestId,在调用call、streamingCall开始新任务之后可以使用。该方法自2.18.0版本及以后的SDK中才开始提供。 | |
| 无 | 首包延迟 | 获取首包延迟,从发送第一包音频到收到首包识别结果延迟,在任务完成后使用。 该方法自2.18.0版本及以后的SDK中才开始提供。 | |
| 无 | 尾包延迟 | 获得尾包延迟,发送stop指令到最后一包识别结果下发耗时,在任务完成后使用。该方法自2.18.0版本及以后的SDK中才开始提供。 |
回调接口(ResultCallback)
双向流式调用时,服务端会通过回调的方式,将关键流程信息和数据返回给客户端。您需要实现回调方法,处理服务端返回的信息或者数据。
回调方法的实现,通过继承抽象类ResultCallback完成,继承该抽象类时,您可以指定泛型为RecognitionResult。RecognitionResult封装了服务器返回的数据结构。
由于Java支持连接复用,因此没有onClose和onOpen。
示例
示例
| 接口/方法 | 参数 | 返回值 | 描述 |
|---|---|---|---|
result:实时识别结果(RecognitionResult) | 无 | 当服务有回复时会被回调。 | |
| 无 | 无 | 任务完成后该接口被回调。 | |
e:异常信息 | 无 | 发生异常时该接口被回调。 |
响应结果
实时识别结果(RecognitionResult)
RecognitionResult代表一次实时识别的结果。
| 接口/方法 | 参数 | 返回值 | 描述 |
|---|---|---|---|
| 无 | requestId | 获取requestId。 | |
| 无 | 是否是完整句子,即产生断句 | 判断给定句子是否已经结束。 | |
| 无 | 单句信息(Sentence) | 获取单句信息,包括时间戳和文本信息等。 |
单句信息(Sentence)
| 接口/方法 | 参数 | 返回值 | 描述 |
|---|---|---|---|
| 无 | 句子开始时间,单位为ms | 返回句子开始时间。 | |
| 无 | 句子结束时间,单位为ms | 返回句子结束时间。 | |
| 无 | 识别文本 | 返回识别文本。 | |
| 无 | 字时间戳信息(Word)的List集合 | 返回字时间戳信息。 |
字时间戳信息(Word)
| 接口/方法 | 参数 | 返回值 | 描述 |
|---|---|---|---|
| 无 | 字开始时间,单位为ms | 返回字开始时间。 | |
| 无 | 字结束时间,单位为ms | 返回字结束时间。 | |
| 无 | 字 | 返回识别的字。 | |
| 无 | 标点 | 返回标点。 |
错误码
如遇报错问题,请参见错误码进行排查。
若问题仍未解决,请加入开发者群反馈遇到的问题,并提供Request ID,以便进一步排查问题。
常见问题
功能特性
Q:在长时间静默的情况下,如何保持与服务端长连接?
将请求参数heartbeat设置为true,并持续向服务端发送静音音频。
静音音频指的是在音频文件或数据流中没有声音信号的内容。静音音频可以通过多种方法生成,例如使用音频编辑软件如Audacity或Adobe Audition,或者通过命令行工具如FFmpeg。
Q:如何将音频格式转换为满足要求的格式?
可使用FFmpeg工具,更多用法请参见FFmpeg官网。
Q:如何识别本地文件(录音文件)?
识别本地文件有两种方式:
-
直接传入本地文件路径:此种方式在最终识别结束后获取完整识别结果,不适合即时反馈的场景。
参见非流式调用,在Recognition类的
call方法中传入文件路径对录音文件直接进行识别。 -
将本地文件转成二进制流进行识别:此种方式一边识别文件一边流式获取识别结果,适合即时反馈的场景。
- 参见双向流式调用:基于回调,通过Recognition类的
sendAudioFrame方法向服务端发送二进制流对其进行识别。 - 参见双向流式调用:基于Flowable,通过Recognition类的
streamCall方法向服务端发送二进制流对其进行识别。
- 参见双向流式调用:基于回调,通过Recognition类的
故障排查
Q:无法识别语音(无识别结果)是什么原因?
-
请检查请求参数中的音频格式(
format)和采样率(sampleRate/sample_rate)设置是否正确且符合参数约束。以下为常见错误示例:- 音频文件扩展名为 .wav,但实际为 MP3 格式,而请求参数
format设置为 mp3(参数设置错误)。 - 音频采样率为 3600Hz,但请求参数
sampleRate/sample_rate设置为 48000(参数设置错误)。
- 音频文件扩展名为 .wav,但实际为 MP3 格式,而请求参数
-
请检查
language_hints设置的语言是否与音频实际语言一致。 例如:音频实际为中文,但language_hints设置为en(英文)。 - 若以上检查均无问题,可通过定制热词提升对特定词语的识别效果。