使用huggingface免費(fèi)docker服務(wù)部署24h錄播
這里只是簡要講述下我遇到了哪些問題,怎么解決的。純自用,不提供代碼及完整方案。
原因很簡單,huggingface雖然提供免費(fèi)服務(wù),但是終究免費(fèi)的docker服務(wù)是用于學(xué)習(xí)和演示的,直接用于錄播應(yīng)用,雖說似乎沒有明面的違規(guī),但是開銷恐怕有些打,如果因?yàn)殚T檻降低而進(jìn)一步濫用就太不好了。
另外本人對(duì)Linux和docker都不熟,僅從初學(xué)的視角講述一些考量和問題點(diǎn)。
為什么需要部署24h錄播
部分主播可能沒有自動(dòng)錄播
部分直播可能因?yàn)椴豢煽沽o法完成投稿
部分主播或者場次可能是不留檔的
開播時(shí)間和個(gè)人時(shí)間不太匹配,無法跟直播
本地網(wǎng)絡(luò)不穩(wěn)定,看直播有時(shí)都卡,不適合本地錄播
fuggingface的docker服務(wù)特殊之處
只對(duì)外暴露一個(gè)端口,暴露的端口對(duì)docker鏡像來說,是可以通過readme.md和dockerfile來自定義的,對(duì)外映射為80,可以通過https://${用戶名}-${倉庫名}.hf.space來調(diào)用
2c16g,磁盤可用空間100g左右,網(wǎng)絡(luò)狀況良好
docker啟動(dòng)以后無法獲得root權(quán)限也無法使用sudo命令 (當(dāng)然也可能是我水平有限)
部署24h錄播需要的主要軟件:
錄播軟件,最好能夠提供API或者網(wǎng)頁
把網(wǎng)盤映射為存儲(chǔ)器,或者提供http/webdav/ftp等公開協(xié)議的網(wǎng)盤
我選擇了錄播姬和Alist。網(wǎng)盤服務(wù)選擇了和彩云(畢竟空間大還免流)
部署程序到hf
如果單獨(dú)部署直播姬和Alist到hf,其實(shí)難度并不大。dockerfile里直接添加下載程序,解壓,給執(zhí)行權(quán)限,運(yùn)行,完事。
但是如果讓兩個(gè)程序同時(shí)運(yùn)行在一個(gè)space里,就有困難了。
dockerfile的CMD命令只能運(yùn)行一個(gè)程序,用&&連接多個(gè)命令是無效的
如前述,hf限制一個(gè)space對(duì)外只暴露一個(gè)端口。兩個(gè)程序運(yùn)行在同一個(gè)space中時(shí),無法從外部訪問兩個(gè)程序的控制界面
當(dāng)然這只是困難,顯然是有解決辦法的:
? 使用如下方式的shell腳本,在docker的CMD命令中運(yùn)行這個(gè)腳本,運(yùn)行到cmd1時(shí),不等待cmd1運(yùn)行結(jié)束,就會(huì)直接運(yùn)行cmd2.只要cmd2打開了readme.md指定的端口,或者默認(rèn)的7860端口,hf就會(huì)判斷空間正常啟動(dòng)。而cmd1和cmd2所運(yùn)行的程序都會(huì)繼續(xù)運(yùn)行。
????2.? 突破這個(gè)限制有兩種方式:a.使用反向代理技術(shù),把不同端口映射為同一個(gè)端口的不同路由;b.把錄播和網(wǎng)盤服務(wù)分別運(yùn)行在兩個(gè)space,錄播結(jié)束通過webdav協(xié)議備份文件.c.對(duì)外只暴露一個(gè)服務(wù)。我選擇的方案是b。
Docker重啟配置丟失的問題
當(dāng)hf倉庫發(fā)生git?push后,或者超時(shí)被回收后,docker會(huì)重啟。此時(shí)配置文件會(huì)被重置。如何持久化存儲(chǔ)配置文件呢?
錄播姬直接使用json格式保存配置,Alist使用json格式備份和恢復(fù)配置。因此我們可以把這兩個(gè)文件備份到另一個(gè)git倉庫中,當(dāng)docker啟動(dòng)時(shí),自動(dòng)拉取配置。
而Alist稍微麻煩一些,還需要額外手動(dòng)登錄并且導(dǎo)入配置。
自動(dòng)同步網(wǎng)盤
雖然錄播姬和Alist都運(yùn)行起來了,但是錄播結(jié)束后,如何同步到網(wǎng)盤中去呢?
錄播姬的設(shè)置中提供了webhook服務(wù),也就是發(fā)生事件后,就向設(shè)定的API發(fā)送post請(qǐng)求。請(qǐng)求內(nèi)容包含了事件的信息(比如哪個(gè)直播間開播了,哪個(gè)直播間錄播結(jié)束了)
我直接用范例改寫了nodejs腳本,當(dāng)錄播結(jié)束后,調(diào)用curl把文件上傳到Alist的webdav接口上。
nodejs的啟動(dòng)方法正是前邊提及但是沒用上的cmd1 & cmd2的寫法。
減少空間占用
兩方面減少空間占用:
錄播結(jié)束后,自動(dòng)刪除3天前的文件,節(jié)約本地磁盤:運(yùn)行命令??find -mtime +3 -type f -name "*.flv" -exec rm {} \;
錄播結(jié)束,只上傳音頻和截圖,節(jié)約網(wǎng)盤空間。畢竟看直播也是常做黑聽人,沒有畫面問題不是特別大。也可以按需下載到本地。只上傳音頻顯然是用ffmpeg分離音頻,就不贅述。截屏的部分同樣是ffmpeg
自動(dòng)生成字幕
?? ?? ? 如果沒有看到別人reop直播內(nèi)容,通過語音識(shí)別出主播說了什么,是可以快速了解直播內(nèi)容的一個(gè)方法。雖然現(xiàn)在大家都在吹whisper,我還是推薦使用谷歌的服務(wù),whisper的開銷實(shí)在太大了,我擔(dān)心影響到正常錄播。
對(duì)應(yīng)的項(xiàng)目是這個(gè)https://github.com/agermanidis/autosub,他有一些上手難度,默認(rèn)不能識(shí)別為中文,因此我給出一個(gè)范例: ?
推送消息
直播開始和錄播結(jié)束自動(dòng)推送消息也是一個(gè)實(shí)用的功能。
我把他也做到了nodejs腳本里,推送服務(wù)選擇了推送加。有條件的人可以自己搭一個(gè)公眾號(hào),這樣推送的消息的自定義程度可以更高
離線下載
AList支持調(diào)用Aria2,但是需要自己安裝Aria2.這玩意apt-get?install一下就完事,但是安裝之后需要配置。略有點(diǎn)麻煩,可以直接抄我的倉庫,配置文件也可以在里邊找到??https://huggingface.co/spaces/tumuyan/Alist/blob/main/script.sh
文件時(shí)間錯(cuò)誤
安裝tzdata并且設(shè)置時(shí)區(qū)