การกระซิบที่เร็วขึ้น คือการปรับใช้โมเดล Whisper ของ OpenAI อีกครั้งโดยใช้ CTranslate2 ซึ่งเป็นกลไกการอนุมานที่รวดเร็วสำหรับโมเดล Transformer
การใช้งานนี้เร็วกว่า openai/whisper ถึง 4 เท่าเพื่อความแม่นยำเท่ากันแต่ใช้หน่วยความจำน้อยกว่า สามารถปรับปรุงประสิทธิภาพเพิ่มเติมได้ด้วยการหาปริมาณ 8 บิตบนทั้ง CPU และ GPU
เพื่อเป็นข้อมูลอ้างอิง นี่คือเวลาและการใช้หน่วยความจำที่จำเป็นในการถอดเสียง 13 นาที โดยใช้การใช้งานที่แตกต่างกัน:
การนำไปปฏิบัติ | ความแม่นยำ | ขนาดลำแสง | เวลา | สูงสุด หน่วยความจำจีพียู | สูงสุด หน่วยความจำซีพียู |
---|---|---|---|---|---|
เปิดใจ/กระซิบ | fp16 | 5 | 4นาที30วินาที | 11325MB | 9439MB |
เร็วขึ้นกระซิบ | fp16 | 5 | 54ส | 4755MB | 3244MB |
เร็วขึ้นกระซิบ | int8 | 5 | 59ส | 3091MB | 3117MB |
ดำเนินการด้วย CUDA 11.7.1 บน NVIDIA Tesla V100S
การนำไปปฏิบัติ | ความแม่นยำ | ขนาดลำแสง | เวลา | สูงสุด หน่วยความจำ |
---|---|---|---|---|
เปิดใจ/กระซิบ | fp32 | 5 | 10นาที31วินาที | 3101MB |
กระซิบ.cpp | fp32 | 5 | 17นาที42วินาที | 1581MB |
กระซิบ.cpp | fp16 | 5 | 12 นาที 39 วินาที | 873MB |
เร็วขึ้นกระซิบ | fp32 | 5 | 2 นาที 44 วินาที | 1675MB |
เร็วขึ้นกระซิบ | int8 | 5 | 2 นาที 04 วินาที | 995MB |
ดำเนินการด้วย 8 เธรดบน Intel(R) Xeon(R) Gold 6226R
การนำไปปฏิบัติ | ความแม่นยำ | ขนาดลำแสง | เวลา | กิกาสพีช WER |
---|---|---|---|---|
กลั่นกระซิบ/กลั่นขนาดใหญ่-v2 | fp16 | 4 | - | 10.36 |
เร็วกว่า-กลั่น-ขนาดใหญ่-v2 | fp16 | 5 | - | 10.28 |
ditil-กระซิบ/ditil-medium.en | fp16 | 4 | - | 11.21 |
เร็วกว่า-กลั่น-ปานกลาง.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__)) ' `
ระบบกระซิบแบบสแตนด์อโลนของ 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
loop:
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 โดยเฉพาะอย่างยิ่ง จุดตรวจสอบ distil-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 )
การทำงานเริ่มต้นเป็นแบบอนุรักษ์นิยมและจะลบความเงียบที่นานกว่า 2 วินาทีเท่านั้น ดูพารามิเตอร์ 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
ต่อไปนี้เป็นรายการโครงการโอเพ่นซอร์สบางส่วนที่ใช้การกระซิบที่เร็วกว่า อย่าลังเลที่จะเพิ่มโครงการของคุณลงในรายการ!
faster-whisper
ปรับใช้ได้อย่างง่ายดายด้วย Docker ทำงานร่วมกับ OpenAI SDK/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
ยอมรับชื่อโมเดลบนฮับหรือเส้นทางไปยังไดเร็กทอรีโมเดล--copy_files tokenizer.json
การกำหนดค่าโทเค็นจะถูกดาวน์โหลดโดยอัตโนมัติเมื่อมีการโหลดโมเดลในภายหลังโมเดลสามารถแปลงได้จากโค้ด ดู API การแปลง
model = faster_whisper . WhisperModel ( "whisper-large-v3-ct2" )
model = faster_whisper . WhisperModel ( "username/whisper-large-v3-ct2" )
หากคุณกำลังเปรียบเทียบประสิทธิภาพกับการใช้งาน Whisper อื่นๆ คุณควรตรวจสอบให้แน่ใจว่าได้ดำเนินการเปรียบเทียบกับการตั้งค่าที่คล้ายกัน โดยเฉพาะ:
model.transcribe
ใช้ขนาดลำแสงเริ่มต้นที่ 1 แต่ที่นี่เราใช้ขนาดลำแสงเริ่มต้นที่ 5OMP_NUM_THREADS
ซึ่งสามารถตั้งค่าได้เมื่อเรียกใช้สคริปต์ของคุณ: OMP_NUM_THREADS=4 python3 my_script.py