大模型时代的 ASR 技术实践:让 AI 听懂语音,从录音转写到自动字幕

举报
yd_54922183 发表于 2026/10/19 08:45:55 2026/10/19
【摘要】 语音识别(ASR)正在从传统的声学识别系统,发展为融合大规模预训练、Transformer 和语言模型的语音理解技术。本文以开源 Qwen3-ASR 为例,介绍现代 ASR 的基本原理、主流模型和调用方法,并通过客服录音批量转写、视频字幕生成两个案例,展示如何用 Python 构建实用的语音转文字应用。

一、ASR 是什么?和大语言模型有什么关系?

我们平时使用的语音输入法、视频自动字幕、会议录音转文字,背后都有 ASR(Automatic Speech Recognition,自动语音识别)的身影。

它的核心任务其实很明确:

将音频中的语音内容,转换为对应的文字。

例如,输入一段中文录音:

“你好,我想查询一下昨天购买的耳机什么时候发货。”

ASR 模型的输出就是这段话的文字,而不是回答用户什么时候发货。

这也是它与普通大语言模型的重要区别。

传统 ASR 通常包含声学建模、发音建模、语言建模和解码等环节。随着深度学习的发展,越来越多的模型开始使用端到端架构,直接学习从音频到文本的映射关系。

到了大模型时代,部分 ASR 系统进一步引入了语言模型解码器。

例如 Qwen3-ASR,其架构可以简化为:

原始语音
   │
   ▼
音频预处理
   │
   ▼
语音编码器
(Audio Encoder)
   │
   ▼
声学特征表示
   │
   ▼
语言模型解码器
(LLM Decoder)
   │
   ▼
识别文本

它的优势是,模型不仅学习声音与文字的对应关系,也能利用上下文信息改善识别。

例如,“授信敞口”和“相信窗口”在某些嘈杂录音中可能听起来相近。领域上下文可以帮助模型倾向于更合理的词语,但不能保证永远正确。

需要澄清一点:不是所有现代 ASR 都由大语言模型衍生而来。 Whisper 使用 Transformer 编码器—解码器架构,而 Qwen3-ASR 则明确结合了语音编码器与 Qwen3 语言模型解码器。

二、有哪些值得关注的 ASR 模型?

目前,开源社区中比较有代表性的模型包括:

模型 主要特点 适合场景
Whisper 多语言识别、语音翻译、成熟生态 录音整理、视频字幕
SenseVoice-Small 非自回归架构,支持情绪和声音事件识别 快速转写、语音交互
Qwen3-ASR-0.6B 轻量化,支持多语言及中文方言 本地应用、批量转写
Qwen3-ASR-1.7B 更大模型容量,支持领域上下文 专业录音、复杂声学环境

其中,Qwen3-ASR 于 2026 年 1 月开源,提供 0.6B 和 1.7B 两个版本,支持 30 种语言及 22 种中文方言,并提供流式和非流式识别能力。

本篇选择 Qwen3-ASR-0.6B 作为示例,主要考虑它参数量相对较小,又具备现代语言模型式 ASR 的典型能力。

官方项目:

三、实践案例一:批量识别客服录音

3.1 场景介绍

假设我们有一家电商公司的客服录音,希望每天将几千段通话转换为文字,供后续的质检、投诉识别和客户意图分析使用。

这里有一个现实问题:客服对话中经常出现一些专业术语。

例如:

  • 七天无理由退货
  • 运费险
  • 逆向物流
  • 价保
  • 预授权

如果语音识别模型不了解业务背景,专业词汇可能出现误识别。

Qwen3-ASR 提供了 context 参数,可以为识别过程加入领域词汇或背景提示,帮助模型改善专业词汇的识别。

3.2 环境安装

建议使用 Python 3.12 和支持 BF16 的 NVIDIA GPU 运行下面的示例。

pip install -U qwen-asr

首次运行时需要下载模型权重。

3.3 Python 完整示例

假设有两段录音:

call_001.wav
call_002.wav

我们使用一次批量调用完成识别:

