Python巧用SnowNLP实现生成srt字幕文件

 更新时间:2024年01月23日 09:06:25   作者:IT里的交易员  
SnowNLP是一个可以方便的处理中文文本内容的python类库,本文主要为大家详细介绍了Python如何巧用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 + "\n")
        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 += "{}\n{} --> {}\n{}\n\n".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:\Users\Administrator>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:\users\administrator\appdata\local\pip\cache\wheels\86\7d\1d\8f369105b5ef43f33d885ba1fd289d47c57014b391a6708131
Successfully built snownlp
Installing collected packages: snownlp
Successfully installed snownlp-0.12.3

(base) C:\Users\Administrator>

到此这篇关于Python巧用SnowNLP实现生成srt字幕文件的文章就介绍到这了,更多相关Python SnowNLP生成srt字幕内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中的Pillow常用功能详解

    python中的Pillow常用功能详解

    Pillow是一个强大的图像处理库,支持多种图像操作,如打开、保存、裁剪、调整大小、旋转、翻转、过滤、合成、添加文字、调整模式和创建缩略图,本文介绍python中的Pillow常用功能,感兴趣的朋友一起看看
    2025-02-02
  • Python如何判断字符串是否仅包含数字

    Python如何判断字符串是否仅包含数字

    在用Python进行数据处理的时候,经常会遇到DataFrame中的某一列本应该是数值类型,但由于数据不规范导致在字段中夹杂了非数值类型,本文就介绍了Python如何判断字符串是否仅包含数字,感兴趣的可以了解一下
    2022-03-03
  • python OpenCV学习笔记实现二维直方图

    python OpenCV学习笔记实现二维直方图

    本篇文章主要介绍了python OpenCV学习笔记实现二维直方图,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Python实现冒泡,插入,选择排序简单实例

    Python实现冒泡,插入,选择排序简单实例

    这篇文章主要介绍了Python实现冒泡,插入,选择排序简单实例,很适合Python初学者学习参考之用,需要的朋友可以参考下
    2014-08-08
  • python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题

    python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题

    这篇文章主要介绍了python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • python设计模式大全

    python设计模式大全

    这篇文章主要介绍了python设计模式,通过简单的代码实现了Python常见的各种设计模式,包括桥接模式、观测者模式、适配器模式、工厂模式、单例模式等,需要的朋友可以参考下
    2016-06-06
  • Python编程获取终端命令行参数示例

    Python编程获取终端命令行参数示例

    这篇文章主要为大家介绍了Python编程获取终端命令行参数示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • python频繁写入文件时提速的方法

    python频繁写入文件时提速的方法

    在本篇内容里小编给大家整理了关于python频繁写入文件时提速的方法以及相关代码,需要的朋友们学习下。
    2019-06-06
  • python统计mysql数据量变化并调用接口告警的示例代码

    python统计mysql数据量变化并调用接口告警的示例代码

    这篇文章主要介绍了python统计mysql数据量变化并调用接口告警的示例代码,帮助大家更好的利用python操作数据库,感兴趣的朋友可以了解下
    2020-09-09
  • 5行Python代码实现一键批量扣图

    5行Python代码实现一键批量扣图

    在日常生活或者工作中,经常会遇到想将某张照片中的人物抠出来,本文就介绍了Python代码实现一键批量扣图,感兴趣的可以了解一下
    2021-06-06

最新评论