💡 核心概念
Paraformer 是阿里达摩院开源的非自回归端到端语音识别模型,阿里云百炼平台基于它提供了实时流式识别服务。
- 🎤 核心能力:边说边识别,毫秒级延迟,支持中英日韩 + 方言
- 🔄 关键特性:中间结果可修正(非逐条拼接),最终结果高准确率
- 📡 接入方式:WebSocket 双向流式,音频帧实时推送、结果实时回传
Paraformer(Parallel Transformer)是阿里达摩院在 FunASR 开源项目中提出的非自回归(non-autoregressive, NAR)端到端语音识别模型。与传统自回归模型(如 Transformer)逐 token 生成不同,Paraformer 一次性并行输出整句所有 token,推理速度大幅提升。
论文:Paraformer: Fast and Accurate Parallel Transformer for Non-autoregressive End-to-End Speech Recognition(arXiv: 2206.08317)
阿里云基于 Paraformer 提供了多个变体,按使用场景分为两大类:
| 产品线 | 模型 | 接口类型 | 场景 |
|---|---|---|---|
| 实时识别 | paraformer-realtime-v1 | WebSocket 流式 | 直播字幕、语音通话、会议实时转写 |
| 实时识别 | paraformer-realtime-v2 | WebSocket 流式 | 同上,增强版 |
| 录音文件转写 | paraformer-v1 | HTTP 异步任务 | 录音文件批量转写 |
| 录音文件转写 | paraformer-v2 | HTTP 异步任务 | 同上,增强版 |
| 8kHz 电话 | paraformer-realtime-8k-v2 | WebSocket 流式 | 电话客服场景 |
⚠️ 注意区分:
paraformer-realtime-*是实时流式版(WebSocket),paraformer-v*(无 realtime)是离线文件转写版(HTTP 异步)。本项目 hqxbot 用的是离线版 paraformer-v1,ping_04 用的是实时版 paraformer-realtime-v2。
浏览器/客户端
│ 每 ~256ms 采集一帧 PCM(16bit, 16kHz, 单声道)
↓ WebSocket 二进制帧
服务端(代理层)
│ recognition.send_audio_frame(audio_data) ← 原样转发
↓ WebSocket
阿里云 DashScope(Paraformer-realtime 推理引擎)
│ 持续接收音频帧 → 流式推理
↓ 回调返回
│ is_final=false → 中间结果(可能被后续修正)
│ is_final=true → 该句最终结果(不再更改)
↓
服务端 → 浏览器
现象:说话时屏幕上实时跳出文字,但中间结果会"变来变去"——比如一开始识别成"今天天气真好",过一会儿修正为"今天天气真热",最终确认。
原因:这不是额外的"纠错功能",而是流式 ASR 模型的固有特性:
官方文档原文:
中间结果可能修正,不应逐条拼接。收到 sentence_end=true 后,用最终结果替换该句文本。
正确的前端处理方式:
// ✅ 正确做法:中间结果只用于实时显示,不累加
if (msg.type === 'result') {
if (msg.is_final) {
finalTxt += text; // 只有 is_final=true 才累加到最终文本
}
// 不管 is_final 都显示(让用户看到实时识别过程)
recText.textContent = finalTxt || text;
}
// ❌ 错误做法:把每条中间结果都拼接起来
// finalTxt += text; // 会导致文字重复、错乱
Paraformer-realtime 内置 VAD(Voice Activity Detection)能力:
is_final=true(该句结束)is_final=true 后等待 1.5 秒无新结果 → 自动停止 ASR,将最终文本送给 LLM💡 实测:用户说话中间的思考停顿偶尔会被 VAD 误判为句子结束。这是流式 ASR 的通用问题,可通过"按住说话"或"手动结束"规避。
| 特性 | paraformer-realtime-v1 | paraformer-realtime-v2 |
|---|---|---|
| 采样率 | 仅支持 16000Hz | 支持任意采样率 |
| 语种 | 中文 + 英文 | 中/英/日/韩 + 方言(含粤语等) |
| 热词 | 不支持 | 支持(提升专业术语识别率) |
| 情绪识别 | 不支持 | 支持(惊讶/平静/愉快/悲伤等) |
| 上下文增强 | 不支持 | 支持(通过配置提高特定词汇识别率) |
| 时间戳 | 句级 | 句级 + 字级 |
| 文本润色 | 不支持 | 支持(去除语气词、重复、自我纠正) |
| 中间结果修正 | ✅ 支持 | ✅ 支持(精度更高) |
| 识别精度 | 基线 | 增强 |
| 价格 | 0.00024 元/秒 | 0.00024 元/秒(相同) |
| 上线时间 | ~2024 年初 | ~2024 年中 |
1. 采样率灵活性
v1 严格要求 16kHz 采样率,如果音频不是 16kHz 需要先转码。v2 支持任意采样率,服务端自动适配,省去了客户端的转码步骤。
本项目 ping_04 前端用 AudioContext({ sampleRate: 16000 }) 采集 PCM,虽然 v2 不强制要求,但保持 16kHz 仍是推荐做法(减少服务端处理开销)。
2. 方言支持
v2 支持通过 language_hints 参数指定语种,包括粤语、四川话等方言。这对于本项目在华南地区的使用场景尤为重要。
recognition = Recognition(
model='paraformer-realtime-v2',
format='pcm',
sample_rate=16000,
language_hints=['zh', 'en'], # 中文(含方言)+ 英文
callback=callback
)
3. 字级时间戳
v2 支持字级时间戳(每个字/词的 begin_time 和 end_time),可用于实现 karaoke 式逐字高亮、音视频对齐等高级功能。v1 仅提供句级时间戳。
| 场景 | 推荐版本 | 理由 |
|---|---|---|
| 新项目 | v2 | 功能更全,精度更高,价格相同 |
| 已有 v1 集成 | 可保持 | v1 仍可用,迁移需测试 |
| 方言场景 | 必须 v2 | v1 不支持方言 |
| 需要热词 | 必须 v2 | v1 不支持热词 |
| 电话客服 8kHz | paraformer-realtime-8k-v2 | 专为低采样率优化 |
ASR 模型训练时用的是通用语料,遇到公司名、产品名、行业术语、人名等不在通用词表中的词汇时,识别准确率会下降。热词功能允许用户预先指定一组"优先词汇",模型在解码时会提升这些词的匹配概率。
注意:热词不是"只识别这些词",而是当语音模棱两可时,模型倾向于选择热词版本。通用词汇的识别不受影响。
阿里云百炼提供三种提升特定词汇识别率的方式:
| 方式 | 原理 | 存储位置 | 适用场景 |
|---|---|---|---|
| 预编译热词 | 预先创建带权重的词表,识别时传 ID | 阿里云主业务空间(持久化) | 词汇稳定、跨请求复用(产品名、术语) |
| 即时热词 | 每次请求直接携带词表 | 不存储(用完即弃) | 临时词汇(当次会议人名、动态术语) |
| 上下文增强 | 传入对话历史或领域语料 | 不存储 | 词汇随对话变化,需上下文辅助理解 |
⚠️ 预编译热词仅主业务空间支持,子业务空间暂不支持。
分两步——先在阿里云创建词表拿到 ID,以后每次识别传这个 ID:
# 第 1 步:创建热词列表(只需做一次,后续复用)
from dashscope.audio.asr import VocabularyService
service = VocabularyService()
vocabulary_id = service.create_vocabulary(
prefix='hqx',
target_model='paraformer-realtime-v2', # 必须指定目标模型
vocabulary=[
{"text": "海启星", "weight": 5}, # 公司名,最高优先级
{"text": "龘思", "weight": 4}, # 系统名
{"text": "外业通", "weight": 4}, # 子系统名
{"text": "天文潮", "weight": 3}, # 业务术语
{"text": "Q/HQX", "weight": 3}, # 标准编号
]
)
# → 返回 vocabulary_id(如 "vocabulary-abc123"),词表存在阿里云
# 第 2 步:识别时传入热词列表 ID
recognition = Recognition(
model='paraformer-realtime-v2',
format='pcm',
sample_rate=16000,
callback=callback
)
result = recognition.call(audio_file, vocabulary_id=vocabulary_id)
不需要预先创建,直接在识别请求里传词表:
recognition = Recognition(
model='paraformer-realtime-v2',
format='pcm',
sample_rate=16000,
callback=callback,
vocabulary={ # 直接传词表,用完即弃
"海启星": 5,
"龘思": 4,
"外业通": 4,
}
)
weight 取值 1~5,值越大匹配优先级越高:
| 权重 | 效果 | 典型用途 |
|---|---|---|
| 5 | 最高优先 | 公司名、核心产品名 |
| 4 | 高优先 | 常用业务术语 |
| 3 | 中等优先 | 偶尔出现的专业词汇 |
| 1~2 | 轻微提升 | 辅助性提示 |
当前 ping_04 的 /ws/asr 端点未传热词,遇到公司名/产品名可能识别错。如果要加,改动很小——只需在 ws_routes.py 创建 Recognition 时加一个 vocabulary_id 参数,其他代码不用动。
潜在热词清单(按业务领域):
本项目 hqxbot 使用的是离线版 paraformer-v1(录音文件转写),与实时版有本质区别:
| 维度 | 离线版 paraformer-v1 | 实时版 paraformer-realtime-v2 |
|---|---|---|
| 接口 | HTTP 异步任务(提交→轮询) | WebSocket 双向流式 |
| 输入 | 完整音频文件的公网 URL | 实时音频帧流 |
| 延迟 | 数秒~数十秒(取决于轮询) | 毫秒级 |
| 中间结果 | 无(一次性返回最终结果) | 有(is_final=false/true) |
| 公网 IP | 需要(阿里云回连下载音频) | 不需要(全出站连接) |
| 适用场景 | 录音文件批量转写 | 实时语音对话、直播字幕 |
⚠️ hqxbot 的教训:使用离线版 paraformer-v1 做语音对话,导致用户说完话后要等 3~15 秒才有回应,且需要服务器有固定公网 IP。ping_04 改用实时版 paraformer-realtime-v2 后,首句出声降至 2.5~3.5 秒,且无需固定 IP。详见《语音对话系统两代架构对比分析》。
paraformer-realtime-v2/ws/asr → 服务端 DashScope SDK 代理转发app/ping_04/config.py 中 DASHSCOPE_ASR_MODEL = 'paraformer-realtime-v2'paraformer-v1(离线版)paraformer-realtime-v2function 字段必须为 "recognition"(不是 "transcription"),payload 中必须包含 "input": {}--worker-class gevent/ws/chat + /ws/asr)至少需要 --workers 4📝 创建时间:2026-10-20
🏷️ 标签:ASR、语音识别、Paraformer、阿里云、DashScope、实时流式
📊 状态:技术专题文档