Python巧用SnowNLP實(shí)現(xiàn)生成srt字幕文件
前言
最近在嘗試moviepy制作視頻,但是有時(shí)候需要制作字幕。一般視頻剪輯軟件都是手工添加字幕,這個(gè)很費(fèi)時(shí)費(fèi)力。
雖然某音等可以自動(dòng)識(shí)別語(yǔ)音添加字幕,但寶寶要使用moviepy制作視頻,都已經(jīng)有文字了,還需要再語(yǔ)音識(shí)別么?這就有點(diǎn)脫褲子放屁了。
那有沒(méi)有一種簡(jiǎn)便的方法呢?比如我給一段話就可以自動(dòng)生成字幕。如何可以一鍵生成字幕文件?
但皇天不負(fù)苦心人,還真讓我搞出來(lái)了。
要做字幕,首先就得處理文章斷句。這個(gè)搞不定,后面都弄不成。但現(xiàn)在大部分的自然語(yǔ)言處理庫(kù)基本都是針對(duì)英文的,那需要處理中文,怎么辦呢?這里給大家推薦一個(gè)方便處理中文的類庫(kù)SnowNLP。通過(guò)這個(gè)庫(kù)進(jìn)行斷句,再加上合適的方法,就可以生成srt字幕文件了。
一、SnowNLP是什么
SnowNLP是一個(gè)可以方便的處理中文文本內(nèi)容的python類庫(kù),據(jù)作者介紹,是受到了TextBlob的啟發(fā)而寫的,和TextBlob不同的是,這里沒(méi)有用NLTK,所有的算法都是自己實(shí)現(xiàn)的,并且自帶了一些訓(xùn)練好的字典。
SnowNLP主要功能包括分詞、詞性標(biāo)注、情感分析、漢字轉(zhuǎn)拼音、繁體轉(zhuǎn)簡(jiǎn)體、關(guān)鍵詞提取以及文本摘要等等。
二、SnowNLP使用方法
1. 安裝
pip install snownlp -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 官方示例
官方已經(jīng)舉例了一些使用方法,這里羅列以下,引文本文重點(diǎn)不在這里。
from snownlp import SnowNLP
s = SnowNLP(u'這個(gè)東西真心很贊')
s.words # [u'這個(gè)', u'東西', u'真心',
# u'很', u'贊']
s.tags # [(u'這個(gè)', 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'「繁體字」「繁體中文」的叫法在臺(tái)灣亦很常見(jiàn)。')
s.han # u'「繁體字」「繁體中文」的叫法
# 在臺(tái)灣亦很常見(jiàn)。'
text = u'''
自然語(yǔ)言處理是計(jì)算機(jī)科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個(gè)重要方向。
它研究能實(shí)現(xiàn)人與計(jì)算機(jī)之間用自然語(yǔ)言進(jìn)行有效通信的各種理論和方法。
自然語(yǔ)言處理是一門融語(yǔ)言學(xué)、計(jì)算機(jī)科學(xué)、數(shù)學(xué)于一體的科學(xué)。
因此,這一領(lǐng)域的研究將涉及自然語(yǔ)言,即人們?nèi)粘J褂玫恼Z(yǔ)言,
所以它與語(yǔ)言學(xué)的研究有著密切的聯(lián)系,但又有重要的區(qū)別。
自然語(yǔ)言處理并不是一般地研究自然語(yǔ)言,
而在于研制能有效地實(shí)現(xiàn)自然語(yǔ)言通信的計(jì)算機(jī)系統(tǒng),
特別是其中的軟件系統(tǒng)。因而它是計(jì)算機(jī)科學(xué)的一部分。
'''
s = SnowNLP(text)
s.keywords(3) # [u'語(yǔ)言', u'自然', u'計(jì)算機(jī)']
s.summary(3) # [u'因而它是計(jì)算機(jī)科學(xué)的一部分',
# u'自然語(yǔ)言處理是一門融語(yǔ)言學(xué)、計(jì)算機(jī)科學(xué)、
# 數(shù)學(xué)于一體的科學(xué)',
# u'自然語(yǔ)言處理是計(jì)算機(jī)科學(xué)領(lǐng)域與人工智能
# 領(lǐng)域中的一個(gè)重要方向']
s.sentences
s = SnowNLP([[u'這篇', u'文章'],
[u'那篇', u'論文'],
[u'這個(gè)']])
s.tf
s.idf
s.sim([u'文章'])# [0.3756070762985226, 0, 0]
這些都不是重點(diǎn),重點(diǎn)是s.sentences這個(gè)用法。
三、借用SnowNLP制作srt字幕文件
在給視頻添加字幕,我們需要srt字幕文件(有點(diǎn)像MP3的lrc歌詞文件)。格式就是序號(hào)、時(shí)間、內(nèi)容。格式雖然很簡(jiǎn)單,但是要讓程序字段斷句可不好弄。而且文章一般還有標(biāo)點(diǎn)符號(hào),字幕一般還不能太長(zhǎng),太長(zhǎng)了一屏顯示不下也不好。
如何可以自動(dòng)斷句,去掉標(biāo)點(diǎn)符號(hào),還得控制字幕在15個(gè)字符,還得根據(jù)15個(gè)字幕的速度控制好顯示的時(shí)間。哦,想想都頭大。
不過(guò),經(jīng)過(guò)多個(gè)日夜的反復(fù)調(diào)試,目前終于可以實(shí)現(xiàn)如上功能,給定一段文字,用程序自動(dòng)生成字幕文件。且各種節(jié)奏都已處理好。
代碼如下
def gen_srt(text,srt_path):
import re
from snownlp import SnowNLP
# popboy:將文本分成多個(gè)句子
sentences = []
t = SnowNLP(text)
for sen in t.sentences:
# print(sen + "\n")
sentences.append(sen)
# 逐句進(jìn)行再判斷,如果大于15個(gè)字符則再進(jìn)行分割。
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)
# 計(jì)算每個(gè)句子的持續(xù)時(shí)間
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 = '''
在上面的代碼中,我們首先指定要打開(kāi)的文本文件的路徑。然后,我們創(chuàng)建了一個(gè)簡(jiǎn)單的窗口布局,其中包含一個(gè)文本框元素用于顯示文件內(nèi)容。接下來(lái),我們打開(kāi)文本文件并讀取其內(nèi)容。
'''
srt_path = r'c:\captions.srt'
gen_srt(text,srt_path)經(jīng)過(guò)調(diào)試,最終生成的字幕文件如下:
1
00:00:00,000 --> 00:00:01,000
在上面的代碼中
2
00:00:01,000 --> 00:00:05,000
我們首先指定要打開(kāi)的文本文件的路徑
3
00:00:05,000 --> 00:00:05,000
然后
4
00:00:05,000 --> 00:00:09,000
我們創(chuàng)建了一個(gè)簡(jiǎn)單的窗口布局
5
00:00:09,000 --> 00:00:13,000
其中包含一個(gè)文本框元素用于顯示文件內(nèi)容
6
00:00:13,000 --> 00:00:13,000
接下來(lái)
7
00:00:13,000 --> 00:00:17,000
我們打開(kāi)文本文件并讀取其內(nèi)容
如上的srt就成為moviepy可以使用的字幕文件了。
總結(jié)
今天就先寫到這里,這個(gè)主要是介紹如何生成字幕文件,后續(xù)再考慮如何添加字幕文件給視頻。
另外,moviepy在讀取srt文件時(shí)經(jīng)常報(bào)錯(cuò),博主已經(jīng)替大家掃除了障礙,詳見(jiàn):
關(guān)聯(lián)閱讀
moviepy讀取字幕srt文件報(bào)錯(cuò)‘gbk‘ codec can‘t decode的解決辦法(修改subtitles.py中SubtitlesClip類完美解決)
博主自己調(diào)測(cè),費(fèi)了好大勁才完成的代碼,貢獻(xiàn)出來(lái),如果幫到大家不妨點(diǎn)個(gè)贊再?gòu)?fù)制使用!
附錄
(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>
到此這篇關(guān)于Python巧用SnowNLP實(shí)現(xiàn)生成srt字幕文件的文章就介紹到這了,更多相關(guān)Python SnowNLP生成srt字幕內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3實(shí)現(xiàn)短網(wǎng)址和數(shù)字相互轉(zhuǎn)換的方法
這篇文章主要介紹了python3實(shí)現(xiàn)短網(wǎng)址和數(shù)字相互轉(zhuǎn)換的方法,涉及Python操作字符串的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
合并百度影音的離線數(shù)據(jù)( with python 2.3)
這篇文章主要介紹了合并百度影音的離線數(shù)據(jù)( with python 2.3)的相關(guān)資料2015-08-08
Python 開(kāi)發(fā)工具通過(guò) agent 代理使用的方法
這篇文章主要介紹了Python 開(kāi)發(fā)工具通過(guò) agent 代理使用的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Python實(shí)現(xiàn)DDos攻擊實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)DDos攻擊的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
python實(shí)現(xiàn)讀取圖像文件并獲取到像素?cái)?shù)組的4種方法詳解
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)讀取圖像文件并獲取到像素?cái)?shù)組的4種方法并進(jìn)行對(duì)比,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-03-03
執(zhí)行Python程序時(shí)模塊報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了執(zhí)行Python程序時(shí)模塊報(bào)錯(cuò)問(wèn)題及解決方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

