离线语言识别方案

lishihuan大约 8 分钟

离线语言识别方案

当前方案针对是后端无法连接互联网的情况,如果不约束,则可以后端调用 阿里云 ASR

需要注意前端实现可能需要考虑HTTPS

方案一:Web Speech API(浏览器原生)

原理 浏览器提供的原生语音识别接口,调用操作系统或浏览器内置语音引擎,无需任何服务器。

优点

  • 零成本,无需 API Key,无费用
  • 前端几行代码即可实现
  • 松开手即出结果,延迟极低
  • 不需要后端任何改动

缺点

  • Android Chrome 底层调用 Google 语音服务,国内无法访问 Google 的环境下直接失败
  • Android WebView 容器(APP 内嵌 H5)默认不支持或受限
  • 各厂商定制 WebView(华为、小米、OPPO)支持程度差异极大
  • iOS Safari 支持较好,但用户需要授权麦克风

适用场景

  • PC 浏览器测试环境
  • iOS Safari(国内可用)
  • 不适合国内 Android WebView 生产环境

评级:不推荐用于生产


方案二:阿里云 ASR 前端直连(临时 Token 方案)

完整架构

┌─────────────────────────────────────────────────────┐
│  用户手机(有外网)                                    │
│                                                     │
│  1. 前端请求临时 Token                               │
│          ↓(走内网)                                 │
│  2. 后端(内网)本地计算签名,返回 Token              │
│     [AccessKeyId + Secret + 时间戳 → HMAC签名]       │
│     ★ 这一步完全不访问外网,纯本地计算               │
│          ↓(Token 返回给前端)                        │
│  3. 前端用 Token 建立 WebSocket 连接                  │
│          ↓(走用户手机外网)                          │
│  4. 阿里云 ASR 服务器                                │
│     ↑↓ 实时双向流式传输                              │
│  5. 边说话边推送音频帧 → 阿里云实时返回识别结果       │
│  6. 松开手时,最终识别结果已就绪                      │
│  7. 文字填入输入框                                   │
└─────────────────────────────────────────────────────┘

后端只做什么

// 后端签名逻辑(纯本地计算,不访问外网)
String token = HmacSHA1(accessKeySecret, timestamp + appKey);
return token;  // 返回给前端,有效期 24 小时

前端做什么

// 1. 拿 Token
const token = await fetch('/api/asr/token')

// 2. 建 WebSocket 连接(前端直连阿里云,走手机外网)
const ws = new WebSocket('wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1')

// 3. 边录音边推送音频帧
mediaRecorder.ondataavailable = (e) => ws.send(e.data)

// 4. 实时接收识别结果
ws.onmessage = (msg) => { inputText = msg.result }

优点

  • 识别率业界领先,中文极准,专业术语识别好
  • 实时流式识别,边说边出字,体验接近微信
  • 后端只需加一个签名接口,不需要访问外网(纯本地计算)
  • 用户手机有外网即可(不依赖后端网络)
  • 支持热词自定义(可加入业务专业术语)
  • 稳定可靠,有 SLA 保障

缺点

  • 有持续费用(约 3.5 元/小时使用量,按实际调用计费)
  • 依赖阿里云服务,服务故障时不可用
  • AccessKey 需要妥善保管(后端签名,前端不暴露 Key)
  • 需要阿里云账号和开通 NLS 服务

局限性

  • 用户手机必须能访问外网(本场景已满足)
  • Token 有有效期,前端需要处理 Token 过期刷新

适用场景

  • 用户手机有外网、后端是内网的场景
  • 对识别率要求高的生产环境
  • 当前场景首选

评级:推荐,短期首选


方案三:FunASR 内网部署

完整架构

┌─────────────────────────────────────────────────────┐
│  用户手机(无需外网)                                  │
│                                                     │
│  1. 前端录音,建立 WebSocket 连接到内网 FunASR 服务   │
│          ↓(走内网,实时推流)                        │
│  2. 内网 FunASR 服务(Docker)                       │
│     模型:paraformer-zh(阿里达摩院)                 │
│     热词表:[作业部位、线路名称、设备编号...]           │
│     GPU/CPU 推理 → 实时返回文字                       │
│          ↓(流式返回中间结果)                        │
│  3. 文字边说边显示,松开手最终结果就绪                 │
└─────────────────────────────────────────────────────┘

优点

  • 中文识别率与阿里云商业版同源,业界最高水平
  • 支持热词表,可针对业务专业术语优化
  • 完全内网,数据不出内网
  • 零边际成本,长期运营省钱
  • 支持实时流式识别

缺点

  • 需要 4核8G 以上服务器(无 GPU 时响应约2~3秒)
  • 有 GPU(如 T4)时体验最佳,否则实时性稍差
  • 部署相对复杂,有多个组件
  • 模型文件 3~5GB,首次下载需要时间

适用场景

  • 服务器资源充足(4核8G+,有 GPU 更好)
  • 业务专业术语多,需要热词优化
  • 长期运营,对成本敏感
  • 长期规划首选

评级:推荐,长期首选

方案四:Vosk 完整模型后端部署

