Python小技巧巧用SnowNLP将一段话一键生成srt字幕文件(后期结合moviepy可生成带字幕的视频)

文章目录

  • 前言
  • 一、SnowNLP是什么?
  • 二、SnowNLP使用方法
    • 1. 安装
    • 2. 官方示例
  • 三、借用SnowNLP制作srt字幕文件
  • 总结
    • 关联阅读
  • 附录

前言

最近在尝试moviepy制作视频,但是有时候需要制作字幕。一般视频剪辑软件都是手工添加字幕,这个很费时费力。

虽然某音等可以自动识别语音添加字幕,但宝宝要使用moviepy制作视频,都已经有文字了,还需要再语音识别么?这就有点脱裤子放屁了。

那有没有一种简便的方法呢?比如我给一段话就可以自动生成字幕。如何可以一键生成字幕文件?

但皇天不负苦心人,还真让我搞出来了。

要做字幕,首先就得处理文章断句。这个搞不定,后面都弄不成。但现在大部分的自然语言处理库基本都是针对英文的,那需要处理中文,怎么办呢?这里给大家推荐一个方便处理中文的类库SnowNLP。通过这个库进行断句,再加上合适的方法,就可以生成srt字幕文件了。

一、SnowNLP是什么?

SnowNLP是一个可以方便的处理中文文本内容的python类库,据作者介绍,是受到了TextBlob的启发而写的,和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。

SnowNLP主要功能包括分词、词性标注、情感分析、汉字转拼音、繁体转简体、关键词提取以及文本摘要等等。

二、SnowNLP使用方法

1. 安装

pip install snownlp -i https://pypi.tuna.tsinghua.edu.cn/simple

2. 官方示例

官方已经举例了一些使用方法,这里罗列以下,引文本文重点不在这里。

from snownlp import SnowNLP

s = SnowNLP(u'这个东西真心很赞')

s.words         # [u'这个', u'东西', u'真心',
                #  u'很', u'赞']

s.tags          # [(u'这个', u'r'), (u'东西', u'n'),
                #  (u'真心', u'd'), (u'很', u'd'),
                #  (u'赞', u'Vg')]

s.sentiments    # 0.9769663402895832 positive的概率

s.pinyin        # [u'zhe', u'ge', u'dong', u'xi',
                #  u'zhen', u'xin', u'hen', u'zan']

s = SnowNLP(u'「繁體字」「繁體中文」的叫法在臺灣亦很常見。')

s.han           # u'「繁体字」「繁体中文」的叫法
                # 在台湾亦很常见。'

text = u'''
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系,但又有重要的区别。
自然语言处理并不是一般地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,
特别是其中的软件系统。因而它是计算机科学的一部分。
'''

s = SnowNLP(text)

s.keywords(3)	# [u'语言', u'自然', u'计算机']

s.summary(3)	# [u'因而它是计算机科学的一部分',
                #  u'自然语言处理是一门融语言学、计算机科学、
				#	 数学于一体的科学',
				#  u'自然语言处理是计算机科学领域与人工智能
				#	 领域中的一个重要方向']
s.sentences

s = SnowNLP([[u'这篇', u'文章'],
             [u'那篇', u'论文'],
             [u'这个']])
s.tf
s.idf
s.sim([u'文章'])# [0.3756070762985226, 0, 0]

这些都不是重点,重点是s.sentences这个用法。

三、借用SnowNLP制作srt字幕文件

在给视频添加字幕,我们需要srt字幕文件(有点像MP3的lrc歌词文件)。格式就是序号、时间、内容。格式虽然很简单,但是要让程序字段断句可不好弄。而且文章一般还有标点符号,字幕一般还不能太长,太长了一屏显示不下也不好。

如何可以自动断句,去掉标点符号,还得控制字幕在15个字符,还得根据15个字幕的速度控制好显示的时间。哦,想想都头大。

不过,经过多个日夜的反复调试,目前终于可以实现如上功能,给定一段文字,用程序自动生成字幕文件。且各种节奏都已处理好。

