โคลนเสียงด้วย VoxCPM2 บน Mac
รัน VoxCPM2 ในเครื่อง Apple Silicon ด้วย MLX เพื่อโคลนเสียงหรือออกแบบเสียงจากคำอธิบาย โมเดล OpenBMB นี้สร้างเสียง 48 kHz ได้ 30 ภาษา ฟังตัวอย่างแล้วลอง CLI ด้วยไฟล์เสียงอ้างอิงและข้อความถอดเสียงที่ตรงกัน
ตัวอย่างเสียง · โคลนเสียงด้วย CLI · เปรียบเทียบ VoxCPM2 กับ Qwen3-TTS
ตัวอย่างการโคลนเสียง
คลิปภาษาอังกฤษเหล่านี้มาจากการเปรียบเทียบ FLEURS ที่เผยแพร่แล้ว เสียงอ้างอิงและเสียงที่สร้างใช้คนละประโยค แต่ละเอาต์พุตเป็นตัวอย่างหนึ่งคลิป ส่วนค่าการเปรียบเทียบสรุปจากหลายคลิป
ข้อความถอดเสียงอ้างอิง: One can only wonder what the keyboard will become when something newer comes along.
ข้อความที่สร้าง: While he was working at the hospital Liggins began to investigate premature labor during his spare time.
ข้อความที่สร้าง: While he was working at the hospital Liggins began to investigate premature labor during his spare time.
โคลนเสียงด้วย CLI
ดาวน์โหลดเสียงอ้างอิงเป็น reference.wav คำสั่งใช้ข้อความถอดเสียงที่ตรงกับไฟล์นี้ หากใช้ตัวอย่างของคุณเอง ให้เปลี่ยนทั้งไฟล์เสียงและข้อความถอดเสียง
speech speak "Hello from the cloned voice." \
--engine voxcpm2 \
--voxcpm2-variant bf16 \
--voice-sample reference.wav \
--voxcpm2-prompt-audio reference.wav \
--voxcpm2-prompt-text "One can only wonder what the keyboard will become when something newer comes along." \
--seed 42 \
--output clone.wav
โมเดลนี้คืออะไร
- เอาต์พุต 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 |
ชุดต่างๆ
CLI ปัจจุบันรองรับชุด bf16 และ int8 ที่แปลงจากเช็กพอยต์ต้นฉบับ openbmb/VoxCPM2 โดยควอนไทซ์ส่วนฉายภาพของโมเดลภาษาและดิฟฟิวชัน ส่วนตัวถอดรหัสเสียงคงความแม่นยำเต็มรูปแบบ
| ชุด | การ quantize | ขนาด | HuggingFace |
|---|---|---|---|
| bf16 | ไม่มี (อ้างอิง) | ~5.0 GB | aufklarer/VoxCPM2-MLX-bf16 |
| int8 | MLX QuantizedLinear, group size 64 | ~3.0 GB | aufklarer/VoxCPM2-MLX-int8 |
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 |
CLI ใช้ bf16 เป็นค่าเริ่มต้น เลือก int8 หากต้องการดาวน์โหลดขนาดเล็กลง int4 เลิกรองรับแล้ว และแสดงในตารางเป็นผลวัดในอดีตเท่านั้น
เริ่มต้นอย่างรวดเร็ว
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
เลือกชุด int8 โดยระบุให้ชัดเจน:
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}, --voxcpm2-instruct, --voxcpm2-ref-audio, --voxcpm2-prompt-audio + --voxcpm2-prompt-text, --voxcpm2-cfg-value, --voxcpm2-timesteps, --voxcpm2-max-tokens, --voxcpm2-min-tokens, --seed สำหรับการสังเคราะห์ที่ทำซ้ำได้
เปรียบเทียบ VoxCPM2 กับ Qwen3-TTS
ผลภาษาอังกฤษที่เผยแพร่แล้วใช้คู่เสียงอ้างอิงและเป้าหมาย FLEURS สิบคู่ต่อโมเดล แสดงค่าเฉลี่ย WER และ UTMOS กับค่ามัธยฐาน RTF ค่า WER และ RTF ยิ่งต่ำยิ่งดี UTMOS เป็นการทำนายความเป็นธรรมชาติ ไม่ใช่คะแนนจากมนุษย์ ผลเหล่านี้ไม่ใช่อันดับที่ใช้ได้กับทุกกรณี
| โมเดล | WER ↓ | RTF ↓ | UTMOS ↑ |
|---|---|---|---|
| VoxCPM2 bf16 | 1.8% | 1.11 | 2.97 |
| Qwen3-TTS Base 1.7B bf16 ICL | 2.4% | 1.70 | 3.50 |
การเปรียบเทียบโคลนเสียงห้าภาษาและวิธีวัด.
เลือกโมดูล 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