其实版本陆陆续续有递交到pypi,只是今天做一个阶段性的总结。当前版本号为v2.5.1,近期的一些修改主要对 OpenAI API 的兼容性做了一些增强,同时更新覆盖实时性、准确率、功能广度、工程稳定性四个维度。

一、实时转写:首字时延从 1.5~2s 砍到 ~0.5s

在 v2.5.1 更新中最值得关注的性能优化

  • 优化前:服务端 1.2s 缓冲 + 前端 256ms 采集周期 + 跳过开头静音 ≈ 1.5~2s 首字时延
  • 优化后:服务端 300ms 缓冲 + 前端 64ms 采集周期 + 更低静音阈值 ≈ ~0.5s 首字时延

同时新增配置项 streaming_buffer_chunk_size(默认 4800,即 300ms 缓冲),方便手动调优服务端缓冲策略。

为了方便查看和统计时延,本次还为转写流程中每一个重点功能都加上了时延统计,便于线上观测与回归对比。

二、新功能上线

1. 热词(Hotwords)支持

Paraformer / SenseVoice 后端现已支持热词功能,可在转写时注入业务专有词,显著提升专有名词、人名、术语的识别准确率。

服务端做了优化:只在热词实际发生变化时才记录日志(比较新旧值),避免高频音频传输路径上日志刷屏。

2. diarized_json 返回格式

在 OpenAI 兼容的 response_format 基础上,新增 diarized_json,返回带说话人角色的结构化结果,方便直接消费"谁在什么时候说了什么"。
老接口里说话人角色分离的接口依然可用:response_formatspk

3. 字词级时间戳(word-level timestamps)

verbose_json 模式下支持 OpenAI 兼容的 word-level 时间戳请求参数,可控制返回文本是否带每个字的时间戳,并修复了音字对照时间戳错位、英文单词间空格导致解析异常等问题。

4. 多种音频格式 & 多种返回格式

  • 音频输入:webm、ogg、mp3、m4a、flac、aac 全部支持,上传转 MP3 优先用 soundfile,回退 pydub 自动识别。
  • 返回格式:text、srt、vtt、json、verbose_json、spk、diarized_json(新增),并修正了 verbose_json/vtt/srt 下"每 10 个字切片段"的问题,改为以模型返回的 segments/spk_list 为准。

5. 说话人分离(Speaker Diarization)

修复了一系列说话人相关问题:

  • 模型类型用错(Speaker Verification → Speaker Diarization)
  • cam++ 报未注册(FunASR < 1.3.9 未注册 iic/speech_campplus_speaker-diarization_common
  • 超长音频丢失发言人(_transcribe_long_audio 只合并 text 未合并 spk_list)
  • generate 参数对齐 master:return_raw_text=True, is_final=True
  • jsonverbose_jsonspkdiarized_json四种返回格式现在都会带发言人信息,diarized_json是照最新的OpenAI API接口重新封装的。

6. 多模型动态切换

  • 前端 / API 可动态切换后端模型,无需重启服务,即时生效
  • 配置文件中每个模型新增 enabled 字段,按需启用;可指定模型路径与支持的语言类别。
  • 默认启用 Paraformer 并设为默认模型,禁用 Moonshine / SenseVoice ONNX / SenseVoiceSmall。
  • 新增 ModelType 定义规约模型类型;后端根据 config 处理 output_type,不支持则返回错误。
  • 新增 language 参数,允许请求方指定语言以提升准确率。在使用 paraformer 模型进行英文转写的时候,将 language 可获得更准确的英文识别准确率。

7. SenseVoiceSmall 模型支持

新增 SenseVoiceSmall 模型,方便像我家里的十年前的老笔记本级别的硬件上也能用OddAsr做语音转写。

8. 文件流式识别

在 Demo 的 Web 前端增加了一个"以音频文件模拟流式转写"功能,便于用历史音频复现/对比同一音频在某一引擎下的问题,或者是在不同引擎下的不同的实时/流式转写效果。

9. Web 界面增强

  • 调整 Demo 的 Web 前端界面和功能,支持麦克风录音、文件流式、离线上传三种方式,带音频播放预览。其中:文件流式是为了方便历史流式转写里出现问题的一些音频文件来模拟复现当时流式转写的情况,以便于最终定位和解决问题。
  • 新增 WebSocket 连接状态栏(地址 + 连接/断开状态),修复了旧连接回调覆盖新连接状态、CONNECTING 状态重复建连等问题。
  • 在界面上补充新增了"拷贝转写内容"按钮,方便将转写出来的内容复制出来查看详情。
  • 动态从后端加载当前支持的所有 model type 列表。

三、容量与限制提升

项目 优化前 优化后
最大上传文件大小 16M → 50M 200M
最大离线转写时长 1 小时 2 小时
2pass.max_audio_samples 480000(30s) 4800000(5 分钟)

max_audio_samples 调整后,2.5 小时音频从约 295 段降到约 30 段,大幅减少总处理时间,同时每段足够长,FunASR 说话人模型有充足上下文区分不同人。输入超限现在会返回明确的错误提示。

四、工程与稳定性

  • 统一接口:BaseASR 各子类统一使用父类的 transcribestream_generate,简化内部逻辑。
  • 离线转写新增 merge_vadmerge_length_s 参数,控制返回 segments 的合并处理。
  • 音频格式转换优化:去掉 int16→float32→int16 的来回折腾,直接从 pydub get_array_of_samples() 转 np.int16,消除精度损失和计算浪费。
  • 模型自动下载优化:解析本地 ModelScope cache 路径;模型名改用全名,避免初始化时网络同步。
  • 打包修复:修复 whl 在 PyPI 上无法正确显示邮件(PyPI 不支持多邮件)、Linux 启动报错、编译误删 templates/static 下 html 等问题。
  • FunASR 长语音时间戳偏移音频末尾文字丢失(后处理导致)等关键 bug 修复。

五、文档与体验

  • README.md 全面更新:架构、配置、2-Pass 参数表、VAD 参数、项目结构、API 使用说明。
  • 新增 response_formats 文档及字词级时间戳请求/响应示例。
  • 加入简易用户使用手册。
  • python build.py clean 现在会正确清除 .pyd / .c / .html

六、电信智能对接

7 月底完成了"电信智能对接测试项目 20260703"的指标需求与接口数据结构定义,为 OddASR 走向电信级业务场景铺路。


小结

汇总一下 OddASR v2.5.1 的更新如下:

  1. 更快——首字时延降到 0.5s,全链路时延可观测;
  2. 更准——热词、语言指定、说话人分离修复、时间戳对齐;
  3. 更广——多模型动态切换、多音频格式、多返回格式、diarized_json;
  4. 更稳——容量提升、长语音 bug 修复、打包/启动问题修复。

如果你在找一个中文准确率高于 Whisper、且兼容 OpenAI API、可私有化部署的语音识别服务,OddASR v2.5.1 值得一试:

pip install oddasr
oddasr

自定义配置启动

pip install oddasr
oddasr --config config.json

项目地址:https://github.com/oddmeta/oddasr
文档地址:https://docs.oddmeta.net/products/oddasr/

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