VoxCPM2
VoxCPM2 نموذج تركيب كلام انتشاري-انحداري دون مُرمِّز، بـ 2 مليار معامل، أصدرته OpenBMB. يُركِّب صوتًا بجودة استوديو عند 48 kHz في 30 لغة، ويُتيح ثلاثة أوضاع إنتاجية: zero-shot، واستنساخ صوت بمرجع واحد، وتصميم صوت بلغة طبيعية ("صوت أنثوي شابّ، دافئ ولطيف"). على Apple Silicon يعمل أصليًّا عبر MLX بصيغ bf16 وint8 وint4 — وعلى مجموعة الاختبار المؤلَّفة من 8 جُمل، تحقّق حزمة int8 نسبة WER صفر بالمئة في رحلة العودة عبر Qwen3-ASR وRTF ≈ 1.0.
ما هو
- إخراج بـ 48 kHz — المحرّك الوحيد على الجهاز ضمن هذه الحزمة بمعدّل عيّنات استوديو. بقية وحدات تركيب الكلام تبلغ 24 kHz كحدّ أقصى.
- تصميم الصوت — تحكّم في الأسلوب بلغة طبيعية:
--voxcpm2-instruct "young female voice, warm and gentle". لا يُتيح هذا أيُّ محرّك آخر. - استنساخ الصوت — استنساخ بمرجع واحد من مقطع 16 kHz؛ و"الاستنساخ النهائي" (صوت مرجعي + نصّ تفريغه) للحفاظ على البروزودي بأمانة أكبر.
- 30 لغة — الإنجليزية والصينية والإندونيسية واليابانية والكورية وغيرها. الكشف تلقائي من النصّ.
- Apache 2.0 — تَرِث أوزان النموذج رخصة openbmb من المصدر؛ ومنفذنا بلغة Swift يلتزم بالشيء نفسه.
البنية
خمسة مكوّنات متعاونة لإنتاج موجة الكلام بـ 48 kHz:
| المكوِّن | الوصف |
|---|---|
| MiniCPM-4 base LM | MiniCPM-4 من 28 طبقة مع LongRoPE وGQA (16 رأس Q / 2 KV، بُعد رأس 128) وMLP من نوع SwiGLU. يُشترَط على رموز النصّ + كُمونات الصوت. |
| Residual LM | متغيّر MiniCPM-4 من 8 طبقات بدون تضمينات دورانية. يُحسِّن الحالة المخفيّة لـ LM الأساس لكلّ patch صوتيّ مُولَّد. |
| FSQ + Local DiT estimator | حالات مخفيّة مُكمَّمة سُلَّميًّا تُغذّي Diffusion Transformer (V2) من 12 طبقة يعمل على كُمونات صوت بـ 64 بُعدًا في patches من 4. حالّ Euler بنوع CFG-zero-star، 10 خطوات افتراضيًّا. |
| AudioVAE V2 | مفكِّك تلافيفيّ سببيّ. يقرأ صوتًا مرجعيًّا بـ 16 kHz ويُصدر الموجة بـ 48 kHz (مع رفع عيّنات 3× مدمج). |
| Stop head | مُصنِّف ثنائيّ لكلّ خطوة على الحالة المخفيّة لـ LM. عند argmax = 1 ينتهي التوليد بعد minTokens من الـ patches. |
الحزم
ثلاث صيغ مُكمَّمة، جميعها مُحوَّلة من نقاط مرجع PyTorch من openbmb/VoxCPM2. تطال الكَمَّنة طبقات Linear داخل LM واللمن المتبقّي ومُقدِّر DiT ورؤوس الإسقاط؛ بينما يبقى مُرمِّز AudioVAE الصوتيّ بـ fp16/bf16 لأن كَمَّنته تُضرّ بجودة الصوت.
| الحزمة | الكَمَّنة | الحجم | HuggingFace |
|---|---|---|---|
| bf16 | لا شيء (مرجعيّ) | ~5.0 GB | aufklarer/VoxCPM2-MLX-bf16 |
| int8 | MLX QuantizedLinear، حجم المجموعة 64 | ~3.0 GB | aufklarer/VoxCPM2-MLX-int8 |
| int4 | MLX QuantizedLinear، حجم المجموعة 64 | ~1.9 GB | aufklarer/VoxCPM2-MLX-int4 |
رحلة الذهاب والإياب عبر 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 هو الافتراضي المُوصى به — يُطابق مسار LM في خطّ Python الأصليّ بِتًّا بِتٍّ، وهو أسرع وأصغر بنسبة 40 % من bf16. أمّا 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."
)
استنساخ الصوت
استنساخ بمرجع واحد من مقطع أحاديّ بـ 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
)
الاستنساخ النهائيّ — مرِّر الصوت المرجعيّ ونصّ تفريغه معًا كي يُشترَط 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
الرايات: --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 لتركيب قابل للتكرار.
كيف تختار بين وحدات تركيب الكلام في 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 |
| الواجهة الخلفية | CoreML (ANE) | MLX، CoreML | MLX | MLX | MLX |
| اللغات | 10 | 10 | 9 | 30 | EN + ZH |
| تصميم الصوت | إعدادات مسبقة ثابتة | — | — | موجَّه بالتعليمة | — |
| استنساخ الصوت | — | مرجع ICL | مرجع zero-shot | مرجع + نهائيّ | صوت خامّ + تفريغ |
| طويل المدى | قصير / متوسّط | بثّ | بثّ | بثّ على هيئة patches | حتى 90 دقيقة |
…تحتاج إلى إخراج بـ 48 kHz (تطبيقات الموسيقى / البثّ الإذاعيّ) أو إلى تصميم صوت بلغة طبيعية دون مقطع مرجعيّ. للحصول على تركيب كلام إنجليزيّ قصير بأعلى جودة وبحجم تنزيل أصغر، فإنّ CosyVoice3 أو Qwen3-TTS أخفّ. أمّا للبودكاست والكتب الصوتية الطويلة المدى بالإنجليزية/الصينية، فإنّ VibeVoice 1.5B مصمَّم لذلك خصيصًا.
الاستخدام المسؤول
استنساخ الصوت مُتاح. احصل على إذن لأيّ صوت تستنسخه، ولا تستخدم النموذج لانتحال شخصيّات أو لتوليد معلومات مضلِّلة أو ارتكاب احتيال. تنطبق الإرشادات الأمنية الكاملة من openbmb/VoxCPM2.