AI弹幕姬使用文档(又名赛博跑路丸弹幕姬)

概述
此脚本通过使用character.ai生成回复来提供一个简易的语音弹幕姬功能,包含对输入和输出文本的安全审核,但是并不保证一定会过滤掉所有违规文本。
这个脚本主要是搞赛博跑路丸的(当然有一定泛用性就稍微发一下),毕竟他在群里也不说话装死人,不过如果你非要说你这个东西有伦理问题的话,这事跟他说过。

免责声明
不提供任何担保和技术支持。前几天想到就稍微搞了一下,没有实际直播测试,只是本地测试过。
不会编程,代码写的很烂,建议自己写。
由于此脚本使用AI技术,且直播属于商用,这将导致无法避免的伦理等问题。在此建议使用者仅使用已经获得授权的的形象。由于此脚本导致的任何问题,本人概不负责。
此脚本无除使用的依赖库的限制的任何附加限制,就是我写的部分你随便处置,你说这东西不是我写的是你写的都随便,当然如果说是你写的那么有问题别来找我。收到米了自己留着,被锤了自己受着,我是不管的。
预备工作
你要有一个character.ai的账号,这个自己拿邮箱注册就可以了
你的电脑有声音支持,或者至少有一个声音输出设备
如果你直连上不去character.ai或*.hf.space,你还额外需要一个代理
一些基本常识,包括可以接受命令行脚本和知道直播间房号是什么
开始使用与参数的额外说明
你应该已经得到了此脚本的可运行程序(actions里构建的是sample.exe.zip)或者原始脚本(git clone过来的),这里仅介绍可运行程序的使用,因为脚本也就是先装依赖再运行。运行时捕捉系统音频即可。你以前的弹幕姬怎么捕捉的这个就怎么捕捉。注意pyaudio需要C++编译器。脚本自带的参数帮助如下:
这里不知道为什么都显示为Optional arguments,但是token
和room
是必填的。外发版本有可能character_external_id
和voiceurl
也是必填(毕竟你们肯定不是奔着赛博跑路丸去的)。
character_external_id
这是character.ai中角色的外部ID,对于这个ID,可以通过聊天界面的地址栏char=xxxx
这个参数找到,如下图蓝色部分所示。

history_id
character.ai的会话历史,不填就是新会话,填了就是用旧会话,在上图黄色部分。目前必须与tgt联合使用才会使用已有会话,因为当时判断的时候是or,懒得改了,反正一般用不上。
tgt
角色的内部ID,除非你是要用会话历史才要填(小bug懒得修了),否则你大概率是没必要填这个东西的。这个东西在F12看网络请求能看到,比如抓历史会话详情的api的话在这里:

如果是初始化会话的话在participants
的username
里,就不细说了,看格式能看出来
appid
和appsec
这两个只在qqaudit=True
,也就是你出于任何原因想用小程序的文本审核的情况下才用,默认是腾讯云文本审核demo。这个小程序文本审核可能用不了,具体没有测试,我当时试审几十条就提示请求过多了,可能因为我的小程序不是发布态。
如下图,蓝色的是appid,黄色的是appsec。

proxy
系统代理地址,如果你可以直接连character.ai和*.hf.space的话不设,全局虚拟专用网模式未测试(我用的v2),其他的设成你的魔法代理地址,比如v2的地址在这里:

socks的写法没试过,http的代理写法就是http://localhost:10809
,这就具体无法提供对应帮助了,自己去看你软件帮助吧。
token
character.ai的token,这个在认证头里,还是F12随便抓几个请求。

voiceurl
TTS API的url地址。参考vits-uma-genshin-honkai
这个Hugging Face的space去部署,其实可以直接fork一个别人的再把你的模型放到model里稍微改下配置就行了,参考我这个fork,mzltest/vits-uma-genshin-honkai
的修改方式。注意如果你的说话人不叫group
或者没有中文
这个语音的话必须额外配置voiceargs,因为默认值就是我用的没考虑其他的。
room
直播间房号。不知道这是什么的你不符合使用条件。虽然他就在地址栏里也不配图说明了,否则一堆人就会去问其他的配置项怎么搞。
msg_str_format
希望如何念出弹幕。可以使用{uname}
弹幕发送者昵称,{msg}
弹幕内容,{resp}
AI回应这几个变量,比如说我觉得{uname}说的{msg}来讲应该{resp}
。即使你没用上AI回应也依然会去请求AI回应,这个也是小问题懒得修了。
gift_str_format
同上,只不过变量是{uname}
发送者昵称,{gift}
礼品名称和{num}
数量。未测试,没开直播间没办法试。
qqaudit
除非你要用QQ小程序的文本审核并且配置了appid和appsec否则就是false。
voiceargs
在发送TTS请求时除了文本以为需要的额外参数,比如说话者和语音以及音素什么的长度等。以空格分隔,比如中文 角色A 0.6 0.668 1.2
,这个你如果配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
使用自定义语音和自定义角色(再说一遍,外发版有可能没有默认角色和语音url,最好自己配好)
常见故障
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:你的网络环境有问题。配置的代理有误/没法直连也没配置代理/你代理挂掉了/你的代理实际连不上。
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
A:无法解析character.ai的回应。一般多试几次有可能会好,如果没好浏览器手动打开character.ai,如果出现等待室页面也正常(你浏览器都用不了我要是能用了我还会在这里写脚本吗),如果没有出现等待室页面且多次重试依然出现此问题说明被cloudflare拦截了。这个脚本考虑到性能和资源等原因没有采用无头浏览器的方式来绕过cloudflare,而是用的TLS指纹绕过(这就是为什么如果你看代码会发现有的请求没有用aiohttp,以及为什么解码失败会重试用取历史的方式请求回复了)
ValueError('输入/输出内容违规:xxx')
A:这不是故障,这是因为文本审核检出了风险文本就直接抛出一个异常防止继续执行了,不影响其他弹幕。你也不想你的AI导致你的直播间被有心之人爆掉吧,如果不想的话就乖乖去用文本审核,到时候也好解释。
弹幕朗读延迟太高
A:一分钟到两分钟以内正常,AI生成回复就要差不多10-30秒,再去TTS也要个10-30秒,加上下载什么的一分钟左右是正常的。这个还真没有什么好方法,除非你自己GPU部署TTS可以省个十几秒。如果TTS时间远高于生成AI回复的时间说明你这个tts api用的人太多有可能进入排队了,解决方法是fork一个自己用。
几条弹幕语音叠到一起放或者放一半放新的了
A:已知问题,解决方案应该是开线程什么的但是技术不行不会弄。一般我还真没见到过能用这种脚本的主播弹幕量会达到几条语音一起放,如果真出现了说明你体量差不多了,自己去搞其他脚本吧。