Faster-Whisper是Whisper開源後的第三方進化版本,它對原始的 Whisper 模型結構進行了改進和最佳化。這包括減少模型的層數、減少引數量、簡化模型結構等,從而減少了計算量和記憶體消耗,提高了推理速度,與此同時,Faster-Whisper也改進了推理演算法、最佳化計算過程、減少冗餘計算等,用以提高模型的執行效率。
本次我們利用Faster-Whisper對日語影片進行雙語(日語/國語)轉錄實踐,看看效率如何。
構建Faster-Whisper轉錄環境
首先確保本地已經安裝好Python3.10版本以上的開發環境,隨後克隆專案:
git clone https://github.com/ycyy/faster-whisper-webui.git
進入專案的目錄:
cd faster-whisper-webui
安裝專案依賴:
pip3 install -r requirements.txt
這裡需要注意的是,除了基礎依賴,還得再裝一下faster-whisper依賴:
pip3 install -r requirements-fasterWhisper.txt
如此,轉錄速度會更快。
模型的下載和配置
首先在專案的目錄建立模型資料夾:
mkdir Models
faster-whisper專案內部已經整合了VAD演算法,VAD是一種音訊活動檢測的演算法,它可以準確的把音訊中的每一句話分離開來,並且讓whisper更精準的定位語音開始和結束的位置。
所有首先需要配置VAD模型:
git clone https://github.com/snakers4/silero-vad
然後將克隆下來的vad模型放入剛剛建立的Models資料夾中即可。
接著下載faster-whisper模型,下載地址:
https://huggingface.co/guillaumekln/faster-whisper-large-v2
這裡建議只下載faster-whisper-large-v2模型,也就是大模型的第二版,因為faster-whisper本來就比whisper快,所以使用large模型優勢就會更加的明顯。
模型放入models資料夾的faster-whisper目錄,最終目錄結構如下:
models
├─faster-whisper
│ ├─large-v2
└─silero-vad
├─examples
│ ├─cpp
│ ├─microphone_and_webRTC_integration
│ └─pyaudio-streaming
├─files
└─__pycache__
至此,模型就配置好了。
本地推理進行轉錄
現在,我們可以試一試faster-whisper的效果了,以「原神」神裡綾華日語影片:《誰能拒絕一隻蝴蝶忍呢?》為例子,原影片地址:
https://www.bilibili.com/video/BV1fG4y1b74e/
專案根目錄執行命令:
python cli.py --model large-v2 --vad silero-vad --language Japanese --output_dir d:/whisper_model d:/Downloads/test.mp4
這裡--model指定large-v2模型,--vad演算法使用silero-vad,--language語言指定日語,輸出目錄為d:/whisper_model,轉錄影片是d:/Downloads/test.mp4。
程式輸出:
D:\work\faster-whisper-webui>python cli.py --model large-v2 --vad silero-vad --language Japanese --output_dir d:/whisper_model d:/Downloads/test.mp4
Using faster-whisper for Whisper
[Auto parallel] Using GPU devices ['0'] and 8 CPU cores for VAD/transcription.
Creating whisper container for faster-whisper
Using parallel devices: ['0']
Created Silerio model
Parallel VAD: Executing chunk from 0 to 74.071224 on CPU device 0
Loaded Silerio model from cache.
Getting timestamps from audio file: d:/Downloads/test.mp4, start: 0, duration: 74.071224
Processing VAD in chunk from 00:00.000 to 01:14.071
C:\Users\zcxey\AppData\Roaming\Python\Python310\site-packages\torch\nn\modules\module.py:1501: UserWarning: operator () profile_node %669 : int[] = prim::profile_ivalue(%667)
does not have profile information (Triggered internally at ..\third_party\nvfuser\csrc\graph_fuser.cpp:108.)
return forward_call(*args, **kwargs)
VAD processing took 2.474104000022635 seconds
Transcribing non-speech:
[{'end': 75.071224, 'start': 0.0}]
Parallel VAD processing took 8.857761900057085 seconds
Device 0 (index 0) has 1 segments
Using device 0
(get_merged_timestamps) Using override timestamps of size 1
Processing timestamps:
[{'end': 75.071224, 'start': 0.0}]
Running whisper from 00:00.000 to 01:15.071 , duration: 75.071224 expanded: 0 prompt: None language: None
Loading faster whisper model large-v2 for device None
WARNING: fp16 option is ignored by faster-whisper - use compute_type instead.
[00:00:00.000->00:00:03.200] 稲妻神裡流 太刀術免許開伝
[00:00:03.200->00:00:04.500] 神裡綾香
[00:00:04.500->00:00:05.500] 參ります!
[00:00:06.600->00:00:08.200] よろしくお願いします
[00:00:08.200->00:00:12.600] こののどかな時間がもっと増えると嬉しいのですが
[00:00:13.600->00:00:15.900] 私って欲張りですね
[00:00:15.900->00:00:18.100] 神裡家の宿命や
[00:00:18.100->00:00:19.900] 社部業の重りは
[00:00:19.900->00:00:23.600] お兄様が一人で背負うべきものではありません
[00:00:23.600->00:00:27.700] 多くの方々が私を継承してくださるのは
[00:00:27.700->00:00:30.900] 私を白鷺の姫君や
[00:00:30.900->00:00:34.600] 社部業神裡家の霊嬢として見ているからです
[00:00:34.600->00:00:38.500] 彼らが継承しているのは私の立場であって
[00:00:38.500->00:00:41.700] 綾香という一戸人とは関係ございません
[00:00:41.700->00:00:43.400] 今の私は
[00:00:43.400->00:00:47.300] 皆さんから信頼される人になりたいと思っています
[00:00:47.300->00:00:49.700] その気持ちを鼓舞するものは
[00:00:49.700->00:00:52.300] 肩にのしかかる銃石でも
[00:00:52.300->00:00:54.800] 他人からの期待でもございません
[00:00:54.800->00:00:56.700] あなたがすでに
[00:00:56.800->00:00:58.800] そのようなお方だからです
[00:00:58.800->00:01:00.500] 今から言うことは
[00:01:00.500->00:01:03.900] 稲妻幕府社部業神裡家の肩書きに
[00:01:03.900->00:01:06.200] ふさわしくないものかもしれません
[00:01:06.200->00:01:11.100] あなたは私のわがままを受け入れてくださる方だと信じています
[00:01:11.100->00:01:12.500] 神裡流
[00:01:12.500->00:01:14.000] 壯烈
Whisper took 22.232674299972132 seconds
Parallel transcription took 31.472856600070372 seconds
Max line width 80
Closing parallel contexts
Closing pool of 1 processes
Closing pool of 8 processes
可以看到,1分14秒的影片,vad用了8秒,whisper用了22秒,轉錄一共用了31秒。
注意,這裡只是用了whisper原版的演算法,現在我們新增--whisper_implementation faster-whisper引數來使用faster-whisper改進後的演算法:
python cli.py --whisper_implementation faster-whisper --model large-v2 --vad silero-vad --language Japanese --output_dir d:/whisper_model d:/Downloads/test.mp4
程式返回:
Running whisper from 00:00.000 to 01:15.071 , duration: 75.071224 expanded: 0 prompt: None language: None
Loading faster whisper model large-v2 for device None
WARNING: fp16 option is ignored by faster-whisper - use compute_type instead.
[00:00:00.000->00:00:03.200] 稲妻神裡流 太刀術免許開伝
[00:00:03.200->00:00:04.500] 神裡綾香
[00:00:04.500->00:00:05.500] 參ります!
[00:00:06.600->00:00:08.200] よろしくお願いします
[00:00:08.200->00:00:12.600] こののどかな時間がもっと増えると嬉しいのですが
[00:00:13.600->00:00:15.900] 私って欲張りですね
[00:00:15.900->00:00:18.100] 神裡家の宿命や
[00:00:18.100->00:00:19.900] 社部業の重りは
[00:00:19.900->00:00:23.600] お兄様が一人で背負うべきものではありません
[00:00:23.600->00:00:27.700] 多くの方々が私を継承してくださるのは
[00:00:27.700->00:00:30.900] 私を白鷺の姫君や
[00:00:30.900->00:00:34.600] 社部業神裡家の霊嬢として見ているからです
[00:00:34.600->00:00:38.500] 彼らが継承しているのは私の立場であって
[00:00:38.500->00:00:41.700] 綾香という一戸人とは関係ございません
[00:00:41.700->00:00:43.400] 今の私は
[00:00:43.400->00:00:47.300] 皆さんから信頼される人になりたいと思っています
[00:00:47.300->00:00:49.700] その気持ちを鼓舞するものは
[00:00:49.700->00:00:52.300] 肩にのしかかる銃石でも
[00:00:52.300->00:00:54.800] 他人からの期待でもございません
[00:00:54.800->00:00:56.700] あなたがすでに
[00:00:56.800->00:00:58.800] そのようなお方だからです
[00:00:58.800->00:01:00.500] 今から言うことは
[00:01:00.500->00:01:03.900] 稲妻幕府社部業神裡家の肩書きに
[00:01:03.900->00:01:06.200] ふさわしくないものかもしれません
[00:01:06.200->00:01:11.100] あなたは私のわがままを受け入れてくださる方だと信じています
[00:01:11.100->00:01:12.500] 神裡流
[00:01:12.500->00:01:14.000] 壯烈
Whisper took 10.779123099986464 seconds
Parallel transcription took 11.567014200030826 seconds
大模型只用了10秒,這效率,絕了。
中文字幕
在以往的Whisper模型中,如果我們需要中文字幕,需要透過引數--task translate翻譯成英文,然後再透過第三方的翻譯介面將英文翻譯成中文,再手動匹配字幕效果,比較麻煩。
現在,我們只需要將語言直接設定為中文即可,程式會進行自動翻譯:
python cli.py --whisper_implementation faster-whisper --model large-v2 --vad silero-vad --language Chinese --output_dir d:/whisper_model d:/Downloads/test.mp4
這裡的--language引數改為Chinese。
程式返回:
Running whisper from 00:00.000 to 01:15.071 , duration: 75.071224 expanded: 0 prompt: None language: None
Loading faster whisper model large-v2 for device None
WARNING: fp16 option is ignored by faster-whisper - use compute_type instead.
[00:00:00.000->00:00:03.200] 稲妻神裡流太刀術免許改練
[00:00:03.200->00:00:04.400] 神裡綾香
[00:00:04.400->00:00:05.400] 來吧
[00:00:06.600->00:00:08.200] 請多多指教
[00:00:08.200->00:00:12.600] 希望能有更多的這段寂靜的時間
[00:00:13.600->00:00:15.800] 我真是太有興趣了
[00:00:15.800->00:00:20.000] 神裡家的宿命和社部行的重量
[00:00:20.000->00:00:23.600] 不應該由哥哥一個人承擔
[00:00:23.600->00:00:27.400] 很多人都敬重我
[00:00:27.600->00:00:28.800] 是因為他們把我視為
[00:00:28.800->00:00:34.600] 神裡家的宿命和社部行的重量
[00:00:34.600->00:00:38.600] 他們敬重的是我的立場
[00:00:38.600->00:00:41.800] 與我自己的身分無關
[00:00:41.800->00:00:43.400] 現在的我
[00:00:43.400->00:00:47.400] 是想成為大家信任的一個人
[00:00:47.400->00:00:49.800] 那些敬重我的人
[00:00:49.800->00:00:52.400] 無論是肩上的重石
[00:00:52.400->00:00:54.800] 或是別人的機器
[00:00:54.800->00:00:58.800] 都是因為你已經是這樣的一個人
[00:00:58.800->00:01:00.400] 我現在要說的話
[00:01:00.400->00:01:03.800] 可能不適合
[00:01:03.800->00:01:06.200] 神裡家的宿命和社部行
[00:01:06.200->00:01:11.000] 但我相信你能接受我的自私
[00:01:11.000->00:01:12.400] 神裡流
[00:01:12.400->00:01:14.000] 消滅
Whisper took 18.85215839999728 seconds
字幕就已經是中文了,注意轉錄+翻譯一共花了18秒,時間成本比直接轉錄要高。
雙語字幕效果:
結語
由於 Faster-Whisper 的速度更快,它可以擴充套件到更多的應用領域,包括實時場景和大規模的資料處理任務。這使得 Faster-Whisper 在語音識別、自然語言處理、機器翻譯、智慧對話等領域中具有更廣泛的應用潛力,當然了,更重要的是,當您的電腦裡D盤中的愛情片還沒有中文字幕時,您當然知道現在該做些什麼了。