欢迎光临散文网 会员登陆 & 注册

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

2020-05-11 10:19 作者:HeapsortYi  | 我要投稿

    在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文件,文件的格式如下:

发送弹幕我们其实只需要开始时间,那么我们把开始时间转换为为单位的float类型。处理完成后返回一个元素为(dm_time, dm_text)的list。

Ok,talk is cheap,直接show the code吧:(B站的编辑器不支持代码块,标红的就是代码,这个渣排版我也是吐了)

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猫夏小卡 加上野生字幕的效果展示(悄悄安利这个可爱的汉服小姐姐(✿◡‿◡)~):

B站现在已经支持了投稿外挂字幕的功能,如果up主开放了此功能,直接投稿外挂字幕要比野生字幕的效果更好。另外,如果想给BGM加上野生字幕,可以对.lrc歌词文件做格式处理,然后自动发送即可,就交给感兴趣的读者自己撸码吧:)~

希望大家愉快地享受成为一个野生字幕菌吧,以上。喜欢本文的朋友们请不吝点赞投币收藏哦,多谢啦~

Reference:

  1. 本文的知乎地址:https://zhuanlan.zhihu.com/p/138582775

  2. bilibili_api项目:https://github.com/Passkou/bilibili_api,作者的B站空间是:@Passkou


用语音识别+python自动发送弹幕,变成B站野生字幕君吧!的评论 (共 条)

分享到微博请遵守国家法律