AI彈幕姬使用文檔(又名賽博跑路丸彈幕姬)

概述
此腳本通過(guò)使用character.ai生成回復(fù)來(lái)提供一個(gè)簡(jiǎn)易的語(yǔ)音彈幕姬功能,包含對(duì)輸入和輸出文本的安全審核,但是并不保證一定會(huì)過(guò)濾掉所有違規(guī)文本。
這個(gè)腳本主要是搞賽博跑路丸的(當(dāng)然有一定泛用性就稍微發(fā)一下),畢竟他在群里也不說(shuō)話(huà)裝死人,不過(guò)如果你非要說(shuō)你這個(gè)東西有倫理問(wèn)題的話(huà),這事跟他說(shuō)過(guò)。

免責(zé)聲明
不提供任何擔(dān)保和技術(shù)支持。前幾天想到就稍微搞了一下,沒(méi)有實(shí)際直播測(cè)試,只是本地測(cè)試過(guò)。
不會(huì)編程,代碼寫(xiě)的很爛,建議自己寫(xiě)。
由于此腳本使用AI技術(shù),且直播屬于商用,這將導(dǎo)致無(wú)法避免的倫理等問(wèn)題。在此建議使用者僅使用已經(jīng)獲得授權(quán)的的形象。由于此腳本導(dǎo)致的任何問(wèn)題,本人概不負(fù)責(zé)。
此腳本無(wú)除使用的依賴(lài)庫(kù)的限制的任何附加限制,就是我寫(xiě)的部分你隨便處置,你說(shuō)這東西不是我寫(xiě)的是你寫(xiě)的都隨便,當(dāng)然如果說(shuō)是你寫(xiě)的那么有問(wèn)題別來(lái)找我。收到米了自己留著,被錘了自己受著,我是不管的。
預(yù)備工作
你要有一個(gè)character.ai的賬號(hào),這個(gè)自己拿郵箱注冊(cè)就可以了
你的電腦有聲音支持,或者至少有一個(gè)聲音輸出設(shè)備
如果你直連上不去character.ai或*.hf.space,你還額外需要一個(gè)代理
一些基本常識(shí),包括可以接受命令行腳本和知道直播間房號(hào)是什么
開(kāi)始使用與參數(shù)的額外說(shuō)明
你應(yīng)該已經(jīng)得到了此腳本的可運(yùn)行程序(actions里構(gòu)建的是sample.exe.zip)或者原始腳本(git clone過(guò)來(lái)的),這里僅介紹可運(yùn)行程序的使用,因?yàn)槟_本也就是先裝依賴(lài)再運(yùn)行。運(yùn)行時(shí)捕捉系統(tǒng)音頻即可。你以前的彈幕姬怎么捕捉的這個(gè)就怎么捕捉。注意pyaudio需要C++編譯器。腳本自帶的參數(shù)幫助如下:
這里不知道為什么都顯示為Optional arguments,但是token
和room
是必填的。外發(fā)版本有可能character_external_id
和voiceurl
也是必填(畢竟你們肯定不是奔著賽博跑路丸去的)。
character_external_id
這是character.ai中角色的外部ID,對(duì)于這個(gè)ID,可以通過(guò)聊天界面的地址欄char=xxxx
這個(gè)參數(shù)找到,如下圖藍(lán)色部分所示。?

history_id
character.ai的會(huì)話(huà)歷史,不填就是新會(huì)話(huà),填了就是用舊會(huì)話(huà),在上圖黃色部分。目前必須與tgt聯(lián)合使用才會(huì)使用已有會(huì)話(huà),因?yàn)楫?dāng)時(shí)判斷的時(shí)候是or,懶得改了,反正一般用不上。
tgt
角色的內(nèi)部ID,除非你是要用會(huì)話(huà)歷史才要填(小bug懶得修了),否則你大概率是沒(méi)必要填這個(gè)東西的。這個(gè)東西在F12看網(wǎng)絡(luò)請(qǐng)求能看到,比如抓歷史會(huì)話(huà)詳情的api的話(huà)在這里:?

如果是初始化會(huì)話(huà)的話(huà)在participants
的username
里,就不細(xì)說(shuō)了,看格式能看出來(lái)
appid
和appsec
這兩個(gè)只在qqaudit=True
,也就是你出于任何原因想用小程序的文本審核的情況下才用,默認(rèn)是騰訊云文本審核demo。這個(gè)小程序文本審核可能用不了,具體沒(méi)有測(cè)試,我當(dāng)時(shí)試審幾十條就提示請(qǐng)求過(guò)多了,可能因?yàn)槲业男〕绦虿皇前l(fā)布態(tài)。
如下圖,藍(lán)色的是appid,黃色的是appsec。?

proxy
系統(tǒng)代理地址,如果你可以直接連character.ai和*.hf.space的話(huà)不設(shè),全局虛擬專(zhuān)用網(wǎng)模式未測(cè)試(我用的v2),其他的設(shè)成你的魔法代理地址,比如v2的地址在這里:?

socks的寫(xiě)法沒(méi)試過(guò),http的代理寫(xiě)法就是http://localhost:10809
,這就具體無(wú)法提供對(duì)應(yīng)幫助了,自己去看你軟件幫助吧。
token
character.ai的token,這個(gè)在認(rèn)證頭里,還是F12隨便抓幾個(gè)請(qǐng)求。?

