跳到主要内容

如何在 Windows、Mac 和 Linux 上运行 OpenThai 2.0 ASR Streaming

· 9 分钟阅读
Kobkrit Viriyayudhakorn
CEO @ iApp Technology

我们本周发布的 OpenThai 2.0 ASR Streaming 能在说话人还在说话时就把泰语写成文字。本指南介绍如何在自己的电脑上运行它:安装、转写录音,以及从麦克风生成实时字幕。音频始终留在你的电脑上。

三种使用方式​

  • 无需写代码:Chinda Bot。 我们的免费桌面应用 Chinda Bot 支持 Mac、Windows 和 Linux arm64,带有麦克风按钮:按下后说泰语,语音会在你的电脑上由这个模型转成文字。
  • 在自己的机器上,从自己的代码调用: 使用模型及其附带的小型服务器,即本指南的内容。
  • 通过 API: OpenThai ASR Realtime 通过 WebSocket 提供同一个模型,发布期间免费;Chinda ASR Pro v2 是我们用于录音文件、准确率更高的服务。

需要准备​

系统Linux;通过 WSL 2 使用 Windows 10 或 11;或 Apple 芯片的 Mac
处理器CPU 即可。Linux 上有 NVIDIA GPU 会快很多;在 Mac 上模型运行于 CPU
内存约 6 GB 可用内存(在我们的 Mac 上服务器峰值约 6 GB)
下载模型 2.6 GB,另加 Python 软件包:我们的 Mac 上为 1.4 GB;Linux 上更多,因为 PyTorch 带有 NVIDIA 的 GPU 库

我们测试了什么。 下文每一步都在一台 M3 Max 的 MacBook Pro 上用 CPU 运行过。我们的团队在配备 NVIDIA H100 GPU 的 Linux 和 Linux CPU 上运行同一个服务器。我们尚未亲自在 Windows 上测试。

1. 安装​

在 Ubuntu 或 Debian 上,先安装工具,再安装用于安装 Python 和软件包的 uv:

sudo apt install git curl ffmpeg libportaudio2
curl -LsSf https://astral.sh/uv/install.sh | sh

打开一个新终端,然后运行:

mkdir thai-asr && cd thai-asr
uv venv asr --python 3.12
source asr/bin/activate
uv pip install torch==2.13.0 --index-url https://download.pytorch.org/whl/cu130
uv pip install Cython packaging
uv pip install --extra-index-url https://download.pytorch.org/whl/cu130 --index-strategy unsafe-best-match \
"nemo-toolkit[asr] @ git+https://github.com/NVIDIA-NeMo/Speech.git@cf724ac337d1ebc7d0dda1e23fb80916f52927a5"
uv pip install fastapi uvicorn python-multipart websockets huggingface_hub sounddevice

这是我们团队使用的软件包组合,有无 NVIDIA GPU 都可以使用。

这个环境把安装的软件包与电脑的其他部分隔开。每次打开新终端时,进入 thai-asr 文件夹并再次运行 source asr/bin/activate。

2. 下载模型​

所有系统都用同一条命令,下载模型文件和服务器,共 2.6 GB:

hf download iapp/OpenThai2.0-ASR-Streaming --include "serve/*" --include "*_raw.nemo" --local-dir OpenThai2.0-ASR-Streaming

3. 启动服务器​

cd OpenThai2.0-ASR-Streaming/serve
CHINDA_DEVICE=cuda CHINDA_PRELOAD=1 python -m uvicorn app:app --port 18081

没有 NVIDIA GPU 时,去掉 CHINDA_DEVICE=cuda。

首次启动需要一到两分钟。服务器打印 Application startup complete 即表示就绪。让它保持运行,再打开第二个终端进行下一步。

4. 转写录音​

在第二个终端中,进入 thai-asr 文件夹并激活环境:

curl -F file=@meeting.wav -F mode=standard http://127.0.0.1:18081/v1/transcribe

