MAC版B站弹幕姬,如何朗读B站直播间弹幕?Python实现B站直播弹幕朗读


简单说一说

大家好,我是白歌。

前段时间在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

效果演示

源码说明

开源地址:

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上的普通用户,给他们提供一个低成本的弹幕朗读解决方案。

当然,如果有能力的大佬,可以基于我的代码和资料,去添加更多功能,大家可以一起讨论交流(博客首页有我的联系方式)。

开发参考资料:

异步知识

02 协程~1_哔哩哔哩_bilibili

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 - huihui486/bilibili-danmuji: B站直播弹幕姬,应用python+websocket和pyqt5,支持全平台。 支持修改窗口大小、透明度,弹幕大小、颜色、字体等。

[GitHub - FengLiuFeseliud/Python-biliLive: Python bilibili b站直播弹幕机框架 快速自定义一个弹幕聊天机器人](



声明:白歌的小站|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - MAC版B站弹幕姬,如何朗读B站直播间弹幕?Python实现B站直播弹幕朗读


Hello~,我是白歌,欢迎来到我的博客。