简单说一说
大家好,我是白歌。
前段时间在B站直播打原神,因为我用的是MAC电脑,但B站并没有MAC版的客户端,所以只能走传统的OBS串流直播的方法,但在直播的时候,要专注游戏画面,可能无法兼顾去看弹幕,所以,弹幕朗读对我就特别重要了。
我查了一大堆教程资料,发现win上面官方的就有,而MAC端并没有相关软件,甚至单纯的弹幕显示工具也很稀少,以前的一些弹幕工具作者已经不在维护,而其他是是基于网页应用,需要配置docker的镜像服务,这对于新手来说太过麻烦。
所以,我萌生了自己写一个的冲动,经过简单的设计和开发(ctrl +c 和ctrl +v)我写出了一个很简陋的弹幕朗读软件,并尝试在直播中使用,发现效果还是不错的,已经满足了我基础的需求。
但因为我的编程只是业余水平,而且,日常业余时间有限,无法做到短时间迭代出使用体验更丰富的软件,所以,目前的依然是够用就行,没有展开更多功能的开发。
不过,因为mac的用户有很多都和视频行业相关,作为内容生产者,有时候在B站直播的时候可能真的需要这种工具,毕竟,我当时在网上查的资料,都是win的,没有找到一个能在MAC可以用的,不得已只能自己动手去写。
然而并不是所有人有编程能力,所以我决定出这个教程,并降低这个工具的使用门槛,帮助其他使用MAC的普通人在B站直播的时候,实现弹幕朗读功能。
同时,我会把软件开源,并简单分享一下我的开发思路和相关功能优先级的思考,也算起个抛转引玉的作用。如果有那位大佬刚好有时间,并且愿意迭代升级,可以简单看一下我的思路和已有的东西,节省自己查资料的时间。
安装使用
使用说明
为了方便不懂编程的人,免去他们安装Python环境和拓展库的麻烦,我把程序打包了一下,不需要安装Python环境,直接双击即可运行,输入房间ID,即可读取显示并朗读弹幕。房间的ID号为直播网址后面的那串数字。
我这里分别在M1的Mac和黑苹果的Mac上分别进行打包,M1的版本只能在M1芯片的Mac上运行,Intel版本的可以兼容M1,你们根据自己的电脑来选择使用即可。
如果程序依然报错,无法正常使用,可以尝试源码运行,(需要懂Python的环境配置。)
下载地址:
https://pan.baidu.com/s/1awY66aixwiS1rLwda06H4Q?pwd=xcfr
效果演示
常见错误解决
无法运行,提示未能打开文稿“Blive_danmu_mac(M1)”。文本编码Unicode (UTF-8)不适用。
这个是因为苹果默认把程序当做文本文件,文件没有图标,解决办法是终端执行命令,把文件转换为可执行文件运行。
chmod +x /这里是你的电脑/程序文件的绝对路径/如果不知道/可以把文件直接拖拽到终端/Blive_danmu_mac(M1)
考虑到有人不知道什么是终端执行命令,chmod +x
这是什么,怎么弄?这里截个图吧,简单来说,就是打开一个叫终端的软件,然后输入命令。如果还是不清楚,百度一下,有更详细的说明,这个不难。
然后看到程序有了图标,文件类型也变成了unix可执行文件,这时候双击打开,或者用终端运行即可。注意终端运行可执行文件,需要在文件名前加./可执行文件名字
。
其他常见错误见视频评论区,大部分都有解决办法。
- 因为每个人电脑环境不一样,遇到的问题千奇百怪,可以看看评论区参考其他网友的解决办法,大部分都能解决。
- 或者可以直接问ChatGPT来解决,访问不了的,可以用国内的文心一言,通义千问,字节豆包等替代。
- 弹幕延迟高可以适当的调整
time.sleep(45)
参数,但不建议调太快,容易给服务器造成压力,被封禁IP。
源码说明
开源地址:
Psinary/blive_danmu_speak_mac: MAC版B站弹幕姬,朗读B站直播间弹幕,B站直播弹幕朗读,bilibili (github.com)
以下是程序的源码,可以直接copy拿去运行。
import time
import requests
import os
from retrying import retry
class bilibiliDanmu():
def __init__(self):
self.url = "https://api.live.bilibili.com/ajax/msg"
self.headers={
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"Referer": "https://live.bilibili.com/",
}
self.data = {
"roomid":romid,
"csrf_token":"",
"csrf":"",
"visit_id":""
}
def speak_text(self,text):
text_cmd = "say " + text
os.system(text_cmd)
# print("\n")
def text_danmu(self,html):
global old_list
temp_list = []
for text in html["data"]["room"]:
danmu_string=text["nickname"] +"说:"+ text["text"]
temp_list.append(danmu_string)
#print(danmu_string)
if temp_list == old_list:
pass
else:
# print ("First list length : %d" %len(temp_list))
for text_number in range (1,11):
if "".join(temp_list[:text_number]) in "".join(old_list):
pass
else:
try:
print (temp_list[text_number-1])
except:
pass
else:
self.speak_text(temp_list[text_number-1])
old_list = temp_list[:]
@retry(stop_max_attempt_number=5)
def get_danmu(self):
html = requests.post(url=self.url,headers=self.headers,data=self.data)
self.text_danmu(html.json())
if __name__ == '__main__':
old_list=[]
print("\n名称:B站弹幕姬MAC版\n"
"描述:可以朗读B站直播间弹幕的Python软件,已开源,具体使用说明和源码见白歌BESING的博客(baigebg.com)\n"
"作者:白歌BESING (公众号和博客同名,搜一下即可找到)\n")
romid = input("请输入房间id:")
bzhan = bilibiliDanmu()
while True:
bzhan.get_danmu()
time.sleep(45)
代码还是比较简单的,只用requests和retrying两个第三方拓展库,安装完Python后,配好环境变量,pip3 install requests retrying 安装第三方的包后,即可直接运行。
PS:使用源码运行的话,如果嫌打开命令窗口都麻烦,可以在代码开头,声明编码和Python解释器的位置,然后把py文件改为command文件,双击代码文件就可以直接运行。
开源和后续开发
更加傻瓜化:
其实对小白用户来说,更傻瓜化的方式是写一个界面,但考虑到开发的时间成本,以及mac上的适配和测试,这里暂时搁置,优先实现功能,之后如果人数多了会考虑写个有界面的程序。
勇于砍功能
为了工具方便普通人使用,同时减低开发成本,只选择核心必要的功能进行使用体验的优化,比如,如果下一步使用的人多,可以考虑加个简单的图形界面,方便普通人,虽然我自己觉得命令行使用挺省事的,但其他人不一定习惯。
语音朗读声音自定义
软件的朗读功能是使用的mac系统自带的say命令,如果迁移其他系统,可以考虑使用API,或者其他平台自己的TTS接口。
另外,如果你觉得声音不那么喜欢,其实可以使用那些,声音更好听的声音库,比如微软的那些API,原神训练出来的那个语音模型,或者搜狗百度之类的接口,这种网上很多,有能力的可以考虑自己添加,也就写几个函数的事儿。
实时朗读和欢迎语
目前程序使用的是传统的爬虫思路,读取历史弹幕进行朗读,有一定延迟,大概十几秒,不过,经过我十几场直播下来,一般使用确实够。(除非你直播间人数和弹幕非常爆炸,弹幕姬都读不过来)
如果你们想进一步更新功能,需要实时获取弹幕,同时要自动朗读欢迎语这些,会用到一些新技术,需要基于websocket协议来抓取弹幕,保持通信心跳,同时异步处理。
实时获取弹幕方面,我自己尝试写了一个demo,但不怎么稳定,程序就不放出来了,不过涉及的技术也不难,编程新手基本也能写,这方面的参考资料我会在后面放出,感兴趣的大佬可以自行研究迭代,如果你们有更好的更新,记得通知我(博客首页有我的联系方式)。
另外说几句:
对我来说,win上官方的弹幕姬功能已经很齐全了,个人习惯或者想要体验自定义的功能,比如想要更好听的声音来读弹幕,弹幕显示样式好不好看等等,基本都需要自定义开发。
之所以发文分享这个,主要是针对MAC上的普通用户,给他们提供一个低成本的弹幕朗读解决方案。
当然,如果有能力的大佬,可以基于我的代码和资料,去添加更多功能,大家可以一起讨论交流(博客首页有我的联系方式)。
开发参考资料:
异步知识
websocket协议
(16条消息) AioWebSocket实现python异步接收B站直播弹幕_python websockets 异步_Sharp486的博客-CSDN博客
基于Python的AioWebSocket实现实时异步接收B站直播间弹幕以及各种信息 (ngui.cc)
其他参考。
【python+pyqt5】B站直播弹幕姬(无需登录,任意房间)_哔哩哔哩_bilibili
WebSocket接口应用场景和测试方法_哔哩哔哩_bilibili
模仿UP主,用Python实现一个弹幕控制的直播间! (bbsmax.com)
bilibili-danmuji/getWebsocket.py at master · huihui486/bilibili-danmuji · GitHub
GitHub - yulinfeng000/blive: 简单的B站直播弹幕websocket监听处理框架
https://github.com/shuishen49/bilibilidanmu
客户端的交互方式。
Bilibili-Live-API/API.WebSocket.md at master · lovelyyoshino/Bilibili-Live-API · GitHub
GitHub - lovelyyoshino/Bilibili-Live-API: BILIBILI 直播/番剧 API
GitHub - GoldrenEggs/Bilibili-Live-Message: 爬取bilibili直播间接收到的几乎全部消息,并易于使用自定义的方法处理消息。
GitHub - TLittlePrince/openBlivePythonDemo: BiliBili直播开放平台Python Demo
GitHub - GoldrenEggs/Bilibili-Live-Message: 爬取bilibili直播间接收到的几乎全部消息,并易于使用自定义的方法处理消息。
GitHub - yulinfeng000/blive: 简单的B站直播弹幕websocket监听处理框架
blive/PROTOCOL.md at main · yulinfeng000/blive · GitHub
GitHub - MOCABEROS-TEAM/MocaBliveAPI: 监听哔哩哔哩的直播,通过websocket和JSON,向前端app提供,弹幕,礼物,舰队,醒目留言等信息。
[GitHub - FengLiuFeseliud/Python-biliLive: Python bilibili b站直播弹幕机框架 快速自定义一个弹幕聊天机器人](
点个赞