import torch
from qwen_asr import Qwen3ASRModel

# 加载模型
model = Qwen3ASRModel.from_pretrained(
    "Qwen/Qwen3-ASR-0.6B",
    dtype=torch.bfloat16,
    device_map="cuda:0",
    max_new_tokens=512,
)

# 两段客服录音
audios = [
    "call_001.wav",
    "call_002.wav"
]

# 提供客服领域术语
context = (
    "电商售后客服场景。"
    "常见术语:七天无理由退货、"
    "运费险、逆向物流、价保、预授权。"
)

# 批量识别
results = model.transcribe(
    audio=audios,
    language="Chinese",
    context=context
)

# 输出识别结果
for audio, result in zip(audios, results):
    print("录音:", audio)
    print("识别内容:", result.text)
    print("-" * 30)

假设录音内容分别为:

录音:call_001.wav
识别内容:
我上周买的商品申请了七天无理由退货,
想问一下运费险什么时候赔付。

录音:call_002.wav
识别内容:
之前申请了价保,但是平台一直没有处理,
我想咨询一下是什么情况。

以上文字是示例,不是实际模型推理结果。

此时,我们就可以把识别出的文本交给下一阶段的 AI 系统。

例如:

客服录音
   │
   ▼
Qwen3-ASR
   │
   ▼
客服对话文本
   │
   ├── 意图识别
   ├── 投诉识别
   ├── 服务质检
   └── 对话摘要

这里需要特别注意:ASR 负责转写,不负责保证投诉判断或意图分类正确。后续任务需要独立的模型或规则。

另外,context 是软性提示,不是强制词表。如果真实录音说的是“退款”,模型不应该因为上下文中有“价保”就擅自修改原意。

四、实践案例二:自动生成视频字幕

4.1 为什么语音转文字还不够?

假设我们录制了一段技术课程,希望为视频生成字幕。

ASR 可以告诉我们视频里说了什么:

今天我们讲一下 Embeddings 模型的工作原理。

但视频字幕还需要知道:

  • 这句话从第几秒开始?
  • 在第几秒结束?
  • 哪一段文字应该出现在屏幕上?

这就涉及另一个技术:Forced Alignment(强制对齐)。

它接收音频及对应文字,为文字中的词或字符预测时间位置。

Qwen 官方提供了 Qwen3-ForcedAligner-0.6B,可以配合 ASR 模型完成这个任务。

4.2 整体技术流程

课程视频 MP4
     │
     ▼
提取音频 WAV
     │
     ▼
Qwen3-ASR
     │
     ▼
获得完整转写文本
     │
     ▼
Qwen3-ForcedAligner
     │
     ▼
获得文字时间戳
     │
     ▼
生成 SRT 字幕文件

4.3 Python 实现

首先从视频中提取音频。这里使用 FFmpeg:

ffmpeg -i lesson.mp4 -vn -ar 16000 -ac 1 lesson.wav

接下来运行 Python:

import torch
from qwen_asr import Qwen3ASRModel

# 同时加载 ASR 和强制对齐模型
model = Qwen3ASRModel.from_pretrained(
    "Qwen/Qwen3-ASR-0.6B",
    dtype=torch.bfloat16,
    device_map="cuda:0",
    max_new_tokens=1024,
    forced_aligner="Qwen/Qwen3-ForcedAligner-0.6B",
    forced_aligner_kwargs={
        "dtype": torch.bfloat16,
        "device_map": "cuda:0"
    }
)

# 转写并生成时间戳
result = model.transcribe(
    audio="lesson.wav",
    language="Chinese",
    return_time_stamps=True
)[0]

print("转写文本:")
print(result.text)

# 获取对齐结果
segments = result.time_stamps[0]

# 把字符级结果按长度与时间分组
groups = []
current = []

for item in segments:
    if current and (
        item.end_time - current[0].start_time > 5
        or len("".join(x.text for x in current)) >= 20
    ):
        groups.append(current)
        current = []

    current.append(item)

if current:
    groups.append(current)