返回结果为 JSON,文字在 display_text 中,句与句之间以空格分隔。

  • 长录音会在无人说话 0.7 秒处切开,逐段识别,各段列在 segments 中。请保持这种方式:如果作为一条长流识别,模型会漏掉安静停顿之后的部分词语。
  • mode: standard 用于朗读、新闻、讲座和口述;conversation 用于日常对话和视频片段;meeting 会增加说话人标注,由首次使用时下载的另一个模型完成。
  • 其他字段: lang=th-mix 用拉丁字母写出英文单词;latency_ms 可选 80、320、560(默认)或 1120。
  • 格式: WAV 和 FLAC 可直接读取;MP3 等格式需要第 1 步安装的 ffmpeg。

在我们 M3 Max 的 CPU 上,7.6 秒的片段用时 2.2 秒,41 秒的录音用时 5.9 秒,约为实时速度的 3 到 7 倍。在一张 NVIDIA H100 上,转写文件约为实时速度的 257 倍。

5. 麦克风实时字幕​

把以下代码保存为 thai-asr 文件夹中的 live_mic.py:

live_mic.py
"""Live Thai captions from your microphone with OpenThai 2.0 ASR Streaming.

Start the server first, then: python live_mic.py (Ctrl+C to stop)
"""
import json
import queue
import sys
import threading

import sounddevice as sd
from websockets.sync.client import connect

SERVER = "ws://127.0.0.1:18081/v1/live"
chunks = queue.Queue()


def on_audio(data, frames, time, status):
chunks.put(bytes(data)) # 16 kHz, mono, 16-bit: what the server expects


def show(ws):
for message in ws:
m = json.loads(message)
if m["type"] == "partial":
print("\r\033[K" + m["text"], end="", flush=True) # the sentence so far
elif m["type"] == "final":
print("\r\033[K" + m["display_text"], flush=True) # one line per pause
elif m["type"] == "done":
return


with connect(SERVER) as ws:
ws.send(json.dumps({"mode": "standard", "lang": "th-TH", "latency_ms": 560}))
ws.recv()
reader = threading.Thread(target=show, args=(ws,), daemon=True)
reader.start()
with sd.RawInputStream(samplerate=16000, channels=1, dtype="int16", blocksize=1600, callback=on_audio):
print("Listening. Press Ctrl+C to stop.", file=sys.stderr)
try:
while True:
try:
ws.send(chunks.get(timeout=0.5)) # a short wait, so Ctrl+C works on every system
except queue.Empty:
pass
except KeyboardInterrupt:
pass
ws.send("end")
reader.join(timeout=30)

在服务器运行时执行它,然后开始说话:

python live_mic.py

正在说的句子会即时显示,每次停顿后该句会单独成行。按 Ctrl+C 停止。

  • Mac: 首次运行时,请允许终端使用麦克风(系统设置 › 隐私与安全性 › 麦克风)。
  • Windows: 请在 Windows 本身而不是 Ubuntu 中运行此脚本,因为麦克风在 Windows 一侧。从 python.org 安装 Windows 版 Python,然后在命令提示符中运行 py -m pip install sounddevice websockets 和 py live_mic.py。Ubuntu 中的服务器可通过同一地址访问。

在我们 M3 Max 的 CPU 上,实时字幕在 560 和 320 毫秒下能轻松跟上;在 80 毫秒下,Mac 的处理速度大约与说话速度相当,连续说话时没有余量,因此 80 毫秒更适合在 GPU 上使用。可以修改脚本中的 latency_ms 试试:数值越低响应越快,越高越准确。

须知​

  • 服务器没有密码保护。 请像本指南这样只在自己的电脑上使用,或放在你自己的网关之后。
  • 输出的泰语词之间没有空格,几乎没有标点。数字通常写成阿拉伯数字,“เอ่อ”之类的犹豫声通常会被省略。
  • 这是中部泰语模型。 对伊森方言和远离说话人的麦克风准确率低得多,也尚未在电话音频上测量。
  • 人名和生僻词按发音拼写;本版本暂不支持自定义词汇。

模型卡列出了所有选项、测试结果和完整的局限。若要在不使用 Python 的 CPU 上运行,可用只需 ONNX Runtime 的 ONNX 版本。

链接​