寫與識(shí)別)
faster-whisper4 倍速的語音轉(zhuǎn)寫與識(shí)別【免費(fèi)下載鏈接】faster-whisperFaster Whisper transcription with CTranslate2項(xiàng)目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper一條 13 分鐘的音頻用官方 Whisper 在 CPU 上要跑 6 分 58 秒換成 faster-whisper基于 CTranslate2 引擎的語音轉(zhuǎn)寫重實(shí)現(xiàn)開 int8 量化只要 1 分 42 秒內(nèi)存占用還從 2.3GB 降到 1.5GB。這篇文章在 Linux NVIDIA GPU 的機(jī)器上實(shí)測它從 CUDA 12 依賴安裝、批量轉(zhuǎn)寫部署到量化調(diào)優(yōu)全部給你可復(fù)現(xiàn)的命令和參數(shù)讀完能獨(dú)立跑起生產(chǎn)級(jí)的轉(zhuǎn)寫服務(wù)??焖偕鲜? 步跑通第一條轉(zhuǎn)寫結(jié)果趕時(shí)間的話照這 5 步敲先別管為什么快。第 1 步裝依賴。一條命令搞定它會(huì)把 ctranslate24.x、avPyAV、onnxruntime 一起拉進(jìn)來pip install faster-whisper注意Python 版本要求 3.9 及以上倉庫 setup.py 里寫死了python_requires3.93.8 的環(huán)境會(huì)直接報(bào)錯(cuò)。第 2 步裝 GPU 依賴純 CPU 可跳過。最新 ctranslate2 只認(rèn) CUDA 12 cuDNN 9pip install nvidia-cublas-cu12 nvidia-cudnn-cu129.*第 3 步準(zhǔn)備一段音頻。mp3、m4a、wav、flac 都行——它不需要你系統(tǒng)里裝 FFmpeg音頻解碼由 PyAV 內(nèi)置的 FFmpeg 庫完成。倉庫測試目錄里就有現(xiàn)成的 tests/data/jfk.flac 可以拿來試。第 4 步跑最小腳本from faster_whisper import WhisperModel # device 可以是 cuda / cpu / auto model WhisperModel(base, devicecuda, compute_typefloat16) segments, info model.transcribe(audio.mp3, beam_size5) print(語言: %s (%.2f) % (info.language, info.language_probability)) for seg in segments: # 注意迭代到這里才開始真正轉(zhuǎn)寫 print([%.2fs - %.2fs] %s % (seg.start, seg.end, seg.text))第 5 步驗(yàn)證。終端先打印語言: en (0.99)之類的檢測行然后逐段輸出帶時(shí)間戳的文字。模型默認(rèn) base會(huì)在首次運(yùn)行時(shí)自動(dòng)從 Hugging Face Hub 下載之后走緩存。看到逐段時(shí)間戳刷出來說明鏈路通了。跑通之后你多半會(huì)想知道它憑什么比原版快這么多原理拆解快的錢花在哪了加速鏈路CTranslate2 接住了 Whisper 的解碼器Whisper 是一個(gè) encoder-decoder Transformer原版實(shí)現(xiàn)用 PyTorch 跑 decoder每一步自回歸生成都走一遍完整前向CPU 上特別虧。faster-whisper 的 轉(zhuǎn)寫主邏輯 把整個(gè)模型轉(zhuǎn)成 CTranslate2 的私有格式后推理全部交給 CTranslate2 的 C 引擎KV 緩存、算子融合、batched 解碼都在這層完成Python 側(cè)只負(fù)責(zé)切音頻、喂 mel 特征、處理時(shí)間戳 token。再往上疊兩把刀第一把是量化。compute_typeint8把權(quán)重量化到 8 位實(shí)測 same-precision 下推理時(shí)間幾乎不變但內(nèi)存減半large-v2 顯存從 4.5GB 降到 2.9GB。第二把是批處理解碼把多個(gè) 30 秒片段塞進(jìn)同一個(gè) batch 讓 GPU 一次算完13 分鐘音頻從 63 秒壓到 17 秒代價(jià)是顯存漲到 6GB。兩條容易忽略的依賴鏈音頻側(cè)看 audio.pyPyAV 打開容器 → 解碼 audio stream → 重采樣成 16kHz 單聲道 s16 → 轉(zhuǎn) float32 交給 feature_extractor.py 用純 numpy 算 80 維 log-Mel30 秒一塊pad 到 3000 幀。整條鏈路沒有任何系統(tǒng)級(jí) FFmpeg 調(diào)用這就是免 FFmpeg的來源也意味著你機(jī)器上有沒有 ffmpeg 完全不影響運(yùn)行。靜音側(cè)看 vad.py內(nèi)置 Silero VAD 的 ONNX 模型assets 目錄 里那個(gè) onnx 文件按 512 樣本一窗掃全音頻把超過 2 秒的靜音段整塊剔除再送進(jìn)模型——長音頻里大量 BGM、留白全被跳過既省時(shí)又減少模型對著靜音硬編出幻覺文本的概率。原理清楚了下面把它當(dāng)成服務(wù)部署起來。跑部署流程之前每一步做完你都應(yīng)該能對著驗(yàn)證命令自檢。深度實(shí)操配置 → 部署 → 調(diào)優(yōu)配置讓 ctranslate2 找到 cuBLAS 和 cuDNN這一步做完你應(yīng)該看到python -c import ctranslate2; print(ctranslate2.get_cuda_device_count())輸出設(shè)備數(shù)比如1而不是拋錯(cuò)。三種裝法按省事程度排Linux pip最省事上一條裝完庫之后還差一步讓動(dòng)態(tài)庫可被找到——LD_LIBRARY_PATH必須在啟動(dòng) Python 之前設(shè)好這步別跳export LD_LIBRARY_PATH$(python3 -c \ import os,nvidia.cublas.lib,nvidia.cudnn.lib; \ print(os.path.dirname(nvidia.cublas.lib.__file__) : \ os.path.dirname(nvidia.cudnn.lib.__file__)))寫進(jìn)~/.bashrc就不用每次手動(dòng)導(dǎo)了。Docker最干凈用nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04鏡像cuBLAS/cuDNN 9 已經(jīng)在里面直接pip install faster-whisper開跑。倉庫自帶的 docker/ 目錄Dockerfile infer.py就是這個(gè)用法的最小示例加載 tiny 模型轉(zhuǎn)一條 flac可以直接拿來當(dāng)冒煙測試。Windows 手動(dòng)拷庫從 NVIDIA 官網(wǎng)下 cuBLAS 和 cuDNN 9 for CUDA 12 的運(yùn)行時(shí)包把cublas64_*.dll、cudnn64_*.dll拷進(jìn)任意PATH目錄。裝完驗(yàn)證命令同 Linux。部署從單條轉(zhuǎn)寫切到批量管道這一步做完你應(yīng)該看到同一個(gè) 13 分鐘文件從單線程的 63 秒級(jí)壓到 17 秒級(jí)且多個(gè)文件能并行處理。單條轉(zhuǎn)寫用WhisperModel.transcribe就夠但服務(wù)化場景上BatchedInferencePipeline——它是 drop-in 替換接口一致默認(rèn)就開著 VAD 過濾from faster_whisper import WhisperModel, BatchedInferencePipeline model WhisperModel(large-v3, devicecuda, compute_typefloat16) batched BatchedInferencePipeline(modelmodel) segments, info batched.transcribe(audio.mp3, batch_size16) for seg in segments: print([%.2fs - %.2fs] %s % (seg.start, seg.end, seg.text))兩個(gè)部署細(xì)節(jié)模型落本地。生產(chǎn)環(huán)境別指望首次調(diào)用去下載幾 GB 的權(quán)重。先用download_model(large-v3, output_dir/opt/models)預(yù)熱或直接把路徑傳進(jìn)去WhisperModel(/opt/models/large-v3-ct2, local_files_onlyTrue)。local_files_onlyTrue保證內(nèi)網(wǎng)機(jī)器不會(huì)偷偷連外網(wǎng)。微調(diào)過的模型轉(zhuǎn)格式。自訓(xùn)的 Transformers 權(quán)重可以用ct2-transformers-converter轉(zhuǎn)成 CTranslate2 格式--quantization float16順手量化轉(zhuǎn)完直接當(dāng)本地目錄加載精度和原模型一致。調(diào)優(yōu)三個(gè)參數(shù)決定 80% 的性能這一步做完你應(yīng)該能在速度 / 顯存 / 精度之間按自己機(jī)器的余量顯式取舍而不是吃默認(rèn)值。compute_type 怎么選Turing 架構(gòu)起RTX 20 系以上用int8_float16量化速度收益最大顯存寬裕想保精度就用float16Pascal 老卡GTX 10 系沒有 Tensor Corefloat16 反而更慢直接用int8純 CPU 就是int8或defaultfp32。batch_size 是顯存換速度的旋鈕large-v2 fp16 下batch 8 讓 13 分鐘音頻從 63 秒到 17 秒顯存 4.5GB → 6.1GB。8GB 卡建議 8164GB 卡保持單條或壓到 4。VAD 參數(shù)按音頻類型調(diào)默認(rèn)只刪 2 秒以上靜音min_silence_duration_ms2000短停頓密集的對話可以收緊segments, _ batched.transcribe( meeting.mp3, vad_parametersdict(min_silence_duration_ms500, speech_pad_ms200), )CPU 部署記得設(shè)線程數(shù)WhisperModel(small, devicecpu, cpu_threads8)或者跑腳本前export OMP_NUM_THREADS8不設(shè)的話框架自己猜的線程數(shù)經(jīng)常不優(yōu)。想要逐詞時(shí)間戳加word_timestampsTrue代價(jià)是每段多一次對齊計(jì)算。調(diào)優(yōu)完跑在別的機(jī)器上就會(huì)撞上下面這批高頻報(bào)錯(cuò)。踩坑實(shí)錄這 5 個(gè)報(bào)錯(cuò)按三段式修ImportError: libcudnn.so.9 / cuDNN not found根因ctranslate2 4.x 只捆綁 CUDA 12 運(yùn)行時(shí)cuDNN 9 必須你自己提供沒裝或LD_LIBRARY_PATH沒導(dǎo)。修復(fù)pip install nvidia-cublas-cu12 nvidia-cudnn-cu129.* export LD_LIBRARY_PATH$(python3 -c \ import os,nvidia.cublas.lib,nvidia.cudnn.lib; \ print(os.path.dirname(nvidia.cublas.lib.__file__) : \ os.path.dirname(nvidia.cudnn.lib.__file__)))Failed to load ctranslate2 / CUDA 版本不匹配根因你的環(huán)境還是 CUDA 11 或 cuDNN 8而ctranslate24.0不再兼容requirements.txt 鎖的是ctranslate24.0,5。修復(fù)驅(qū)動(dòng)暫時(shí)升不了就降庫版本官方給的對應(yīng)關(guān)系是——CUDA 11 cuDNN 8 降ctranslate23.24.0CUDA 12 cuDNN 8 降ctranslate24.4.0pip install --force-reinstall ctranslate23.24.0腳本跑完了但沒有任何輸出、沒有進(jìn)度條根因transcribe()返回的segments是生成器不迭代就一行不會(huì)算看起來像卡死或靜默失敗。修復(fù)把結(jié)果物化轉(zhuǎn)寫才會(huì)真正執(zhí)行segments, _ model.transcribe(audio.mp3) segments list(segments) # 轉(zhuǎn)寫實(shí)際發(fā)生在這里CUDA out of memory根因batch 內(nèi)片段數(shù) × 模型大小超過了顯存和 batch_size、compute_type 兩個(gè)變量直接相關(guān)。修復(fù)按順序試——先降batch_size16 → 8 → 4再切量化model WhisperModel(large-v3, devicecuda, compute_typeint8_float16)實(shí)測 large-v2 int8 比 fp16 省 1.6GB 顯存精度損失在可感知范圍內(nèi)基本無感。長音頻結(jié)尾反復(fù)輸出同一句話根因靜音段里模型幻覺condition_on_previous_textTrue默認(rèn)又把錯(cuò)誤文本喂回下一段 prompt錯(cuò)誤被放大。修復(fù)開 VAD 過濾靜音并給幻覺檢測設(shè)閾值segments, _ model.transcribe( long_audio.mp4, vad_filterTrue, # 單條轉(zhuǎn)寫默認(rèn)是關(guān)的必須顯式開 hallucination_silence_threshold3.0, # 連續(xù)3秒無語音即判為幻覺 )用 distil-large-v3 蒸餾模型時(shí)官方建議直接condition_on_previous_textFalse連這個(gè)坑一起避開。報(bào)錯(cuò)處理完最后拿硬數(shù)據(jù)對比一下它和其他實(shí)現(xiàn)好決定你機(jī)器上該開哪檔。橫向?qū)Ρ韧粭l 13 分鐘音頻各家實(shí)測GPU 組large-v2RTX 3070 Ti 8GBCUDA 12.4beam5實(shí)現(xiàn)精度耗時(shí)顯存openai/whisperfp162m23s4708MBtransformers (SDPA)fp161m52s4960MBfaster-whisperfp161m03s4525MBfaster-whisperbatch_size8fp1617s6090MBfaster-whisperint859s2926MBfaster-whisperbatch_size8int816s4500MBCPU 組small 模型i7-12700K 8 線程beam5實(shí)現(xiàn)精度耗時(shí)內(nèi)存openai/whisperfp326m58s2335MBwhisper.cppfp322m05s1049MBfaster-whisperfp322m37s2257MBfaster-whisperint81m42s1477MBfaster-whisperbatch_size8int851s3608MB兩個(gè)選機(jī)結(jié)論純 CPU 且內(nèi)存緊張int8 是比 fp32 更快的選擇1m42s vs 2m37s內(nèi)存還少 780MB有 8GB 顯存的 GPUint8_float16 batch 8 是性價(jià)比頂點(diǎn)——16 秒轉(zhuǎn)完 13 分鐘音頻顯存 4.5GB還有富余。想再壓時(shí)間看 distil-large-v3同 batch 16 下比 transformers 快 8 分鐘25m50s vs 46m12sWER 還低 1.3 個(gè)點(diǎn)。行動(dòng)清單pip install faster-whisper裝好python -c from faster_whisper import WhisperModel無報(bào)錯(cuò)GPU 環(huán)境cuBLAS/cuDNN 9 就位ctranslate2.get_cuda_device_count()返回正確設(shè)備數(shù)用 tests/data/ 里的樣本音頻跑通一條 fp16 轉(zhuǎn)寫核對時(shí)間戳合理切compute_typeint8_float16復(fù)跑對比耗時(shí)與顯存記下你機(jī)器的最優(yōu)檔換BatchedInferencePipelinebatch_size8~16驗(yàn)證長音頻提速幅度開vad_filterTrue處理一段帶長靜音的會(huì)議錄音確認(rèn)沒有幻覺重復(fù)下一步建議把模型預(yù)熱到download_root固定目錄并加local_files_onlyTrue做內(nèi)網(wǎng)部署有自訓(xùn)權(quán)重就用轉(zhuǎn)換器轉(zhuǎn)成 CTranslate2 格式再上線需要說話人分離的場景在轉(zhuǎn)寫結(jié)果上疊 WhisperX 這類對齊工具別自己造輪子?!久赓M(fèi)下載鏈接】faster-whisperFaster Whisper transcription with CTranslate2項(xiàng)目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考