如何在 Windows、Mac 和 Linux 上运行 OpenThai 2.0 ASR Streaming
我们本周发布的 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. 安装
- Linux
- Windows
- Mac
在 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 都可以使用。
模型所用的工具包 NVIDIA NeMo 不支持直接在 Windows 上运行,因此请使用在 Windows 中运行 Ubuntu 的 WSL 2。以管理员身份打开 PowerShell 并运行:
wsl --install -d Ubuntu-24.04
按提示重启后,从开始菜单打开 Ubuntu,在其中按照本页 Linux 的步骤操作。如有 NVIDIA GPU,Windows 的常规驱动会让 Ubuntu 使用 GPU。我们尚未亲自在 Windows 上测试这些步骤。
在终端中用 Homebrew 安装 ffmpeg(用于读取 MP3 等格式),再安装用于安装 Python 和软件包的 uv:
brew install ffmpeg
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
uv pip install Cython packaging
uv pip install "nemo-toolkit[asr] @ git+https://github.com/NVIDIA-NeMo/Speech.git@cf724ac337d1ebc7d0dda1e23fb80916f52927a5"
uv pip install fastapi uvicorn python-multipart websockets huggingface_hub sounddevice
如果 Mac 提示安装命令行开发者工具(用于 git),请同意,然后重新运行该命令。
这个环境把安装的软件包与电脑的其他部分隔开。每次打开新终端时,进入 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. 启动服务器
- Linux
- Windows
- Mac
cd OpenThai2.0-ASR-Streaming/serve
CHINDA_DEVICE=cuda CHINDA_PRELOAD=1 python -m uvicorn app:app --port 18081
没有 NVIDIA GPU 时,去掉 CHINDA_DEVICE=cuda。
在 Ubuntu 中,与 Linux 相同:
cd OpenThai2.0-ASR-Streaming/serve
CHINDA_DEVICE=cuda CHINDA_PRELOAD=1 python -m uvicorn app:app --port 18081
没有 NVIDIA GPU 时,去掉 CHINDA_DEVICE=cuda。
cd OpenThai2.0-ASR-Streaming/serve
CHINDA_NUM_THREADS=1 CHINDA_PRELOAD=1 python -m uvicorn app:app --port 18081
请保留 CHINDA_NUM_THREADS=1。在我们的 M3 Max 上,单线程明显最快:一段 7.6 秒的音频,单线程用时 2.2 秒,四线程 6.4 秒,默认的每个核心一个线程则需 21 秒。
首次启动需要一到两分钟。服务器打印 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 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 版本。
链接
- 模型页面及测试结果:OpenThai 2.0 ASR Streaming
- Hugging Face 上的权重:iapp/OpenThai2.0-ASR-Streaming
- 发布文章:OpenThai 2.0 ASR Streaming
- 托管实时 API:OpenThai ASR Realtime