python b站自动评论_用语音识别+python自动发送弹幕,变成B站野生字幕君吧!

在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]

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 = "your sessdata" # 用户的sessdata,获取方法见下文

csrf = "your csrf" # 用户的csrf,获取方法见下文

bvid = "BVxxxxxxxxxx" # 视频的bv号

dm_color_pink = 16758465 # 弹幕的颜色,我用的骚粉色

dm_mode = 4 # 弹幕类型,字幕当然用底端弹幕

dm_font_size = 18 # 弹幕字号,有节操的字幕菌还是用小字号吧

# 设置验证

verify = Verify(sessdata=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,b站自动评论)