stream-translator-gpt: 基于Whisper和ChatGPT的直播實(shí)時(shí)翻譯
stream-translator-gpt是什么?
stream-translator-gpt是本人基于stream-translator進(jìn)行改進(jìn)的一個(gè)項(xiàng)目,對直播流使用Whisper進(jìn)行語音轉(zhuǎn)文字,再使用ChatGPT進(jìn)行翻譯,達(dá)到實(shí)時(shí)機(jī)翻的效果。
演示視頻:

Github地址:https://github.com/ionic-bond/stream-translator-gpt
關(guān)于原項(xiàng)目stream-translator的介紹,可以看站內(nèi)另一篇專欄:

關(guān)于stream-translator原有的功能,本文將不再詳細(xì)介紹。
本項(xiàng)目stream-translator-gpt主要進(jìn)行了以下改進(jìn):
用基于人聲檢測的切片邏輯替換了原項(xiàng)目的按固定時(shí)間的切片邏輯。
引入ChatGPT API來提供翻譯功能。
引入go-cqhttp API來提供把翻譯結(jié)果發(fā)送到QQ的功能。
使用yt-dlp替換streamlink,這樣就可以使用cookies來讀取會(huì)員限定的直播流。

準(zhǔn)備工作
為了避免浪費(fèi)你的寶貴時(shí)間,在閱讀本文正式內(nèi)容之前,你需要準(zhǔn)備以下這些工具/條件:
OpenAI API的訪問權(quán)限
你需要有一個(gè)OpenAI賬號(hào),然后確認(rèn)?https://platform.openai.com/account/usage 里邊有可用的免費(fèi)/付費(fèi)額度,然后在?https://platform.openai.com/account/api-keys 獲取你的API key。
關(guān)于OpenAI的注冊和充值網(wǎng)上有很多教程,本文不會(huì)做這方面的說明。
(如果你不需要翻譯功能也可以不用這個(gè))
你需要自己部署一個(gè)go-cqhttp
本程序發(fā)送到QQ的功能是基于go-cqhttp的HTTP API的,所以你需要自己部署一個(gè)go-cqhttp,部署的方法請看go-cqhttp的文檔,本文不會(huì)做說明。
(如果你不需要發(fā)送到QQ功能也可以不用這個(gè))
可以不需要編程經(jīng)驗(yàn),但需要有在命令行環(huán)境下運(yùn)行程序的經(jīng)驗(yàn),起碼需要知道參數(shù)怎么填,文件路徑是什么。本程序不是一鍵傻瓜包,你需要理解每一步在做什么才能在本地正確地運(yùn)行起來。
一個(gè)Google賬號(hào),用于在colab上運(yùn)行程序。

使用方法簡介
廢話不多說,先上colab:https://colab.research.google.com/drive/1-9KqeACyep4Y1dFTTZy2deIAtbYPwKBn?usp=sharing
接下來我們按著colab一步一步講解運(yùn)行流程
(建議把colab復(fù)制到自己的云盤再修改,分享的colab不能保存你自己的修改)

看顯卡信息的,一般不用管,colab白嫖一般給的都是Tesla T4。

下載代碼并安裝環(huán)境依賴,運(yùn)行就可以了,不用管

這一段的作用是把whisper模型轉(zhuǎn)換成faster-whisper模型
(如果不想看太多細(xì)節(jié),一句話概括:用就完事了,可以跳到下一段)
faster-whisper是stream-translator的作者最近支持的,相比whisper,faster-whisper速度要快4倍,而顯存只用不到50%(在large v2模型下)

個(gè)人的經(jīng)驗(yàn):在colab的Tesla T4上使用whisper的large model的話,會(huì)有累積延遲,與直播的時(shí)間差會(huì)越來越大。而faster-whisper的large model則是快的不行,用視頻來測試的時(shí)候甚至輸出速度超過了ChatGPT API的限制。

接下來終于到重點(diǎn)了(廢話,都最后一個(gè)了),前邊都是環(huán)境準(zhǔn)備,這個(gè)是程序的運(yùn)行,所有需要填寫/調(diào)整的參數(shù)也都在這里,接下來我們逐個(gè)說明參數(shù)的作用和怎么填。
直播/視頻的地址,無需多說,換成你需要翻譯的直播地址。
支持的網(wǎng)站,請看yt-dlp的支持網(wǎng)站:https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md
當(dāng)不使用faster-whisper的時(shí)候(后邊有說),這個(gè)參數(shù)才生效,指定whisper使用的模型。
直播流的語言,不填會(huì)自動(dòng)識(shí)別,但最好填一下,全稱或縮寫都行,支持的語言列表見 https://github.com/openai/whisper/blob/main/whisper/tokenizer.py
經(jīng)常使用whisper的朋友應(yīng)該知道,在沒有人聲只有BGM的地方whisper經(jīng)常會(huì)輸出奇奇怪怪的東西。
(原因大概是whisper訓(xùn)練用了一些視頻的字幕,那些奇奇怪怪的輸出通常就是字幕里對應(yīng)BGM時(shí)段的內(nèi)容,什么感謝觀看啊,什么字幕作者?。?/p>
所以我自己收集了一些常見的錯(cuò)誤輸出,做了個(gè)過濾器,歡迎提Pull requests補(bǔ)充,或者聯(lián)系我。
這兩個(gè)參數(shù)的作用是啟用前邊提到過的faster-whisper。
如果你想用原本的whisper,請刪掉這兩個(gè)參數(shù)。
如果你是在本地運(yùn)行,請把后邊的路徑改成正確的faster-whisper模型的文件夾地址。
首先,請?zhí)钌夏愕腛penAI API key。
然后,用過ChatGPT的朋友應(yīng)該知道,用ChatGPT來翻譯的話,需要對它說“請翻譯***為**語言”,這里的prompt就是發(fā)給ChatGPT API的命令,用目標(biāo)語言來寫就行(我加了句不要輸出原文是因?yàn)樗矚g把原文一起輸出了)
填入你部署好的的go-cqhttp程序的url,就可以發(fā)送到QQ
(注:在colab運(yùn)行的話可以先跳過這步,除非你另外在一臺(tái)有公網(wǎng)IP的服務(wù)器上運(yùn)行g(shù)o-cqhttp)
比如go-cqhttp部署在同一臺(tái)機(jī)器,然后我要發(fā)送到12345678這個(gè)QQ號(hào),那就填
http://127.0.0.1:5700/send_msg?user_id=12345678
其他用法請看 https://docs.go-cqhttp.org/api/
token是你部署go-cqhttp的時(shí)候設(shè)置的,沒有設(shè)置的話留空就行。

