استنساخ الصوت باستخدام VoxCPM2 على Mac

شغّل VoxCPM2 محليًا على Apple Silicon مع MLX لاستنساخ صوت أو تصميمه بوصف نصي. ينتج نموذج OpenBMB كلامًا بتردد 48 kHz في 30 لغة. استمع إلى الأمثلة، ثم جرّب CLI مع التسجيل المرجعي ونصه الدقيق.

عينات صوتية · استنسخ صوتًا باستخدام CLI · مقارنة VoxCPM2 وQwen3-TTS

عينات استنساخ الصوت

هذه المقاطع الإنجليزية مأخوذة من مقارنة FLEURS المنشورة. يستخدم التسجيل المرجعي والكلام الناتج جملًا مختلفة. كل مخرج عينة تمثيلية واحدة، بينما تلخّص مقاييس المقارنة عدة مقاطع.

التسجيل المرجعيالإنجليزية · 16 kHz

النص الدقيق للتسجيل المرجعي: One can only wonder what the keyboard will become when something newer comes along.

VoxCPM2 bf16الإنجليزية · 48 kHz

النص المُولّد: While he was working at the hospital Liggins began to investigate premature labor during his spare time.

Qwen3-TTS Base 1.7B bf16 ICLالإنجليزية · 24 kHz

النص المُولّد: 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:

المكوِّنالوصف
MiniCPM-4 base LMMiniCPM-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.

الحزم

يدعم CLI الحالي حزمتَي bf16 وint8 المحوّلتين من نقطة التحقق الأصلية openbmb/VoxCPM2. تُكمّم إسقاطات نموذج اللغة والانتشار، بينما يحتفظ مفكّك الصوت بالدقة الكاملة.

الحزمةالكَمَّنةالحجمHuggingFace
bf16لا شيء (مرجعيّ)~5.0 GBaufklarer/VoxCPM2-MLX-bf16
int8MLX QuantizedLinear، حجم المجموعة 64~3.0 GBaufklarer/VoxCPM2-MLX-int8

رحلة الذهاب والإياب عبر ASR (Qwen3-ASR 0.6B، مجموعة 8 جُمل، Apple Silicon من السلسلة M):

الصيغةWERRTF
bf162.04 %1.38
int80.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."
)

استنساخ الصوت

استنساخ بمرجع واحد من مقطع أحاديّ بـ 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}، --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 bf161.8%1.112.97
Qwen3-TTS Base 1.7B bf16 ICL2.4%1.703.50

مقارنة استنساخ الصوت بخمس لغات ومنهجية القياس.

كيف تختار بين وحدات تركيب الكلام في speech-swift

Kokoro-82MQwen3-TTSCosyVoice3VoxCPM2VibeVoice 1.5B
المعاملات82M0.6 / 1.7 B0.5B2B1.5B
معدّل العيّنات24 kHz24 kHz24 kHz48 kHz24 kHz
الواجهة الخلفيةCoreML (ANE)MLX، CoreMLMLXMLXMLX
اللغات1010930EN + ZH
تصميم الصوتإعدادات مسبقة ثابتة——موجَّه بالتعليمة—
استنساخ الصوت—مرجع ICLمرجع zero-shotمرجع + نهائيّصوت خامّ + تفريغ
طويل المدىقصير / متوسّطبثّبثّبثّ على هيئة patchesحتى 90 دقيقة
اختر VoxCPM2 حين…

…تحتاج إلى إخراج بـ 48 kHz (تطبيقات الموسيقى / البثّ الإذاعيّ) أو إلى تصميم صوت بلغة طبيعية دون مقطع مرجعيّ. للحصول على تركيب كلام إنجليزيّ قصير بأعلى جودة وبحجم تنزيل أصغر، فإنّ CosyVoice3 أو Qwen3-TTS أخفّ. أمّا للبودكاست والكتب الصوتية الطويلة المدى بالإنجليزية/الصينية، فإنّ VibeVoice 1.5B مصمَّم لذلك خصيصًا.

الاستخدام المسؤول

استنساخ الصوت مُتاح. احصل على إذن لأيّ صوت تستنسخه، ولا تستخدم النموذج لانتحال شخصيّات أو لتوليد معلومات مضلِّلة أو ارتكاب احتيال. تنطبق الإرشادات الأمنية الكاملة من openbmb/VoxCPM2.