离线语言识别方案
离线语言识别方案
当前方案针对是后端无法连接互联网的情况,如果不约束,则可以后端调用 阿里云 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 的核心区别
| 对比维度 | Vosk | FunASR |
|---|---|---|
| 中文识别率 | ★★★☆☆ | ★★★★★ |
| 专业术语识别 | 较差,无热词支持 | 好,支持热词表 |
| 模型大小 | 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
前提准备
- 在阿里云控制台开通「智能语音交互」服务,创建项目获取
AppKey; - 服务端生成临时
Token(禁止在客户端硬编码 AccessKey)。
- 在阿里云控制台开通「智能语音交互」服务,创建项目获取
集成 SDK
- 引入阿里云 NLS Android SDK(AAR 包),配置录音权限(
RECORD_AUDIO); - 音频要求:PCM 格式、单声道、16 bit、采样率 8000Hz 或 16000Hz。
- 引入阿里云 NLS Android SDK(AAR 包),配置录音权限(
调用流程
- 初始化
NlsClient(建议全局单例); - 创建
SpeechTranscriber实例,设置appkey、token、url(如wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1); - 配置参数:
enable_intermediate_result、enable_punctuation_prediction等; - 调用
start()开始识别,通过麦克风或音频流持续发送数据; - 监听回调:
onTranscriptionResultChanged(中间结果)、onTranscriptionCompleted(结束)等; - 识别完毕调用
stop()并释放资源。
- 初始化
注意事项
- Token 需在有效期内使用,过期会导致错误码
40000001; - 音频格式必须与参数一致,SDK 不自动转码;
- 不支持说话人分离。
- Token 需在有效期内使用,过期会导致错误码
相关链接 WebSocket协议说明 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/websocket 实时语音识别 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/real-time-speech-recognition/ 接口说明 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/overview-3 接口说明 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/api-reference 流式文本语音合成 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/streaming-text-to-speech-synthesis/ 快速开始 | 智能语音交互 https://help.aliyun.com/zh/isi/developer-reference/stream-input-tts-sdk-quick-start
✅ 核心参考文档(来自阿里云官网)
1. 《智能语音交互 - 实时语音识别(Android SDK)》
文档链接:
https://help.aliyun.com/zh/intelligent-speech-interaction/developer-reference/android-sdk-overview内容包含:
- Android SDK 下载与集成方式(AAR 引入)
- 权限配置(
RECORD_AUDIO、网络权限等) - 初始化
NlsClient - 创建并配置
SpeechTranscriber - 音频数据发送(支持麦克风直采或外部音频流)
- 回调监听(中间结果、最终结果、错误处理)
- Token 获取建议(需服务端签发)
2. 《实时语音识别 API 参考(含参数说明)》
用途:
- 了解
enable_intermediate_result、enable_punctuation_prediction等参数含义 - 查看支持的采样率(8000/16000 Hz)、音频格式(PCM/WAV/OPUS 等)
- 错误码说明(如 40000001 Token 失效、40000004 超时断连)
- 了解
3. 《SDK 下载与 Demo 示例》
GitHub 官方示例(含 Android 工程):
https://github.com/aliyun/alibabacloud-nls-sdk-android包含:
- 完整可运行的 Android Studio 项目
- 麦克风录音 + 实时识别 Demo
- Token 安全获取模拟(实际应由您的服务端提供)
⚠️ 注意:Demo 中的 Token 仅为演示,生产环境必须通过您的后端服务调用 STS 或语音服务 Token 接口生成临时 Token,禁止在 App 中硬编码 AccessKey。
🔧 快速接入步骤回顾
- 在 阿里云智能语音交互控制台 创建项目,获取 AppKey;
- 您的服务端实现 Token 签发接口(使用 RAM 角色 + STS);
- Android App 调用您的服务端获取 Token;
- 使用上述 SDK 文档中的代码初始化识别器并开始识别。