代码如下(代码不易,此处应该有掌声,或者文尾点个赞):

def gen_srt(text,srt_path):
    import re
    from snownlp import SnowNLP
    # popboy:将文本分成多个句子
    sentences = []
    t = SnowNLP(text)
    for sen in t.sentences:
        # print(sen + "
")
        sentences.append(sen)

    # 逐句进行再判断,如果大于15个字符则再进行分割。
    captions = []
    delimiter_set = {'。', '#', '?', '?', '$', ':', ':'} 
    for sen in sentences:
        if len(sen)>15:
            sub_sen = re.split(r'[{char_set}]'.format(char_set=delimiter_set), sen)
            for i in sub_sen:
                captions.append(i)
        else:
            captions.append(sen)

    # 计算每个句子的持续时间
    end_time = 0
    srt = ''
    for i, sentence in enumerate(captions):
        start_time = end_time + 0
        start_time_str = "{:02d}:{:02d}:{:02d},{}".format(int(start_time // 3600), int((start_time % 3600) // 60), int(start_time % 60), "000")
        duration = len(sentence) * 0.225
        end_time = start_time + duration
        end_time_str = "{:02d}:{:02d}:{:02d},{}".format(int(end_time // 3600), int((end_time % 3600) // 60), int(end_time % 60), "000")
        srt += "{}
{} --> {}
{}

".format(i+1, start_time_str, end_time_str, sentence)

    # 保存srt文件
    with open(srt_path, 'w', encoding='utf-8') as f:
        f.write(srt)
    print(f'字幕srt文件已保存到{srt_path}')

if __name__ == "__main__": 
    text = '''
    在上面的代码中,我们首先指定要打开的文本文件的路径。然后,我们创建了一个简单的窗口布局,其中包含一个文本框元素用于显示文件内容。接下来,我们打开文本文件并读取其内容。
    '''
    srt_path = r'c:captions.srt'
    gen_srt(text,srt_path)


经过调试,最终生成的字幕文件如下:

1
00:00:00,000 --> 00:00:01,000
在上面的代码中

2
00:00:01,000 --> 00:00:05,000
我们首先指定要打开的文本文件的路径

3
00:00:05,000 --> 00:00:05,000
然后

4
00:00:05,000 --> 00:00:09,000
我们创建了一个简单的窗口布局

5
00:00:09,000 --> 00:00:13,000
其中包含一个文本框元素用于显示文件内容

6
00:00:13,000 --> 00:00:13,000
接下来

7
00:00:13,000 --> 00:00:17,000
我们打开文本文件并读取其内容


如上的srt就成为moviepy可以使用的字幕文件了。

总结

今天就先写到这里,这个主要是介绍如何生成字幕文件,后续再考虑如何添加字幕文件给视频。

另外,moviepy在读取srt文件时经常报错,博主已经替大家扫除了障碍,详见:

关联阅读

moviepy读取字幕srt文件报错‘gbk‘ codec can‘t decode的解决办法(修改subtitles.py中SubtitlesClip类完美解决)

博主自己调测,费了好大劲才完成的代码,贡献出来,如果帮到大家不妨点个赞再复制使用!

附录

(base) C:UsersAdministrator>pip install snownlp -i https://pypi.tuna.tsinghua.edu.cn/simple
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting snownlp
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/3d/b3/37567686662100d3bce62d3b0f2adec18ab4b9ff2b61abd7a61c39343c1d/snownlp-0.12.3.tar.gz (37.6 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 37.6/37.6 MB 22.6 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: snownlp
  Building wheel for snownlp (setup.py) ... done
  Created wheel for snownlp: filename=snownlp-0.12.3-py3-none-any.whl size=37760953 sha256=7d043a27ee980f427133a879dd55ceb3647cb54b8713d358b865b31f7cb25253
  Stored in directory: c:usersadministratorappdatalocalpipcachewheels867d1d8f369105b5ef43f33d885ba1fd289d47c57014b391a6708131
Successfully built snownlp
Installing collected packages: snownlp
Successfully installed snownlp-0.12.3

(base) C:UsersAdministrator>