VoxCPM2
VoxCPM2 เป็นโมเดล TTS แบบ diffusion-autoregressive ไม่ใช้ tokenizer ขนาด 2B พารามิเตอร์จาก OpenBMB สังเคราะห์ เสียง 48 kHz คุณภาพสตูดิโอ ใน 30 ภาษาด้วยโหมดการใช้งานสามแบบ: zero-shot, การโคลนเสียงจากคลิปอ้างอิงเดียว และการออกแบบเสียงด้วยภาษาธรรมชาติ ("a young female voice, warm and gentle") บน Apple Silicon มันรันแบบเนทีฟผ่าน MLX ใน bf16, int8 หรือ int4 — ชุด int8 round-trip ผ่าน Qwen3-ASR ได้ 0% WER บนชุดทดสอบ 8 ประโยคและ RTF ประมาณ 1.0
โมเดลนี้คืออะไร
- เอาต์พุต 48 kHz — engine on-device เพียงตัวเดียวในสแต็กนี้ที่มีอัตราการสุ่มระดับสตูดิโอ โมดูล TTS อื่นๆ ทั้งหมดสูงสุดที่ 24 kHz
- การออกแบบเสียง — ควบคุมสไตล์ด้วยภาษาธรรมชาติ:
--voxcpm2-instruct "young female voice, warm and gentle"ไม่มี engine ตัวอื่นที่เปิดให้ใช้ฟีเจอร์นี้ - การโคลนเสียง — การโคลนจากคลิปอ้างอิงเดียวที่ 16 kHz; "ultimate cloning" (เสียงอ้างอิง + ทรานสคริปต์) เพื่อรักษาน้ำเสียง
- 30 ภาษา — อังกฤษ, จีน, อินโดนีเซีย, ญี่ปุ่น, เกาหลี และอื่นๆ ตรวจจับอัตโนมัติจากข้อความ
- Apache 2.0 — น้ำหนักโมเดลสืบทอดสัญญาอนุญาต upstream ของ openbmb; การ port ไปยัง Swift ของเราก็ใช้สัญญาอนุญาตเดียวกัน
สถาปัตยกรรม
ห้าองค์ประกอบที่ทำงานร่วมกันผลิตรูปคลื่น 48 kHz:
| องค์ประกอบ | คำอธิบาย |
|---|---|
| MiniCPM-4 base LM | MiniCPM-4 28 ชั้นพร้อม LongRoPE, GQA (16 หัว Q / 2 หัว KV, head dim 128) และ MLP SwiGLU กำหนดเงื่อนไขด้วยโทเค็นข้อความ + latent เสียง |
| Residual LM | รุ่นย่อย MiniCPM-4 8 ชั้นโดยไม่มี rotary embedding ปรับ hidden state ของ base LM ต่อแต่ละ patch เสียงที่สร้าง |
| FSQ + Local DiT estimator | Hidden state ที่ quantize แบบ scalar ขับเคลื่อน Diffusion Transformer (V2) 12 ชั้นที่ทำงานบน latent เสียง 64 มิติเป็น patch ละ 4 Solver Euler CFG-zero-star ค่าเริ่มต้น 10 timestep |
| AudioVAE V2 | ตัวถอดรหัส convolutional แบบ causal อ่านเสียงอ้างอิง 16 kHz และส่งรูปคลื่น 48 kHz ออกมา (upsample 3× ฝังในตัว) |
| Stop head | ตัวจำแนกแบบ binary ต่อขั้นตอนบน hidden state ของ LM Argmax = 1 จะจบการสร้างหลังจาก minTokens patch |
ชุดต่างๆ
สามรุ่นการ quantize ทุกตัวแปลงมาจาก checkpoint PyTorch upstream ผ่าน openbmb/VoxCPM2 การ quantize ใช้กับ Linear projection ภายใน LM / residual LM / DiT estimator / projection head; vocoder AudioVAE คงไว้ที่ fp16/bf16 เพราะการ quantize ทำให้คุณภาพเสียงลดลง
| ชุด | การ quantize | ขนาด | HuggingFace |
|---|---|---|---|
| bf16 | ไม่มี (อ้างอิง) | ~5.0 GB | aufklarer/VoxCPM2-MLX-bf16 |
| int8 | MLX QuantizedLinear, group size 64 | ~3.0 GB | aufklarer/VoxCPM2-MLX-int8 |
| int4 | MLX QuantizedLinear, group size 64 | ~1.9 GB | aufklarer/VoxCPM2-MLX-int4 |
Round-trip ASR (Qwen3-ASR 0.6B, ชุดทดสอบ 8 ประโยค, Apple Silicon รุ่น M):
| รุ่น | WER | RTF |
|---|---|---|
| bf16 | 2.04 % | 1.38 |
| int8 | 0.00 % | 1.02 |
| int4 | 4.08 % | 0.83 |
int8 เป็นค่าเริ่มต้นที่แนะนำ — มันตรงกับ pipeline Python upstream ทุกบิตบนเส้นทาง LM ในขณะที่เร็วกว่าและเล็กกว่า bf16 40 % int4 เป็นชุดที่เล็กที่สุดที่มี WER ยอมรับได้สำหรับการใช้งานทั่วไป
เริ่มต้นอย่างรวดเร็ว
import VoxCPM2TTS
let tts = try await VoxCPM2TTSModel.fromPretrained() // defaults to bf16
let audio = try await tts.generate(text: "Hello from VoxCPM2.", language: "english")
// audio: [Float] at 48 kHz mono
ส่ง model ID ที่ระบุชัดเจนเพื่อเลือกชุด int8 / int4:
let tts = try await VoxCPM2TTSModel.fromPretrained(
modelId: "aufklarer/VoxCPM2-MLX-int8"
)
การออกแบบเสียง (ตามคำสั่ง)
ส่งคำอธิบายสไตล์เป็นภาษาธรรมชาติ; โมเดลจะกำหนดเงื่อนไขการสังเคราะห์โดยใช้คำอธิบายนั้นโดยไม่ต้องใช้คลิปเสียงอ้างอิง:
let audio = try await tts.generateVoxCPM2(
text: "Welcome to the show.",
instruct: "A young woman, gentle and warm voice."
)
การโคลนเสียง
การโคลนจากคลิปอ้างอิง mono ที่ 16 kHz:
let ref = try AudioFileLoader.load(url: URL(fileURLWithPath: "speaker.wav"),
targetSampleRate: 16000)
let audio = try await tts.generateVoxCPM2(
text: "This is a cloned voice.",
refAudio: ref
)
Ultimate cloning — ส่งทั้งเสียงอ้างอิงและทรานสคริปต์ที่ตรงกัน เพื่อให้ LM สามารถกำหนดเงื่อนไขบนบริบทคำศัพท์ได้ด้วย รักษาน้ำเสียงและสำเนียงได้ใกล้เคียงต้นฉบับมากขึ้น:
let audio = try await tts.generateVoxCPM2(
text: "Hello from the cloned voice.",
refAudio: ref,
promptText: "this is what the reference clip actually said",
promptAudio: ref
)
CLI
speech speak "Hello there." \
--engine voxcpm2 \
--voxcpm2-variant int8 \
--output hello.wav
# Voice design
speech speak "Welcome to the show." \
--engine voxcpm2 \
--voxcpm2-instruct "A young woman, gentle and warm voice." \
--output design.wav
# Voice cloning
speech speak "This is a cloned voice." \
--engine voxcpm2 \
--voice-sample speaker.wav \
--output clone.wav
Flag: --voxcpm2-variant {bf16,int8,int4}, --voxcpm2-instruct, --voxcpm2-ref-audio, --voxcpm2-prompt-audio + --voxcpm2-prompt-text, --voxcpm2-cfg-value, --voxcpm2-timesteps, --voxcpm2-max-tokens, --voxcpm2-min-tokens, --seed สำหรับการสังเคราะห์ที่ทำซ้ำได้
เลือกโมดูล TTS ใดใน speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VoxCPM2 | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| พารามิเตอร์ | 82M | 0.6 / 1.7 B | 0.5B | 2B | 1.5B |
| อัตราการสุ่ม | 24 kHz | 24 kHz | 24 kHz | 48 kHz | 24 kHz |
| Backend | CoreML (ANE) | MLX, CoreML | MLX | MLX | MLX |
| ภาษา | 10 | 10 | 9 | 30 | EN + ZH |
| การออกแบบเสียง | Preset คงที่ | — | — | ตามคำสั่ง | — |
| การโคลนเสียง | — | ICL reference | Zero-shot reference | Reference + ultimate | เสียงดิบ + ทรานสคริปต์ |
| รูปแบบยาว | สั้น / ปานกลาง | Streaming | Streaming | Streaming ตาม patch | ยาวถึง 90 นาที |
…คุณต้องการเอาต์พุต 48 kHz (แอปพลิเคชันดนตรี / การกระจายเสียง) หรือการออกแบบเสียงด้วยภาษาธรรมชาติโดยไม่มีคลิปอ้างอิง สำหรับ TTS รูปแบบสั้นคุณภาพสูงสุดสำหรับภาษาอังกฤษพร้อมการดาวน์โหลดที่เล็กกว่า CosyVoice3 หรือ Qwen3-TTS มีน้ำหนักเบากว่า สำหรับ podcast / หนังสือเสียงรูปแบบยาวใน EN/ZH VibeVoice 1.5B ถูกสร้างเฉพาะเพื่อการนี้
การใช้งานอย่างมีความรับผิดชอบ
มีการรองรับการโคลนเสียง ขอความยินยอมสำหรับเสียงใดๆ ที่คุณโคลน และอย่าใช้โมเดลเพื่อปลอมตัวบุคคล สร้างข้อมูลที่บิดเบือน หรือก่อการฉ้อโกง ใช้คำแนะนำด้านความปลอดภัยฉบับเต็มจาก openbmb/VoxCPM2