完整架构

┌─────────────────────────────────────────────────────┐
│  用户手机(无需外网)                                  │
│                                                     │
│  1. 前端录音,生成 WAV/OPUS 音频文件                  │
│          ↓(走内网,上传音频)                        │
│  2. 内网 Vosk 服务(Docker 容器)                    │
│     加载 vosk-model-cn(1.3GB 完整模型)              │
│     本地 CPU 推理 → 返回文字                          │
│          ↓(返回识别结果)                            │
│  3. 文字填入输入框                                   │
└─────────────────────────────────────────────────────┘

与 FunASR 的核心区别

对比维度VoskFunASR
中文识别率★★★☆☆★★★★★
专业术语识别较差,无热词支持好,支持热词表
模型大小1.3GB约 3~5GB
内存需求2~3GB(低)4~8GB
CPU 推理速度(1秒音频约1秒处理)较慢(无 GPU 时约2~3秒)
GPU 需求不需要,CPU 即可流畅运行无 GPU 时体验较差
部署难度极简(单个 Docker 镜像)中等(多组件)
实时流式识别支持支持
服务器最低配置2核4G 即可4核8G 起步
社区维护一般,更新较慢活跃(阿里巴巴维护)

Vosk 的优势(相对 FunASR)

  • 资源需求极低:2核4G 服务器即可稳定运行,FunASR 无 GPU 时需要 4核8G+
  • 部署极简:一个 Docker 命令即可启动,FunASR 有多个组件
  • CPU 推理速度快:Vosk 针对 CPU 推理优化,无 GPU 也能快速响应
  • 适合资源受限的内网服务器

Vosk 的劣势(相对 FunASR)

  • 中文识别率低一档,专业术语(线路名称、设备编号)容易识别错
  • 不支持热词,无法针对业务场景优化
  • 模型更新慢,跟不上中文语音发展

什么时候选 Vosk 而不选 FunASR

  • 服务器配置低(24核,48G 内存,无 GPU)
  • 只需要识别简单口语,专业术语不多
  • 快速验证阶段,后期再迁移到 FunASR

优点

  • 完全内网,不依赖任何外部服务
  • 零边际成本
  • 数据完全不出内网
  • 低配服务器也能跑

缺点

  • 识别率不如阿里云和 FunASR
  • 不支持热词,专业术语容易出错
  • 响应模式是「录完再识别」(非真正实时流式,松开手后有约1~2秒等待)

评级:适合低配内网服务器的过渡方案


四方案横向对比

维度Web Speech API【国内不可用】阿里云 ASR 前端直连Vosk 后端部署FunASR 后端部署
中文识别率★★☆★★★★★★★★☆★★★★★
专业术语识别好(支持热词)较差(无热词)好(支持热词)
国内 Android 可用
实时流式

使用阿里云 Android 实时语音识别 SDK

  1. 前提准备

    • 在阿里云控制台开通「智能语音交互」服务,创建项目获取 AppKey
    • 服务端生成临时 Token(禁止在客户端硬编码 AccessKey)。
  2. 集成 SDK

    • 引入阿里云 NLS Android SDK(AAR 包),配置录音权限(RECORD_AUDIO);
    • 音频要求:PCM 格式、单声道、16 bit、采样率 8000Hz 或 16000Hz
  3. 调用流程

    • 初始化 NlsClient(建议全局单例);
    • 创建 SpeechTranscriber 实例,设置 appkeytokenurl(如 wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1);
    • 配置参数:enable_intermediate_resultenable_punctuation_prediction 等;
    • 调用 start() 开始识别,通过麦克风或音频流持续发送数据;
    • 监听回调:onTranscriptionResultChanged(中间结果)、onTranscriptionCompleted(结束)等;
    • 识别完毕调用 stop() 并释放资源。
  4. 注意事项

    • Token 需在有效期内使用,过期会导致错误码 40000001
    • 音频格式必须与参数一致,SDK 不自动转码
    • 不支持说话人分离。

相关链接 WebSocket协议说明 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/websocketopen in new window 实时语音识别 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/real-time-speech-recognition/open in new window 接口说明 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/overview-3open in new window 接口说明 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/api-referenceopen in new window 流式文本语音合成 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/streaming-text-to-speech-synthesis/open in new window 快速开始 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/stream-input-tts-sdk-quick-startopen in new window

✅ 核心参考文档(来自阿里云官网)

1. 《智能语音交互 - 实时语音识别(Android SDK)》


2. 《实时语音识别 API 参考(含参数说明)》


3. 《SDK 下载与 Demo 示例》

⚠️ 注意:Demo 中的 Token 仅为演示,生产环境必须通过您的后端服务调用 STS 或语音服务 Token 接口生成临时 Token,禁止在 App 中硬编码 AccessKey。


🔧 快速接入步骤回顾

  1. 在 阿里云智能语音交互控制台 创建项目,获取 AppKey
  2. 您的服务端实现 Token 签发接口(使用 RAM 角色 + STS);
  3. Android App 调用您的服务端获取 Token;
  4. 使用上述 SDK 文档中的代码初始化识别器并开始识别。