ข้ามไปยังเนื้อหาหลัก

วิธีใช้ OpenThai 2.0 ASR Streaming บน Windows, Mac และ Linux

· อ่าน 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, Windows 10 หรือ 11 ผ่าน WSL 2 หรือ Mac ชิป Apple silicon
หน่วยประมวลผลใช้ CPU ได้ ถ้ามี GPU ของ NVIDIA บน Linux จะเร็วกว่ามาก ส่วนบน Mac โมเดลรันบน CPU
หน่วยความจำว่างราว 6 GB (เซิร์ฟเวอร์ใช้สูงสุดราว 6 GB บน Mac ของเรา)
ดาวน์โหลดโมเดล 2.6 GB และแพ็กเกจ Python ราว 1.4 GB บน Mac ของเรา บน Linux จะมากกว่านี้เพราะ PyTorch มาพร้อมไลบรารี GPU ของ NVIDIA

สิ่งที่เราทดสอบ ทุกขั้นตอนด้านล่างรันบน MacBook Pro ชิป M3 Max ด้วย CPU ทีมของเรารันเซิร์ฟเวอร์เดียวกันนี้บน Linux กับ GPU NVIDIA H100 และบน CPU ของ Linux ส่วน Windows เรายังไม่ได้ทดสอบด้วยตัวเอง

1. ติดตั้ง​

บน Ubuntu หรือ Debian ให้ติดตั้งเครื่องมือก่อน แล้วติดตั้ง uv ซึ่งใช้ติดตั้ง Python และแพ็กเกจ:

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

นี่คือชุดแพ็กเกจที่ทีมของเราใช้ ใช้ได้ทั้งเครื่องที่มีและไม่มี GPU ของ NVIDIA

สภาพแวดล้อมนี้แยกแพ็กเกจที่ติดตั้งออกจากส่วนอื่นของเครื่อง เมื่อเปิดเทอร์มินัลใหม่ทุกครั้ง ให้เข้าโฟลเดอร์ 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

ถ้าไม่มี GPU ของ NVIDIA ให้ตัด 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 และรูปแบบอื่นต้องมี ffmpeg ซึ่งติดตั้งไว้ในขั้นที่ 1

บน CPU ของ M3 Max ของเรา คลิปยาว 7.6 วินาทีใช้เวลา 2.2 วินาที และไฟล์ยาว 41 วินาทีใช้ 5.9 วินาที เร็วกว่าเวลาจริงราว 3 ถึง 7 เท่า บน NVIDIA H100 หนึ่งใบ ถอดไฟล์ได้เร็วกว่าเวลาจริงราว 257 เท่า

5. คำบรรยายสดจากไมโครโฟน​

บันทึกโค้ดนี้เป็นไฟล์ live_mic.py ในโฟลเดอร์ 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: ครั้งแรกให้อนุญาตให้ Terminal ใช้ไมโครโฟน (System Settings, Privacy & Security, Microphone)
  • Windows: ให้รันสคริปต์นี้ใน Windows โดยตรง ไม่ใช่ใน Ubuntu เพราะไมโครโฟนอยู่ฝั่ง Windows ติดตั้ง Python สำหรับ Windows จาก python.org แล้วใน Command Prompt รัน py -m pip install sounddevice websockets และ py live_mic.py เซิร์ฟเวอร์ใน Ubuntu เข้าถึงได้ที่ที่อยู่เดียวกัน

บน CPU ของ M3 Max ของเรา คำบรรยายสดตามทันได้สบายที่ 560 และ 320 มิลลิวินาที ส่วนที่ 80 มิลลิวินาที Mac ประมวลผลได้ราวเท่าความเร็วการพูดพอดี ไม่เหลือเผื่อเมื่อพูดต่อเนื่อง จึงควรใช้ 80 มิลลิวินาทีกับ GPU ลองเปลี่ยน latency_ms ในสคริปต์ได้ ค่าต่ำตอบเร็วกว่า ค่าสูงแม่นยำกว่า

ข้อควรรู้​

  • เซิร์ฟเวอร์ไม่มีรหัสผ่าน ให้ใช้บนเครื่องของคุณเองแบบในคู่มือนี้ หรือวางไว้หลังเกตเวย์ของคุณเอง
  • ผลลัพธ์ ไม่มีการเว้นวรรคระหว่างคำภาษาไทยและแทบไม่มีเครื่องหมายวรรคตอน ตัวเลขมักออกมาเป็นตัวเลขอารบิก และเสียงลังเลอย่าง เอ่อ มักถูกตัดออก
  • เป็นโมเดลภาษาไทยกลาง แม่นยำน้อยกว่ามากกับภาษาอีสานและเมื่อไมโครโฟนอยู่ไกลผู้พูด และยังไม่ได้วัดกับเสียงโทรศัพท์
  • ชื่อเฉพาะและคำที่พบน้อย จะสะกดตามเสียงที่ได้ยิน รุ่นนี้ยังไม่มีคำศัพท์กำหนดเอง

การ์ดโมเดล มีตัวเลือกทั้งหมด ผลการทดสอบ และข้อจำกัดครบทุกข้อ ถ้าต้องการรันบน CPU โดยไม่ใช้ Python มีเวอร์ชัน ONNX ที่รันด้วย ONNX Runtime อย่างเดียว

ลิงก์​