Paraformer 实时语音识别模型

💡 核心概念

Paraformer 是阿里达摩院开源的非自回归端到端语音识别模型,阿里云百炼平台基于它提供了实时流式识别服务。


一、Paraformer 是什么?

1.1 模型定位

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)

1.2 在阿里云百炼平台的产品线

阿里云基于 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。


二、实时流式识别的工作原理

2.1 数据流

浏览器/客户端
  │ 每 ~256ms 采集一帧 PCM(16bit, 16kHz, 单声道)
  ↓ WebSocket 二进制帧
服务端(代理层)
  │ recognition.send_audio_frame(audio_data)  ← 原样转发
  ↓ WebSocket
阿里云 DashScope(Paraformer-realtime 推理引擎)
  │ 持续接收音频帧 → 流式推理
  ↓ 回调返回
  │ is_final=false → 中间结果(可能被后续修正)
  │ is_final=true  → 该句最终结果(不再更改)
  ↓
服务端 → 浏览器

2.2 中间结果修正机制(重点)

现象:说话时屏幕上实时跳出文字,但中间结果会"变来变去"——比如一开始识别成"今天天气真好",过一会儿修正为"今天天气真热",最终确认。

原因:这不是额外的"纠错功能",而是流式 ASR 模型的固有特性:

  1. 有限上下文:模型只听到前半句音频时,只能基于有限语音上下文做最佳猜测
  2. 上下文扩展:后续更多音频帧到达后,模型获得了更完整的声学信息(包括前后音素的协同发音影响)
  3. 假设修正:模型用新的、更准确的结果替换之前的中间结果

官方文档原文:

中间结果可能修正,不应逐条拼接。收到 sentence_end=true 后,用最终结果替换该句文本。

正确的前端处理方式:

// ✅ 正确做法:中间结果只用于实时显示,不累加
if (msg.type === 'result') {
    if (msg.is_final) {
        finalTxt += text;  // 只有 is_final=true 才累加到最终文本
    }
    // 不管 is_final 都显示(让用户看到实时识别过程)
    recText.textContent = finalTxt || text;
}

// ❌ 错误做法:把每条中间结果都拼接起来
// finalTxt += text;  // 会导致文字重复、错乱

2.3 自动断句与停止

Paraformer-realtime 内置 VAD(Voice Activity Detection)能力:

💡 实测:用户说话中间的思考停顿偶尔会被 VAD 误判为句子结束。这是流式 ASR 的通用问题,可通过"按住说话"或"手动结束"规避。


三、v1 与 v2 对比

3.1 参数对比

特性 paraformer-realtime-v1 paraformer-realtime-v2
采样率 仅支持 16000Hz 支持任意采样率
语种 中文 + 英文 中/英/日/韩 + 方言(含粤语等)
热词 不支持 支持(提升专业术语识别率)
情绪识别 不支持 支持(惊讶/平静/愉快/悲伤等)
上下文增强 不支持 支持(通过配置提高特定词汇识别率)
时间戳 句级 句级 + 字级
文本润色 不支持 支持(去除语气词、重复、自我纠正)
中间结果修正 ✅ 支持 ✅ 支持(精度更高)
识别精度 基线 增强
价格 0.00024 元/秒 0.00024 元/秒(相同)
上线时间 ~2024 年初 ~2024 年中

3.2 关键差异解读

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 仅提供句级时间戳。

3.3 选型建议

场景 推荐版本 理由
新项目 v2 功能更全,精度更高,价格相同
已有 v1 集成 可保持 v1 仍可用,迁移需测试
方言场景 必须 v2 v1 不支持方言
需要热词 必须 v2 v1 不支持热词
电话客服 8kHz paraformer-realtime-8k-v2 专为低采样率优化

3.4 热词功能(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 参数,其他代码不用动。

潜在热词清单(按业务领域):


四、与离线版 paraformer-v1 的对比

本项目 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。详见《语音对话系统两代架构对比分析》。


五、在本项目中的使用

5.1 ping_04(BYPsNotes 笔记助手)

5.2 hqxbot(Daas-v2 数字员工)

5.3 HXXedge 2.1.0(海小星语音版)


六、开发经验与注意事项

6.1 DashScope WebSocket 协议要点

  1. 消息格式严格:run-task 消息中 function 字段必须为 "recognition"(不是 "transcription"),payload 中必须包含 "input": {}
  2. 等待 task-started:必须等服务端返回 task-started 响应后再发送音频帧,否则连接会被直接关闭
  3. task_id 格式:必须为 UUID 格式

6.2 并发与部署

6.3 前端处理


七、参考资料


📝 创建时间:2026-10-20
🏷️ 标签:ASR、语音识别、Paraformer、阿里云、DashScope、实时流式
📊 状态:技术专题文档

相关笔记