开放权重
OpenThai 2.0 ASR Streaming
一个开源模型,在说话的同时把泰语语音写成文字。
- 参数0.64十亿
- 许可OpenMDW-1.1
- 文字落后于语音80–1120ms
- FLEURS 字符错误率8.47%
iApp Technology 于 2026 年 11 月 12 日在 Hugging Face 发布开放权重。
能做什么
- 边说边写文字比声音晚 80、320、560 或 1120 毫秒,在解码时选择;同一份权重支持所有设置,等待越久准确率略高。
- 任意长度随附的服务器像 iApp 的托管服务一样,在停顿处把长录音切成几段,每段单独解码,因此一小时或更 长的录音也能在固定内存内完成。我们测试过最长 87 分钟的文件。
- 全部泰文,或英文词写成英文使用
th-TH提示时全部输出泰文字母;使用th-mix时,说话人说出的英文单词以拉丁字母输出。 - 谁说了什么附带的服务器可借助 NVIDIA 的开源说话人分离模型,为会议标注说话人。
- GPU 或 CPU一张 NVIDIA H100 解码文件约为实时速度的 257 倍,可同时处理约 20 路 实时流;8 线程的笔记本级 CPU 也能跟上一路实时流。
- OpenThai ASR Realtime 背后的模型iApp 的托管实时语音转文字服务运行的就是这个模型,见 OpenThai ASR Realtime。
测评结果
- 560 ms
- 1120 ms
- 按延迟
- 整段录音
字符错误率(%),越低越好,延迟 560 ms。所有模型均由我们用同一个 NeMo 流式脚本、同样的设置解码:Typhoon ASR Streaming 0.6B 按其发布版本运行,并另外运行其作者一同发布的 4-gram 语言模型。
| 测试集 | 片段 | OpenThai 2.0 ASR Streaming | Typhoon ASR Streaming 0.6B | Typhoon ASR Streaming 0.6B + 其 4-gram 语言模型 | 差值(我们 − Typhoon) |
|---|---|---|---|---|---|
| FLEURS,朗读语音 | 1,021 | 8.47 | 11.28 | 11.73 | −2.82 [−3.15, −2.48], 我们更低 |
| GigaSpeech2 测试集,YouTube | 8,823 | 15.35 | 16.33 | 16.62 | −0.98 [−1.31, −0.58], 我们更低 |
| TVSpeech,电视与 YouTube 节目 | 570 | 12.41 | 10.84 | 11.05 | +1.57 [+0.90, +2.52], Typhoon 更低 |
| LOTUSDIS 会议,会议麦克风 | 5,516 | 20.77 | 28.91 | 29.02 | −8.15 [−8.88, −7.46], 我们更低 |
| 伊森方言 | 500 | 34.90 | 34.15 | 35.79 | +0.75 [−0.21, +1.69], 持平 |
- 评分前,两边文本统一写法:数字统一、去掉空格和标点。差值为我们减去 Typhoon ASR Streaming 0.6B,并给出按整段视频、整份录音、整位说话人或整场会议重采样的 95% 配对 bootstrap 区间;区间包含零即为持平。粗体表示错误率以 95% 置信度低于另一个模型。
- TVSpeech 是 Typhoon ASR Streaming 0.6B 自己的基准。LOTUSDIS:我们用同一批会议室和麦克风的其他会议训练过,部分说话人两边都有,因此该行对我们有利。FLEURS:我们用过其训练集和开发集,没有用测试集。两个模型都用过 GigaSpeech2 训练集。我们没有用伊森话数据训练,Typhoon ASR Streaming 0.6B 公布的训练数据中也没有。
- 我们发布的文件带有在开发数据上选定的 blank offset −1.0 。对 Typhoon ASR Streaming 0.6B 做同样处理,它在同一开发数据上的最佳值为 -2.0,错误率变为:FLEURS,朗读语音 11.63,GigaSpeech2 测试集,YouTube 15.26,TVSpeech,电视与 YouTube 节目 10.68,LOTUSDIS 会议,会议麦克风 26.71,伊森方言 33.87。
字符错误率(%),越低越好,延迟 1120 ms。所有模型均由我们用同一个 NeMo 流式脚本、同样的设置解码:Typhoon ASR Streaming 0.6B 按其发布版本运行,并另外运行其作者一同发布的 4-gram 语言模型。
| 测试集 | 片段 | OpenThai 2.0 ASR Streaming | Typhoon ASR Streaming 0.6B | Typhoon ASR Streaming 0.6B + 其 4-gram 语言模型 | 差值(我们 − Typhoon) |
|---|---|---|---|---|---|
| FLEURS,朗读语音 | 1,021 | 8.36 | 11.32 | 11.64 | −2.96 [−3.31, −2.65], 我们更低 |
| GigaSpeech2 测试集,YouTube | 8,823 | 15.23 | 16.18 | 16.44 | −0.95 [−1.35, −0.49], 我们更低 |
| TVSpeech,电视与 YouTube 节目 | 570 | 12.14 | 10.70 | 11.18 | +1.45 [+0.77, +2.46], Typhoon 更低 |
| LOTUSDIS 会议,会议麦克风 | 5,516 | 20.30 | 28.23 | 28.64 | −7.93 [−8.66, −7.24], 我们更低 |
| 伊森方言 | 500 | 34.49 | 33.73 | 35.68 | +0.76 [−0.28, +1.86], 持平 |
- 评分前,两边文本统一写法:数字统一、去掉空格和标点。差值为我们减去 Typhoon ASR Streaming 0.6B,并给出按整段视频、整份录音、整位说话人或整场会议重采样的 95% 配对 bootstrap 区间;区间包含零即为持平。粗体表示错误率以 95% 置信度低于另一个模型。
- TVSpeech 是 Typhoon ASR Streaming 0.6B 自己的基准。LOTUSDIS:我们用同一批会议室和麦克风的其他会议训练过,部分说话人两边都有,因此该行对我们有利。FLEURS:我们用过其训练集和开发集,没有用测试集。两个模型都用过 GigaSpeech2 训练集。我们没有用伊森话数据训练,Typhoon ASR Streaming 0.6B 公布的训练数据中也没有。
- 我们发布的文件带有在开发数据上选定的 blank offset −1.0。对 Typhoon ASR Streaming 0.6B 做同样处理,它在同一开发数据上的最佳值为 -2.0,错误率变为:FLEURS,朗读语音 11.63,GigaSpeech2 测试集,YouTube 15.26,TVSpeech,电视与 YouTube 节目 10.68,LOTUSDIS 会议,会议麦克风 26.71,伊森方言 33.87。
| 测试集 | 80 ms | 320 ms | 560 ms | 1120 ms |
|---|---|---|---|---|
| FLEURS,朗读语音 | 8.73 / 11.78 | 8.53 / 11.67 | 8.47 / 11.28 | 8.36 / 11.32 |
| GigaSpeech2 测试集,YouTube | 16.64 / 17.75 | 15.53 / 16.64 | 15.35 / 16.33 | 15.23 / 16.18 |
| TVSpeech,电视与 YouTube 节目 | 13.06 / 11.44 | 12.54 / 10.84 | 12.41 / 10.84 | 12.14 / 10.70 |
| LOTUSDIS 会议,会议麦克风 | 26.12 / 34.35 | 21.79 / 29.49 | 20.77 / 28.91 | 20.30 / 28.23 |
| 伊森方言 | 35.84 / 35.37 | 34.72 / 34.65 | 34.90 / 34.15 | 34.49 / 33.73 |
字符错误率(%),我们 / Typhoon ASR Streaming 0.6B。延迟是模型每次等待的音频块长度,80 ms 最短。Typhoon ASR Streaming 0.6B 的模型卡只计算前瞻部分,所以其 "1040 ms" 即此处的 1120 ms。
整段录音,延迟 560 ms。每个文件把同一视频或同一录音的所有片段按顺序拼接,片段之间加一秒静音。"整段解码"即像 NeMo 脚本那样一次解码整个文件;"按停顿切分"即像随附的服务器那样,在无人说话达 0.7 秒处切开,每段单独解码。两个模型使用同一套代码,Typhoon ASR Streaming 0.6B 使用其发布时的设置。
| 测试集 | 文件 | 整段解码 | 按停顿切分 | ||||
|---|---|---|---|---|---|---|---|
| OpenThai 2.0 ASR Streaming | Typhoon ASR Streaming 0.6B | 差值(我们 − Typhoon) | OpenThai 2.0 ASR Streaming | Typhoon ASR Streaming 0.6B | 差值(我们 − Typhoon) | ||
| TVSpeech 整段视频 (0.5–47 分钟) | 18 | 23.54 | 11.07 | +12.47 [+7.49, +17.08], Typhoon 更低 | 12.66 | 10.84 | +1.82 [+1.16, +2.74], Typhoon 更低 |
| GigaSpeech2 整份录音(5–87 分钟) | 31 | 23.10 | 30.07 | −6.97 [−12.06, −2.63], 我们更低 | 13.53 | 14.42 | −0.88 [−1.34, −0.41], 我们更低 |
整段解码时,我们的模型在接近无声的停顿之后会漏掉一些词,停顿越长越安静,漏得越多;Typhoon ASR Streaming 0.6B 没有这个问题。按停顿切分后,我们的结果与逐段解码相当或更好。随附的服务器和 iApp 的托管服务 OpenThai ASR Realtime 都按停顿切分。
简而言之,在 560 ms 延迟下,本模型在朗读语音(FLEURS 8.47%,对方 11.28%)、YouTube 片段(GigaSpeech2 15.35%,对方 16.33%)和会议(LOTUSDIS,该测试集对我们有利)上的错误少于 Typhoon ASR Streaming 0.6B;在电视谈话节目(TVSpeech 12.41%,对方 10.84%)上错误更多;伊森方言上两者持平。整段录音应先按停顿切分再解码,随附的服务器就是这样做的;原因见"整段录音"标签页。
运行
- NeMo,音频文件
- 服务器,实时流
- ONNX,CPU
按模型卡说明安装 NVIDIA NeMo(Speech),然后用 NeMo 的流式脚本解码一批 16 kHz 单声道文件。本页所有数字都是这样测得的。
hf download iapp/OpenThai2.0-ASR-Streaming --local-dir OpenThai2.0-ASR-Streaming
echo '{"audio_filepath": "a.wav", "duration": 8.8, "text": ""}' > in.jsonl
python <NeMo Speech>/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=OpenThai2.0-ASR-Streaming/openthai2.0-asr-streaming_bias-1.0.nemo \
dataset_manifest=in.jsonl output_path=out att_context_size="[56,6]" \
target_lang=th-TH strip_lang_tags=true rnnt_decoding.greedy.max_symbols_per_step=2
att_context_size 决定延迟:[56,0] 80 ms,[56,3] 320 ms,[56,6] 560 ms,[56,13] 1120 ms。target_lang=th-mix 会把英文单词写成拉丁字母。
仓库附带一个小型服务器:POST /v1/transcribe 处理文件,WebSocket /v1/live 处理任意长度的实时音频,并在停顿处切分(/v1/stream 只接收一段简短语音),并提供普通语音、对话和会议三种模式。
cd OpenThai2.0-ASR-Streaming/serve
CHINDA_DEVICE=cuda python -m uvicorn app:app --port 18081
curl -F file=@a.wav -F mode=conversation http://127.0.0.1:18081/v1/transcribe
WebSocket 接收 16 kHz、16 位单声道 PCM,先返回当前已识别的文字,结束时返回最终文字。模型卡中有完整的客户端示例。
ONNX 版本只需 ONNX Runtime 即可在 CPU 上运行,无需 Python 或 PyTorch;Chinda Bot 的麦克风按钮下载的就是这一版。提供全精度(权重 2.45 GB)和 int8(0.88 GB)两种,延迟均为 560 毫秒。全精度版本:
hf download iapp/OpenThai2.0-ASR-Streaming-ONNX encoder.onnx.data openthai2.0-asr-streaming-fp32.asr.zip --local-dir OpenThai2.0-ASR-Streaming-ONNX
cd OpenThai2.0-ASR-Streaming-ONNX && unzip openthai2.0-asr-streaming-fp32.asr.zip
在我们检查的片段上,全精度文件与上面的模型逐个 token 输出相同的文本;在 Apple M3 Max 的 CPU 上,3.5 秒的语音 0.16 秒即可识别完。int8 文件尚未在真实语音上测过准确率,不确定时请使用全精度。仓库的模型卡说明了编码器和解码器的输入与输出,便于编写自己的解码循环。
测试环境:NeMo Speech cf724ac、PyTorch 2.13、Python 3.12。
需要托管服务?OpenThai ASR Realtime 通过 WebSocket API 提供此模型;Chinda ASR Pro v2 是 iApp 面向录音文件、准确率更高的服务。
局限
- 长录音。 整段一次解码时,模型会在安静的停顿之后漏掉一些词。把 TVSpeech 的片段按视频重新拼接、片段之间加一秒静音,整段解码的错误率为 23.54%,按停顿切分后为 12.66%。随附的服务器会自动按停顿切分。
- 电视与 YouTube 谈话节目。 在 TVSpeech 上 Typhoon ASR Streaming 0.6B 更准确。部分差距来自 เอ่อ 这类犹豫声:TVSpeech 的转写保留它们,本模型则省略;其余大多是英文单词。
- 英文单词。 使用
th-TH时,英文单词以泰文字母写出。使用th-mix时,TVSpeech 中 13.7% 的英文单词以拉丁字母写出,Typhoon ASR Streaming 0.6B 为 16.1%。 - 方言。 仅支持中部泰语。在伊森方言上字符错误率为 34.9%,与 Typhoon ASR Streaming 0.6B 相当。
- 与麦克风的距离。 在 LOTUSDIS 会议上(1120 ms),会议桌中央麦克风的错误率为 20.3%,远距离通道 bt3m 和 bt10m 分别为 56.5% 和 53.5%。
- 尚未测量: 电话音频(8 kHz)。尚未提供: 人名等自定义词表。
训练
12,373 小时泰语语音和 961 小时英语语音。其中 10,400 小时泰语来自 GigaSpeech2 训练集的 YouTube 音频,使用该数据集自带的自动转写;其余均为人工转写:Thai Dialect Corpus(仅中部泰语)、iApp 自有录音、Common Voice、WanJuan-SiLu、THAI SER、LOTUSDIS、Som TTS 数据集、NECTEC 的 LOTUS 和 TSync、Thai Elderly Speech、Gowajee 以及 FLEURS 训练集。我们在 NVIDIA 的分词器中加入泰语词片,基于新词表重新训练解码器,编码器从 NVIDIA 的权重开始。共训练 115,000 步,约看过 30,700 小时音频。包括发布文件中保存的 blank offset 在内,所有设置都在开发集上选定;上述测试集中的任何片段都未用于训练。数据来源、时长和训练配方见模型卡。
许可
OpenMDW License Agreement 1.1 版,与基础模型相同。OpenThai 2.0 ASR Streaming 是基于 NVIDIA Nemotron 3.5 ASR Streaming 0.6B 的泰语微调模型;NVIDIA 的许可和原始模型卡原样保留在仓库中。
Built on NVIDIA Nemotron.
由 iApp Technology 开发。训练与评测在 Siam AI Corporation 提供的 NVIDIA H100 GPU 上完成。