将连续音频流实时转写为文字
模型可用性、支持语言和功能对比,请参见语音转文字模型。
快速开始
- Fun-ASR
- Qwen-ASR
更多代码示例,请参见 GitHub。获取 API Key 并将其设置为环境变量。如需使用 SDK,请先安装。
安装依赖
模型可用性
以下价格为目录价。具体优惠活动及折扣价格请前往模型市场查看。
| 模型 | 版本 | 单价 | 免费额度 (说明) |
|---|---|---|---|
| fun-asr-realtime 当前版本:fun-asr-realtime-2025-11-07 | 稳定版 | 0.00033元/秒 | 36,000 秒(10 小时) 有效期 90 天 |
| fun-asr-realtime-2025-11-07 | 快照版 | 0.00033元/秒 | 36,000 秒(10 小时) 有效期 90 天 |
- 支持语言:普通话、粤语、吴语、闽南语、客家话、赣语、湘语、晋语,以及中原、西南、冀鲁、江淮、兰银、胶辽、东北、北京、港台等地区的普通话口音——涵盖河南、陕西、湖北、四川、重庆、云南、贵州、广东、广西、河北、天津、山东、安徽、南京、江苏、杭州、甘肃、宁夏等地。同时支持英语和日语。
- 采样率:16 kHz
- 音频格式:pcm、wav、mp3、opus、speex、aac、amr
从麦克风实时识别
从麦克风采集音频并实时输出识别结果。运行 Python 示例前,请先执行
pip install pyaudio 安装第三方音频播放和采集套件。pyaudio 依赖 portaudio 库:Ubuntu/Debian 执行 sudo apt-get install libportaudio2 portaudio19-dev,macOS 执行 brew install portaudio。识别本地音频文件
该功能用于识别并转写本地音频文件,适合需要近实时处理短音频的场景,如语音聊天、语音指令、语音输入和语音搜索。以下示例使用的音频文件为 asr_example.wav。
WebSocket API
以下示例演示如何通过原生 WebSocket 连接发送本地音频文件并获取识别结果。以下示例使用的音频文件为 asr_example.wav。
请勿将示例代码文件命名为
websocket.py,否则可能出现以下错误:AttributeError: module 'websocket' has no attribute 'WebSocketApp'. Did you mean: 'WebSocket'?上线部署
提升识别准确率
- 选择采样率匹配的模型:对于 8 kHz 电话音频,请直接使用 8 kHz 模型,而非将其上采样至 16 kHz 后再识别。上采样会导致信息失真,影响识别效果。
- 使用自定义词汇功能:针对业务专有名词、人名、品牌名等,可配置自定义词汇,显著提升识别准确率。详情请参见自定义词汇。
- 优化输入音频质量:尽量使用高质量麦克风,保证较高的信噪比(SNR)和无回声的录音环境。在应用层,可集成降噪(如 RNNoise)和声学回声消除(AEC)等算法对音频进行预处理,获取更干净的信号。
- 指定识别语言:对于多语言模型,若在调用时能预先确定音频语言,有助于模型快速收敛,避免发音相似的语言之间产生混淆,从而提升准确率。
敏感词过滤
敏感词过滤可对识别结果中的敏感词执行替换或移除,适用于客服质检、内容合规、字幕审核等场景。
- 支持范围:仅 Fun-ASR。
- 使用限制:最多支持设置 32 个敏感词。
- 默认行为:未传入
special_word_filter参数时,不会对敏感词进行过滤。
special_word_filter 是 JSON 对象,包含三个子字段:
filter_with_signed.word_list:字符串数组,列出需要被替换为等长*的敏感词。例如["测试"],「帮我测试一下」会变成「帮我**一下」。filter_with_empty.word_list:字符串数组,列出需要从结果中完全移除的敏感词。例如["开始"],「比赛这就要开始了吗」会变成「比赛这就要了吗」。system_reserved_filter:布尔值,默认false。是否启用敏感词过滤功能。
设置容错策略
- 客户端断线重连:客户端应实现自动重连机制,以应对网络抖动。对于 Python SDK,建议:
- 捕获异常:在
Callback类中实现on_error方法。网络错误或其他异常发生时,dashscopeSDK 会调用此方法。 - 通知状态:
on_error触发时,设置重连信号。在 Python 中,可使用线程安全标志threading.Event。 - 重连循环:将主逻辑包裹在
for循环中(例如重试 3 次)。检测到重连信号时,中断当前识别、清理资源,并在等待数秒后重启循环以建立新连接。
- 捕获异常:在
- 设置心跳防止连接断开:为保持与服务器的持久连接,请将
heartbeat参数设置为true。即使音频长时间静音,也能确保连接不中断。 - 限流:调用模型接口时,请注意遵守模型的限流规则。
核心功能:上下文增强(Qwen-ASR)
通过提供上下文,可优化特定领域词汇的识别效果,例如人名、地名和产品术语。
长度限制: 上下文内容不得超过 10,000 个 token。
使用方式:
- WebSocket API:在 session.update 事件中设置
session.input_audio_transcription.corpus.text参数。 - Python SDK:设置
corpus_text参数。 - Java SDK:设置
corpusText参数。
- 各类分隔符格式的热词列表,如:热词1、热词2、热词3、热词4
- 任意格式和长度的文本段落或章节
- 混合内容:词汇列表与段落的任意组合
- 无关或无意义的文本,包括乱码。该功能容错性强,几乎不受无关文本的负面影响。
| 无上下文增强 | 有上下文增强 |
|---|---|
| 无上下文增强时,部分投行名称可能被误识。例如,"Bulge Bracket"被识别为"鸟石"。识别结果:"你了解哪些投行圈的内部黑话?首先是九大外资投行,即鸟石,BB……" | 有上下文增强时,投行名称被正确识别。识别结果:"你了解哪些投行圈的内部黑话?首先是九大外资投行,即 Bulge Bracket,BB……" |
- 词汇列表:
- 词汇列表 1:
- 词汇列表 2:
- 词汇列表 3:
- 自然语言:
- 含干扰信息的自然语言:部分文本与识别内容无关,例如以下示例中的人名列表。
API 参考
- Fun-ASR
- Qwen-ASR
交互流程(Qwen-ASR-Realtime)
Qwen 实时语音识别通过 WebSocket 流式传输音频。提供两种模式:VAD 模式(默认) 和手动模式。
URL
将 <model_name> 替换为您的模型名称。
请求头
VAD 模式(默认)
服务端检测语音边界并自动分句。客户端流式推送音频,服务端在每句话结束时返回识别结果。适合对话和会议转写场景。
启用方式: 在 session.update 事件中设置 session.turn_detection。
-
客户端发送
input_audio_buffer.append,向缓冲区追加音频。 -
服务端检测到语音时,返回
input_audio_buffer.speech_started。若客户端在此事件之前发送了session.finish,服务端将返回session.finished,客户端须断开连接。 -
客户端继续发送
input_audio_buffer.append。 -
所有音频发送完毕后,客户端发送
session.finish结束会话。 -
服务端检测到语音结束时,返回
input_audio_buffer.speech_stopped。 -
服务端返回
input_audio_buffer.committed。 -
服务端返回
conversation.item.created。 -
服务端返回
conversation.item.input_audio_transcription.text,包含实时转写结果。 -
服务端返回
conversation.item.input_audio_transcription.completed,包含最终转写结果。 -
识别完成后,服务端返回
session.finished,客户端须断开连接。
手动模式
由客户端控制分句:发送一句话完整的音频后,再发送 input_audio_buffer.commit。适合客户端已知句子边界的场景,例如聊天应用中的语音消息。
启用方式: 在 session.update 事件中将 session.turn_detection 设置为 null。
-
客户端发送
input_audio_buffer.append,向缓冲区追加音频。 -
客户端发送
input_audio_buffer.commit,创建新的用户消息。 -
客户端发送
session.finish结束会话。 -
服务端返回
input_audio_buffer.committed。 -
服务端返回
conversation.item.input_audio_transcription.text,包含实时转写结果。 -
服务端返回
conversation.item.input_audio_transcription.completed,包含最终转写结果。 -
识别完成后,服务端返回
session.finished,客户端须断开连接。
备选方案:使用 Qwen-Omni
您也可以使用 Qwen-Omni(qwen3-omni-flash-realtime)通过 WebSocket 进行实时语音识别。Qwen-Omni 是一个能理解音频的大语言模型——您可以通过系统提示词提供领域上下文,而无需使用热词列表。
适合使用 Omni 进行 ASR 的场景: 输入音频干净(麦克风、语音通话),且需要通过提示词处理特定领域术语。
适合使用专用 ASR 模型的场景: 音频嘈杂或混合(含背景音乐的会议、含音效的视频),或需要热词、说话人分离、时间戳等功能。
Qwen-Omni 会处理所有音频内容,而不仅仅是语音。音乐、打字声或环境噪声可能产生描述性文字而非转写结果。对于混合音频,请提前使用 VAD 隔离语音,或改用专用 ASR 模型。
Qwen-Omni-Realtime 使用 WebSocket 进行双向流式传输。完整的 API 和 SDK 参考,请参见实时对话。