voiceurl
TTS API的url地址。參考vits-uma-genshin-honkai
這個(gè)Hugging Face的space去部署,其實(shí)可以直接fork一個(gè)別人的再把你的模型放到model里稍微改下配置就行了,參考我這個(gè)fork,mzltest/vits-uma-genshin-honkai
的修改方式。注意如果你的說(shuō)話(huà)人不叫group
或者沒(méi)有中文
這個(gè)語(yǔ)音的話(huà)必須額外配置voiceargs,因?yàn)槟J(rèn)值就是我用的沒(méi)考慮其他的。
room
直播間房號(hào)。不知道這是什么的你不符合使用條件。雖然他就在地址欄里也不配圖說(shuō)明了,否則一堆人就會(huì)去問(wèn)其他的配置項(xiàng)怎么搞。
msg_str_format
希望如何念出彈幕??梢允褂?code>{uname}彈幕發(fā)送者昵稱(chēng),{msg}
彈幕內(nèi)容,{resp}
AI回應(yīng)這幾個(gè)變量,比如說(shuō)我覺(jué)得{uname}說(shuō)的{msg}來(lái)講應(yīng)該{resp}
。即使你沒(méi)用上AI回應(yīng)也依然會(huì)去請(qǐng)求AI回應(yīng),這個(gè)也是小問(wèn)題懶得修了。
gift_str_format
同上,只不過(guò)變量是{uname}
發(fā)送者昵稱(chēng),{gift}
禮品名稱(chēng)和{num}
數(shù)量。未測(cè)試,沒(méi)開(kāi)直播間沒(méi)辦法試。
qqaudit
除非你要用QQ小程序的文本審核并且配置了appid和appsec否則就是false。
voiceargs
在發(fā)送TTS請(qǐng)求時(shí)除了文本以為需要的額外參數(shù),比如說(shuō)話(huà)者和語(yǔ)音以及音素什么的長(zhǎng)度等。以空格分隔,比如中文 角色A 0.6 0.668 1.2
,這個(gè)你如果配voiceurl
就知道了。?

典型指令示例
.\sample.exe -token=xxx -room=xxxx --voiceurl https://vioiet-vits-uma-genshin-honkai.hf.space --voiceargs 中文 特別周 0.6 0.668 1.2 --proxy="http://localhost:10809" --character_external_id xxxxxxx
使用自定義語(yǔ)音和自定義角色(再說(shuō)一遍,外發(fā)版有可能沒(méi)有默認(rèn)角色和語(yǔ)音url,最好自己配好)
常見(jiàn)故障
tls_client.exceptions.TLSClientExeption: failed to do request: Post "https://beta.character.ai/chat/history/create/": read tcp 127.0.0.1:62415->127.0.0.1:10809: i/o timeout (Client.Timeout exceeded while awaiting headers)
A:你的網(wǎng)絡(luò)環(huán)境有問(wèn)題。配置的代理有誤/沒(méi)法直連也沒(méi)配置代理/你代理掛掉了/你的代理實(shí)際連不上。
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
A:無(wú)法解析character.ai的回應(yīng)。一般多試幾次有可能會(huì)好,如果沒(méi)好瀏覽器手動(dòng)打開(kāi)character.ai,如果出現(xiàn)等待室頁(yè)面也正常(你瀏覽器都用不了我要是能用了我還會(huì)在這里寫(xiě)腳本嗎),如果沒(méi)有出現(xiàn)等待室頁(yè)面且多次重試依然出現(xiàn)此問(wèn)題說(shuō)明被cloudflare攔截了。這個(gè)腳本考慮到性能和資源等原因沒(méi)有采用無(wú)頭瀏覽器的方式來(lái)繞過(guò)cloudflare,而是用的TLS指紋繞過(guò)(這就是為什么如果你看代碼會(huì)發(fā)現(xiàn)有的請(qǐng)求沒(méi)有用aiohttp,以及為什么解碼失敗會(huì)重試用取歷史的方式請(qǐng)求回復(fù)了)
ValueError('輸入/輸出內(nèi)容違規(guī):xxx')
A:這不是故障,這是因?yàn)槲谋緦徍藱z出了風(fēng)險(xiǎn)文本就直接拋出一個(gè)異常防止繼續(xù)執(zhí)行了,不影響其他彈幕。你也不想你的AI導(dǎo)致你的直播間被有心之人爆掉吧,如果不想的話(huà)就乖乖去用文本審核,到時(shí)候也好解釋。
彈幕朗讀延遲太高
A:一分鐘到兩分鐘以?xún)?nèi)正常,AI生成回復(fù)就要差不多10-30秒,再去TTS也要個(gè)10-30秒,加上下載什么的一分鐘左右是正常的。這個(gè)還真沒(méi)有什么好方法,除非你自己GPU部署TTS可以省個(gè)十幾秒。如果TTS時(shí)間遠(yuǎn)高于生成AI回復(fù)的時(shí)間說(shuō)明你這個(gè)tts api用的人太多有可能進(jìn)入排隊(duì)了,解決方法是fork一個(gè)自己用。
幾條彈幕語(yǔ)音疊到一起放或者放一半放新的了
A:已知問(wèn)題,解決方案應(yīng)該是開(kāi)線程什么的但是技術(shù)不行不會(huì)弄。一般我還真沒(méi)見(jiàn)到過(guò)能用這種腳本的主播彈幕量會(huì)達(dá)到幾條語(yǔ)音一起放,如果真出現(xiàn)了說(shuō)明你體量差不多了,自己去搞其他腳本吧。