# 转换为 SRT 时间格式
def srt_time(seconds):
    ms = round(seconds * 1000)
    h, ms = divmod(ms, 3600000)
    m, ms = divmod(ms, 60000)
    s, ms = divmod(ms, 1000)
    return f"{h:02}:{m:02}:{s:02},{ms:03}"

# 写入字幕文件
with open("lesson.srt", "w", encoding="utf-8") as f:
    for i, group in enumerate(groups, 1):
        start = srt_time(group[0].start_time)
        end = srt_time(group[-1].end_time)
        text = "".join(x.text for x in group)

        f.write(
            f"{i}\n{start} --> {end}\n{text}\n\n"
        )

最终得到 lesson.srt,可以导入常见视频播放器或剪辑软件。

例如,SRT 文件的格式如下:

1
00:00:01,200 --> 00:00:03,800
今天我们讲一下Embeddings模型。

2
00:00:03,800 --> 00:00:06,100
它主要用于表示文本的语义信息。

以上时间和文字仅用于演示。实际时间戳由模型预测。

需要注意,Forced Aligner 官方支持单次对齐最长约 5 分钟的语音。较长的视频应先分段,再合并时间轴。上述字幕分组只是基础实现,正式使用时最好进一步按标点、语义停顿和字幕阅读速度调整。

五、ASR 模型落地还有哪些坑?

别看语音识别似乎只需要调用一次模型,真正用于生产环境时,还是有几个问题不能忽略。

1. 语音识别也会产生幻觉。

当录音中有长时间静音、背景噪声或者模糊人声时,模型可能输出原音频中并不存在的文字。不能因为模型识别出的句子很通顺,就认为它一定正确。

2. 多人说话并不等于能够自动识别说话人。

ASR 解决的是“说了什么”,而说话人分离(Speaker Diarization)解决的是“谁在什么时候说话”。会议、客服等多说话人场景通常还需要额外的说话人分离模块。

3. 流式与离线识别不是一回事。

Qwen3-ASR 支持两种模式,但在官方 qwen-asr 工具包当前实现中,流式识别需要 vLLM 后端,且流式模式不支持同时返回时间戳。

如果是历史录音批处理,使用非流式识别通常更简单;如果是实时字幕或电话客服,才需要重点关注流式识别延迟。

4. 模型效果需要量化。

中文 ASR 常用 CER(字符错误率),英文常用 WER(词错误率):

[
CER=\frac{S+D+I}{N}
]

其中,S 是替换错误数,D 是删除错误数,I 是插入错误数,N 是参考文本字符总数。

错误率越低越好。不过,在客服等特定行业中,还应单独评估专业术语、数字金额和实体名称的识别准确率。

六、总结:ASR 在 AI 系统中扮演什么角色?

经过两个实践案例可以发现,ASR 的价值不仅是把录音变成文字。

它更重要的作用,是把语音这种非结构化输入,转换为下游 AI 系统容易处理的文本信息。

如果把上一篇介绍的 Embeddings 模型、决策模型与 ASR 结合,就能得到一条很典型的智能客服技术链路:

用户语音
   │
   ▼
ASR 语音识别
   │
   ▼
用户文本
   │
   ▼
Embeddings 语义召回
   │
   ▼
决策模型识别意图
   │
   ▼
业务系统执行
   │
   ├── 查询订单
   ├── 售后处理
   └── 转人工客服

这几个模型分别解决不同的问题:

  • ASR: 把声音变成文字。
  • Embeddings: 把文字变成可比较的语义向量。
  • 决策模型: 根据文本及业务规则进行分类或路由。
  • 生成式 LLM: 在需要时完成复杂推理、总结和回复生成。

当然,也可以采用端到端语音大模型,一次完成语音理解与回答,未必一定要拆成多个阶段。

但对于需要独立评估识别准确率、保留转写记录、控制推理成本的业务系统,模块化架构仍然有明显价值。

ASR 可以理解为 AI 系统的一双“耳朵”。它不负责所有思考,却决定了后续模型究竟听到了什么。

而在真实业务中,听准确,往往比回答得漂亮更重要。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。