在B站观看视频的时候,有时候一些带有旁白但没有字幕的视频,会有野生字幕君出现,贴心的为视频加上字幕,大大提高了视频观感。不过手工加字幕是一件很麻烦的事,需要人工卡时间和听译打字。当一个懒人程序媛想当一个野生字幕君的时候,就衍生出了这篇文章……本文将介绍如何通过语音识别+python请求自动发送B站弹幕。
1. 下载视频
下载B站视频的方法很多,比如这个B站、哔哩哔哩视频解析下载在线工具,或者chrome插件bilibili哔哩哔哩下载助手都可以。Anyway,能下载就行。
2. 将视频转换为音频
这步是为了后面语音识别时比较省时。同样,转换软件或者在线网站有很多,这里就不介绍了。Anyway,能转换就行。
3. 语音识别
这里推荐一个很好用的在线平台网易见外工作台,不仅免费,而且可以将音频转换为带时间轴的文字,正好符合我们的需求。网易见外工作台支持的项目也很多:
文章图片
选择新建项目-->语音转写-->填写项目名称、上传音频、选择语言、出稿类型选择字幕,然后提交就可以了。大约等待几分钟,就可以得到转换后的结果。
文章图片
这里以B站的演讲《后浪》为例,打开转换后的结果,可以看到内容和起始终止时间已经被识别出来了。但有些地方识别的并不准,我们可以点击下方播放音频,然后逐行对时间和内容进行一些编辑调整。最后点击导出,将下载一个.srt格式的文件。
文章图片
4. 使用python自动发送B站弹幕
4.1. B站发送弹幕的报文分析
我们随便在B站找一个视频发送弹幕,然后打开浏览器的开发者模式(快捷键:F12)进行抓包。报文的核心内容如下:
文章图片
文章图片
打码的地方是和用户个人信息有关的内容
可以看到,B站发送弹幕使用的是http post方法,数据格式为application/x-www-form-urlencoded。那么了解接口字段的含义就很重要,结合简单的理解+网上找的资料(感谢bilibili_api API列表这个项目对B站各个api字段的解释,这个项目后文也会用到),字段的含义如下:type:含义暂不明,可以默认为1
oid:分P视频的编号
msg:弹幕内容
bvid:视频的BV号
progress:弹幕在视频中出现的时间,单位是毫秒
color:弹幕的颜色,十进制。我这里用的是橘色,对应的十六进制颜色码是#FFAA02
fontsize:弹幕的大小。B站支持3种字号的弹幕,对应关系是:18为小、25为标准、36为大,其他值不接受
pool:是否是字幕弹幕,1是0否
mode:弹幕模式,对应关系是:1为滚动弹幕、5为顶端弹幕、4为底端弹幕,其他值不接受
rnd:发送弹幕的系统时间,是一个时间戳
plat:所用平台,1可能代表PC端,可以默认为1
csrf:用于防止跨域请求,与用户个人有关
基于以上的抓包分析,我们就可以用python的Requests库来构造请求发送弹幕了。但是,神说(虽然不知道是哪个神):Don't Reinvent The Wheel(不要重复发明轮子)。其实上文提到的bilibili_api 项目已经很好的封装了B站的很多功能,包括发弹幕(可惜的是作者精力不足不再维护这个项目了QAQ),因此我们还是直接借用他的轮子来搞自己的事情吧!
bilibili_api项目发送弹幕的函数是send_danmaku,它需要page(int类型)和danmaku(Danmaku类型)两个参数。page代表视频的分p,danmaku是一个Danmaku类型的弹幕变量。其中,Danmaku是项目封装的弹幕基础类,它的构造参数如下:
文章图片
Danmaku类的构造参数
可以看到,与报文参数不同的是,它的弹幕出现时间dm_time是一个浮点数,单位是秒。因此下面我们需要将弹幕内容和参数处理成接口要求的格式。
4.2. 处理srt文件的格式
打开下载的.srt文件,文件的格式如下:
0 // 序号00:00:06,420 --> 00:00:07,710 // 开始时间 --> 结束时间那些口口声声 // 内容// 空行1
00:00:09,480 --> 00:00:10,920
一代不如一代的人
2
00:00:12,870 --> 00:00:13,980
应该看着你们
……
发送弹幕我们其实只需要开始时间,那么我们把开始时间转换为秒为单位的float类型。处理完成后返回一个元素为(dm_time, dm_text)的list。
Ok,talk is cheap,直接show the code吧:
def process_srt_file():
srt_file_path = "path_to_your_srt_file"
danmaku_list = []
dm_time, dm_text = None, None
i = 0
for line in open(srt_file_path, "r", encoding="utf-8"):
line = line.strip()
if i % 4 == 1:
# 处理时间
start_time = line.split("-->")[0]
【python|python b站自动评论_用语音识别+python自动发送弹幕,变成B站野生字幕君吧!】other_time, millisecond = start_time.split(",")
hour, minute, second = other_time.split(":")
dm_time = int(hour) * 3600 + int(minute) * 60 + int(second) + int(millisecond) / 1000
elif i % 4 == 2:
# 处理弹幕内容
dm_text = line
danmaku_list.append((dm_time, dm_text))
i += 1
return danmaku_list
4.3. 愉快的自动发送弹幕
先安装bilibili_api包:
pip install bilibili_api
然后也直接上代码吧:
from bilibili_api import video, Verify
from bilibili_api.video import Danmaku
import time
def auto_send_danmaku():
danmaku_list = process_srt_file()
sessdata = "https://www.it610.com/article/your sessdata" # 用户的sessdata,获取方法见下文
csrf = "your csrf" # 用户的csrf,获取方法见下文
bvid = "BVxxxxxxxxxx" # 视频的bv号
dm_color_pink = 16758465 # 弹幕的颜色,我用的骚粉色
dm_mode = 4 # 弹幕类型,字幕当然用底端弹幕
dm_font_size = 18 # 弹幕字号,有节操的字幕菌还是用小字号吧
# 设置验证
verify = Verify(sessdata=https://www.it610.com/article/sessdata, csrf=csrf)
# 初始化VideoOperator类
my_video_operator = video.VideoOperate(bvid=bvid, verify=verify)
for danmaku_content in danmaku_list:
dm_time, dm_text = danmaku_content
dm_text = "? " + dm_text + " ?" # 两边加个小花花(你也可以不加)
# 实例化一个弹幕类
danmaku = Danmaku(text=dm_text, dm_time=dm_time, color=dm_color_pink, mode=dm_mode, font_size=dm_font_size,
is_sub=False)
# 发送弹幕
result = my_video_operator.send_danmaku(0, danmaku)
print(result)
print("发送成功:", danmaku.dm_time, danmaku.text)
print("休眠15s中……")
time.sleep(15) # 发送弹幕频率过快会被服务器禁止发送弹幕
* 其中,sessdata和csrf的获取方法请直接参考项目作者的文章。
注意:B站现在设定的发送弹幕间隔时间至少为5s,但在实操中发现即使间隔10-15s,连续发弹幕仍有可能被暂停发送一段时间。因此大家可以根据程序执行情况删掉srt文件中已经发送成功的部分,等待一段时间重启程序即可。
5. 效果展示
下面是我用以上过程给视频“来到这个世界的第二十三年”-by猫夏小卡 加上野生字幕的效果展示(悄悄安利这个可爱的汉服小姐姐(????)~):
文章图片
自动发送弹幕效果展示https://www.zhihu.com/video/1242959567543652352
B站现在已经支持了投稿外挂字幕的功能,如果up主开放了此功能,直接投稿外挂字幕要比野生字幕的效果更好。另外,如果想给BGM加上野生字幕,可以对.lrc歌词文件做格式处理,然后自动发送即可,就交给感兴趣的读者自己撸码吧:)~
希望大家愉快地享受成为一个野生字幕菌吧,以上。喜欢本文的朋友们请不吝点个赞和喜欢哦,多谢啦~
Reference:
推荐阅读
- python|手把手教你使用Python获取B站视频并在本地实现弹幕播放功能
- python|【Python基础教程】类的定义和使用
- 抖音方案|抖音直播监控-循环值守24小时-直播弹幕
- python|python写一个简单的爬虫程序(爬取快手)(附源码)
- python基础知识|【实现用户注册,登录和登出】但是用 Flask + MySQL(python)
- pycharm|最新版pycharm-2022.1中换源按钮manage repositories更改位置
- python|PyCharm 2021.1最新版现已发布|附下载
- pycharm2022.1版本更换pip镜像源
- python|python license 过期_pycharm2020.2专业版永久激活(已失效)