يعتبر Fast-Whisper بمثابة إعادة تنفيذ لنموذج Whisper الخاص بـ OpenAI باستخدام CTranslate2، وهو محرك استدلال سريع لنماذج Transformer.
يعد هذا التنفيذ أسرع بما يصل إلى 4 مرات من openai/whisper بنفس الدقة مع استخدام ذاكرة أقل. يمكن تحسين الكفاءة بشكل أكبر من خلال تكميم 8 بت على كل من وحدة المعالجة المركزية ووحدة معالجة الرسومات.
كمرجع، إليك الوقت واستخدام الذاكرة المطلوبين لنسخ 13 دقيقة من الصوت باستخدام تطبيقات مختلفة:
تطبيق | دقة | حجم الشعاع | وقت | الأعلى. ذاكرة GPU | الأعلى. ذاكرة وحدة المعالجة المركزية |
---|---|---|---|---|---|
أوبيناي/الهمس | fp16 | 5 | 4 د 30 ث | 11325 ميجابايت | 9439 ميجابايت |
أسرع الهمس | fp16 | 5 | 54 ثانية | 4755 ميجابايت | 3244 ميجابايت |
أسرع الهمس | كثافة العمليات8 | 5 | 59 ثانية | 3091 ميجابايت | 3117 ميجابايت |
تم تنفيذه باستخدام CUDA 11.7.1 على NVIDIA Tesla V100S.
تطبيق | دقة | حجم الشعاع | وقت | الأعلى. ذاكرة |
---|---|---|---|---|
أوبيناي/الهمس | fp32 | 5 | 10 د 31 ث | 3101 ميجابايت |
whisper.cpp | fp32 | 5 | 17 د 42 ث | 1581 ميجابايت |
whisper.cpp | fp16 | 5 | 12 د 39 ث | 873 ميجابايت |
أسرع الهمس | fp32 | 5 | 2 م 44 ث | 1675 ميجابايت |
أسرع الهمس | كثافة العمليات8 | 5 | 2m04s | 995 ميجابايت |
تم تنفيذه باستخدام 8 خيوط على Intel(R) Xeon(R) Gold 6226R.
تطبيق | دقة | حجم الشعاع | وقت | جيجاسبيخ WER |
---|---|---|---|---|
تقطير-الهمس/تقطير-كبير-v2 | fp16 | 4 | - | 10.36 |
أسرع-تقطير-كبير-v2 | fp16 | 5 | - | 10.28 |
Distil-whisper/distil-medium.en | fp16 | 4 | - | 11.21 |
أسرع-تقطير-medium.en | fp16 | 5 | - | 11.21 |
تم تنفيذه باستخدام CUDA 11.4 على NVIDIA 3090.
بالنسبة لـ distil-whisper/distil-large-v2
، يتم اختبار WER باستخدام نموذج التعليمات البرمجية من الرابط. للحصول على faster-distil-whisper
، يتم اختبار WER من خلال الإعداد:
from faster_whisper import WhisperModel
model_size = "distil-large-v2"
# model_size = "distil-medium.en"
# Run on GPU with FP16
model = WhisperModel ( model_size , device = "cuda" , compute_type = "float16" )
segments , info = model . transcribe ( "audio.mp3" , beam_size = 5 , language = "en" )
يتطلب تنفيذ GPU تثبيت مكتبات NVIDIA التالية:
ملاحظة : تدعم أحدث الإصدارات من ctranslate2
فقط CUDA 12 وcuDNN 9. بالنسبة إلى CUDA 11 وcuDNN 8، يتم الرجوع إلى الإصدار 3.24.0
من ctranslate2
، وبالنسبة إلى CUDA 12 وcuDNN 8، يتم الرجوع إلى الإصدار 4.4.0
من ctranslate2
، (يمكن القيام بذلك باستخدام pip install --force-reinstall ctranslate2==4.4.0
أو تحديد الإصدار في ملف requirements.txt
).
هناك طرق متعددة لتثبيت مكتبات NVIDIA المذكورة أعلاه. الطريقة الموصى بها موضحة في وثائق NVIDIA الرسمية، ولكننا نقترح أيضًا طرق تثبيت أخرى أدناه.
ملاحظة: بالنسبة لجميع هذه الطرق أدناه، ضع في اعتبارك الملاحظة أعلاه المتعلقة بإصدارات CUDA. اعتمادًا على الإعداد الخاص بك، قد تحتاج إلى تثبيت إصدارات CUDA 11 من المكتبات التي تتوافق مع مكتبات CUDA 12 المدرجة في الإرشادات أدناه.
تم تثبيت المكتبات (cuBLAS، cuDNN) في صور NVIDIA CUDA Docker الرسمية: nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04
.
pip
(Linux فقط) في Linux، يمكن تثبيت هذه المكتبات باستخدام pip
. لاحظ أنه يجب ضبط LD_LIBRARY_PATH
قبل تشغيل Python.
pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9. *
export LD_LIBRARY_PATH= ` python3 -c ' import os; import nvidia.cublas.lib; import nvidia.cudnn.lib; print(os.path.dirname(nvidia.cublas.lib.__file__) + ":" + os.path.dirname(nvidia.cudnn.lib.__file__)) ' `
يوفر برنامج Whisper-standalone-win الخاص بـ Purfview مكتبات NVIDIA المطلوبة لنظامي التشغيل Windows وLinux في أرشيف واحد. قم بفك ضغط الأرشيف ووضع المكتبات في دليل مدرج في PATH
.
يمكن تثبيت الوحدة من PyPI:
pip install faster-whisper
pip install --force-reinstall " faster-whisper @ https://github.com/SYSTRAN/faster-whisper/archive/refs/heads/master.tar.gz "
pip install --force-reinstall " faster-whisper @ https://github.com/SYSTRAN/faster-whisper/archive/a4f1cc8f11433e454c3934442b5e1a4ed5e865c3.tar.gz "
from faster_whisper import WhisperModel
model_size = "large-v3"
# Run on GPU with FP16
model = WhisperModel ( model_size , device = "cuda" , compute_type = "float16" )
# or run on GPU with INT8
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
# or run on CPU with INT8
# model = WhisperModel(model_size, device="cpu", compute_type="int8")
segments , info = model . transcribe ( "audio.mp3" , beam_size = 5 )
print ( "Detected language '%s' with probability %f" % ( info . language , info . language_probability ))
for segment in segments :
print ( "[%.2fs -> %.2fs] %s" % ( segment . start , segment . end , segment . text ))
تحذير: segments
عبارة عن مولد ، لذا لا يبدأ النسخ إلا عند تكرارها. يمكن تشغيل النسخ حتى الاكتمال عن طريق جمع المقاطع في قائمة أو for
حلقة:
segments , _ = model . transcribe ( "audio.mp3" )
segments = list ( segments ) # The transcription will actually run here.
يوضح مقتطف التعليمات البرمجية التالي كيفية تشغيل النسخ المجمع لملف صوتي كمثال. BatchedInferencePipeline.transcribe
هو بديل مباشر لـ WhisperModel.transcribe
from faster_whisper import WhisperModel , BatchedInferencePipeline
model = WhisperModel ( "turbo" , device = "cuda" , compute_type = "float16" )
batched_model = BatchedInferencePipeline ( model = model )
segments , info = batched_model . transcribe ( "audio.mp3" , batch_size = 16 )
for segment in segments :
print ( "[%.2fs -> %.2fs] %s" % ( segment . start , segment . end , segment . text ))
تتوافق نقاط التحقق Distil-Whisper مع حزمة Faster-Whisper. على وجه الخصوص، تم تصميم أحدث نقطة تفتيش distill-large-v3 بشكل جوهري للعمل مع خوارزمية النسخ Faster-Whisper. يوضح مقتطف التعليمات البرمجية التالي كيفية تشغيل الاستدلال باستخدام distil-large-v3 على ملف صوتي محدد:
from faster_whisper import WhisperModel
model_size = "distil-large-v3"
model = WhisperModel ( model_size , device = "cuda" , compute_type = "float16" )
segments , info = model . transcribe ( "audio.mp3" , beam_size = 5 , language = "en" , condition_on_previous_text = False )
for segment in segments :
print ( "[%.2fs -> %.2fs] %s" % ( segment . start , segment . end , segment . text ))
لمزيد من المعلومات حول نموذج distil-large-v3، راجع بطاقة النموذج الأصلية.
segments , _ = model . transcribe ( "audio.mp3" , word_timestamps = True )
for segment in segments :
for word in segment . words :
print ( "[%.2fs -> %.2fs] %s" % ( word . start , word . end , word . word ))
تدمج المكتبة نموذج Silero VAD لتصفية أجزاء من الصوت بدون كلام:
segments , _ = model . transcribe ( "audio.mp3" , vad_filter = True )
السلوك الافتراضي متحفظ ويزيل الصمت لمدة تزيد عن ثانيتين فقط. راجع معلمات VAD المتوفرة والقيم الافتراضية في كود المصدر. يمكن تخصيصها باستخدام وسيطة القاموس vad_parameters
:
segments , _ = model . transcribe (
"audio.mp3" ,
vad_filter = True ,
vad_parameters = dict ( min_silence_duration_ms = 500 ),
)
يتم تمكين مرشح Vad افتراضيًا للنسخ المجمع.
يمكن تكوين مستوى تسجيل المكتبة على النحو التالي:
import logging
logging . basicConfig ()
logging . getLogger ( "faster_whisper" ). setLevel ( logging . DEBUG )
شاهد المزيد من خيارات النموذج والنسخ في تطبيق فئة WhisperModel
.
فيما يلي قائمة غير شاملة للمشاريع مفتوحة المصدر التي تستخدم برنامج Fast-Whisper. لا تتردد في إضافة مشروعك إلى القائمة!
faster-whisper
. يمكن نشره بسهولة مع Docker، ويعمل مع OpenAI SDKs/CLI، ويدعم البث والنسخ المباشر..lrc
باللغة المطلوبة باستخدام OpenAI-GPT. عند تحميل نموذج من حجمه مثل WhisperModel("large-v3")
، يتم تنزيل نموذج CTranslate2 المقابل تلقائيًا من Hugging Face Hub.
نوفر أيضًا برنامجًا نصيًا لتحويل أي نماذج Whisper متوافقة مع مكتبة Transformers. يمكن أن تكون نماذج OpenAI الأصلية أو نماذج تم ضبطها بدقة بواسطة المستخدم.
على سبيل المثال، يقوم الأمر أدناه بتحويل نموذج Whisper الأصلي "large-v3" وحفظ الأوزان في FP16:
pip install transformers[torch] > =4.23
ct2-transformers-converter --model openai/whisper-large-v3 --output_dir whisper-large-v3-ct2
--copy_files tokenizer.json preprocessor_config.json --quantization float16
--model
اسم النموذج على Hub أو المسار إلى دليل النموذج.--copy_files tokenizer.json
، فسيتم تنزيل تكوين الرمز المميز تلقائيًا عند تحميل النموذج لاحقًا.يمكن أيضًا تحويل النماذج من الكود. راجع واجهة برمجة تطبيقات التحويل.
model = faster_whisper . WhisperModel ( "whisper-large-v3-ct2" )
model = faster_whisper . WhisperModel ( "username/whisper-large-v3-ct2" )
إذا كنت تقارن الأداء بتطبيقات Whisper الأخرى، فيجب عليك التأكد من إجراء المقارنة بإعدادات مماثلة. بخاصة:
model.transcribe
حجم شعاع افتراضي قدره 1 ولكننا هنا نستخدم حجم شعاع افتراضي قدره 5.OMP_NUM_THREADS
، والذي يمكن ضبطه عند تشغيل البرنامج النصي الخاص بك: OMP_NUM_THREADS=4 python3 my_script.py