以上就是colab運(yùn)行的全部講解

其他參數(shù)說明
除了上邊說的一些經(jīng)常需要調(diào)整的參數(shù)外,還有一些通常不太需要調(diào)整的參數(shù),如果你需要進(jìn)一步控制程序的行為,請看這里。
(注:以下參數(shù)如有默認(rèn)值我會(huì)填上,如無默認(rèn)值則只寫出參數(shù)名字)

直播/視頻的格式,這個(gè)參數(shù)是直接傳遞給yt-dlp的,詳細(xì)見?https://github.com/yt-dlp/yt-dlp#format-selection
wa*的意思是音頻要最差的,視頻有沒有都行。
因?yàn)閣hisper和人聲檢測都是16000 Hz的,主流視頻網(wǎng)站最差的音頻一般都不低于這個(gè),用最差的主要是省流量,不放心可以改成best,會(huì)給你拉1080p的視頻。

如果直播是會(huì)員限定的,則需要傳入你的cookies文件,獲取cookies我一般用“Get cookies.txt”這個(gè)插件

這5個(gè)參數(shù)均為開頭提到過的基于人聲檢測的切片邏輯的參數(shù),分別表示:
處理的精度(單位:秒),即對于直播流會(huì)切成多長的單位來進(jìn)行人聲判斷,不能小于0.03(30ms)
連續(xù)多少秒沒有人聲則進(jìn)行切片
切片最小長度
切片最大長度
人聲判斷的閾值,取值0~1,如果你覺得輸出吞掉了一些人聲,那么可以嘗試減少這個(gè)值,反之亦然
(以上前4個(gè)參數(shù)不需要構(gòu)成整除關(guān)系,程序會(huì)自動(dòng)處理)
如果你想看切片的具體代碼,請?jiān)诖a里搜“StreamSlicer”。

使用哪個(gè)GPT模型,gpt-3.5-turbo就是ChatGPT,富哥可以改成gpt-4(如果你有g(shù)pt-4的使用資格)

調(diào)用GPT API的超時(shí)時(shí)間,調(diào)用是并行的,不需要擔(dān)心累積延遲。
輸出翻譯結(jié)果時(shí)會(huì)確保順序,如果你覺得翻譯偶爾卡很久寧可放棄某一條,可以調(diào)小這個(gè)值。

還有一些應(yīng)該不太會(huì)用到的參數(shù),這里就不說了,感興趣可以在Github的README上查看。

本地運(yùn)行
Linux下運(yùn)行按著colab來一般不會(huì)出什么問題,Windows的python和cuda環(huán)境安裝stream-translator那篇專欄有說,下邊說說新增的部分在Windows下有可能出現(xiàn)的問題:
yt-dlp:因?yàn)槌绦虿皇窃趐ython里邊而是在系統(tǒng)調(diào)用yt-dlp,所以pip安裝的yt-dlp在Windows下調(diào)用不了,你需要自己下載?https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.exe ,然后放到一個(gè)目錄,然后把這個(gè)目錄加到環(huán)境變量里。
faster-whisper:跟上邊一樣的原因,pip安裝的轉(zhuǎn)換程序不能運(yùn)行,所以我把轉(zhuǎn)換好的faster-whisper模型打包上傳到網(wǎng)盤了,下載解壓然后把文件夾地址填到?--faster_whisper_model_path 就行了
https://pan.baidu.com/s/1kZnbGVPguhPY5Q2E9iVjag?pwd=vkn2?
或
https://drive.google.com/file/d/1U5Cjzqi-Tkcr64xJxbBMmpwUVS2azcgG/view?usp=sharing
可能出現(xiàn)的報(bào)錯(cuò):ValueError: Requested float16 compute type, but the target device or backend do not support efficient float16 computation.,可能是因?yàn)轱@卡比較舊,加上?--faster_whisper_compute_type int8?應(yīng)該就行了。

其他
雖然演示用了視頻,但其實(shí)這個(gè)工具是為直播串流的場景開發(fā)的,在視頻上并不是最優(yōu)解,視頻的話肯定是整個(gè)輸入Whisper再把結(jié)果整個(gè)翻譯效果好得多,畢竟上下文在語音轉(zhuǎn)文字和翻譯上都很重要。
如果這個(gè)工具能給你帶來幫助,你又剛好有Github賬號(hào),那可以給我的項(xiàng)目點(diǎn)個(gè)star嗎,謝謝~
https://github.com/ionic-bond/stream-translator-gpt