20230812Python3を使用してWIN10でSRT形式の字幕をSSA形式に変換する2023
/8/12 20:58
この記事の SSA 形式は [Batch Subtitles Converter v1.23] の形式に基づいています!
1.
起源: インターネット上にあるさまざまな字幕変換ソフトウェア/ガジェットのどれも、私を完全に満足させるものではありません。
【細かい欠点は色々あります】
そこで、python3を使った実践編を自分で書いてみることにしました!
この記事の Python スクリプトは、UTF8 でエンコードされた SRT 形式の字幕のみを処理します。ANSI でエンコードされた SRT 形式については、この記事を参照して変更してください。
!!!!Batch Subtitles Converter v1.23 グリーン英語版: 必要な SSA 字幕の位置および色/フォント/サイズは変更/カスタマイズできません。
subresync.exe: UTF8 でエンコードされた字幕はサポートされていません。また、必要な SSA 字幕の位置と色/フォント/フォント サイズは変更/カスタマイズできません。
vobsub.dll
技術的なポイント:
Red.Eye.2005.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-FGT.cn9.srt は、
Google で SSA 形式に翻訳した後、「Imminent」の英語文字を中国語の SRT 形式の字幕に変換します。
txt の保存先パス+utf8_file.cn.srt
1
00:02:12,766 --> 00:02:16,099
タイラー ボブとマリアン タイラーは私と一緒です
2
00:02:16,100 --> 00:02:16,900
1 秒
txt の保存先パス+utf8_file.cn.ssa
[スクリプト情報]
; これは Sub Station Alpha v4 スクリプトです。
タイトル: path_to_save_txt+utf8_file.cn
ScriptType: v4.00
衝突: 通常
PlayDepth: 0
[V4 スタイル]
形式: 名前、フォント名、フォントサイズ、プライマリカラー、セカンダリカラー、ターシャリカラー、バックカラー、太字、斜体、ボーダースタイル、アウトライン、シャドウ、配置、マージン L、マージン R、マージン V、アルファレベル、エンコーディング スタイル: デフォルト、タホマ、25、&
H80ff00 ,&H00ffff,&H000008,&H000008,-1,0,1,2,0,6,80,80,80,0,134
[イベント]
形式:Marked、Start、End、Style、Name、MarginL、MarginR、MarginV、Effect、Text
ダイアログ:Marked=0,0:02:12.76,0:02:16.09,Default,NTP,0000,0000, 0000,!効果,タイラー ボブとマリアン テイラーが私と一緒ですダイアログ
: Marked=0,0:02:16.10,0:02:16.90,Default,NTP,0000,0000,0000,!Effect,1 秒
重要: SRT 形式のタイムラインを SSA 形式に変更するには、python3 の文字列処理/分割機能を使用する必要があります。
PYTHON SRTからSSAへの
Pythonタイムライン文字列分割
https://www.techiedelight.com/zh/split-string-with-delimiters-python/Python
で区切り文字を使用して文字列を分割する
Python で区切り文字を使用して文字列を分割する
Google 翻訳アイコン
この記事では、Python で区切り文字を使用して文字列を分割する方法について説明します。
1. re.split() 関数を使用する
パターンの出現によって文字列を分割する簡単な解決策は、組み込み関数 re.split() を使用することです。パターンは 1 つ以上の区切り文字で構成できます。
単一の区切り文字で分割
単一の区切り文字を使用して文字列を分割するには、その区切り文字を re.split() 関数に渡すだけです。
import re
if __name__ == '__main__':
s = 'Hello,World'
res = re.split(',', s) # カンマで分割
print(res) # ['Hello', 'World']
Microsoft Windows [バージョン 10.0.19045.2311]
(c) Microsoft Corporation. 無断転載を禁じます。
C:\Users\Administrator>python
Python 3.9.13 (tags/v3.9.13:6de2ca5、2022 年 5 月 17 日、16:36:42) [MSC v.1929 64 ビット (AMD64)] (win32 上) 「
help」、「」と入力します。詳細については、「著作権」、「クレジット」、または「ライセンス」を参照してください。
>>>
>>>
キーボード割り込み
>>> temp = '00:00:16,533 --> 00:00:18,366'
>>> インポート
>>> temp
'00:00:16,533 --> 00:00:18,366 '
>>> res = re.split(':', temp)
>>> print(res)
['00', '00', '16,533 --> 00', '00', '18,
>>> 解像度[4]
'18,366'
>>>
srt2ssa.py
# コーディング=utf-8
輸入再
#f2 = open(new_file, "w", エンコーディング="UTF-8")
f2 = オープン('test.ssa', "w", エンコーディング="UTF-8")
f2.write('[スクリプト情報]\n')
f2.write('; これは Sub Station Alpha v4 スクリプトです。\n')
f2.write('タイトル: 8月7日.cn\n')
f2 .write('ScriptType: v4.00\n')
f2.write('衝突: 通常\n')
f2.write('PlayDepth: 0\n')
f2.write('\n')
f2.write( '[V4 スタイル]\n')
f2.write('形式: 名前、フォント名、フォントサイズ、主カラー、二次カラー、三次カラー、バックカラー、太字、斜体、ボーダースタイル、アウトライン、シャドウ、配置、マージン L、マージン R、マージン V、アルファレベル、エンコーディング\n')
f2.write('スタイル: デフォルト,Tahoma,25,&H80ff00,&H00ffff,&H000008,&H000008,-1,0,1,2,0,6,80,80,80,0,134\n')
f2.write('\n')
f2.write('[イベント]\n')
f2.write('形式: マーク、開始、終了、スタイル、名前、MarginL、MarginR、MarginV、効果、テキスト\n')
#f2.write('ダイアログ: Marked=0,0:02:12.76,0:02:16.09,Default,NTP,0000,0000,0000,!Effect,タイラー ボブとマリアンヌ テイラーは私と一緒です\n')
#with open(file, "r", encoding="UTF-8") as f:
#f = open(file, "r", encoding="UTF-8")
f = open('path_to_save_txt+utf8_file.cn .srt', "r", エンコーディング="UTF-8")
行 = f.readlines()
温度 = 1
シュハオ = 1;
行ごと:
if temp == 1:
#f2.write(str(xuhao))
#f2.write(str('\n'))
#temp=0
temp=2
else:
#time8 = ''
# 2023 /8/11 9:09 SRT にスペースが見つかりました
if len(line) == 1:
temp=1
xuhao = xuhao+1
#f2.write(line)
# 2023/8/11 9:34 中国語と英語の字幕を削除スペース行 その後のタイムライン
elif temp == 2:
temp = 3
#res = re.split(':', temp)
time1 = re.split(':', line)
#re.split('-->' , res [2])
#time2 = re.split('-->', time1[2])
time2 = re。分割(' --> ', time1[2])
#ダイアログ: Marked=0,0:02:12.76,0:02:16.09,Default,NTP,0000,0000,0000,!Effect,Tyler Bob と Marian Taylor が一緒です #
time8 = 'Dialogue : Marked=0, ' + time1[0] + time1[1] + time2[0] + time2[1] + time1[3] + time1[4] + ',Default,NTP,0000,0000,0000,! Effect,' #
time8 = 'ダイアログ: マーク=0,' + time1[0] + ':' + time1[1] + ':' + time2[0] + ':' + time2[1] + ':' + time1[3] + ':' + time1[4] + ',Default,NTP,0000,0000,0000,!Effect,'
#print(line.rstrip())
#time8 = 'ダイアログ: マーク=0, ' + time1[0 ] + ':' + time1[1] + ':' + time2[0] + ':' + time2[1] + ':' + time1[3] + ':' + time1[4 ].rstrip() + ',デフォルト,NTP,0000,0000,0000,!効果,'
#time8 = 'ダイアログ: マーク=0,' + time1[0] + ':' + time1[1] + ':' + time2[0] + ',' + time2[1] + ':' + time1[ 3] + ':' + time1[4].rstrip() + ',Default,NTP,0000,0000,0000,!Effect,'
#Dialogue: Marked=0,00:02:12,76, 00:02 :16,099,Default,NTP,0000,0000,0000,!Effect,タイラー ボブとマリアン テイラーは私と一緒です
#time8 = 'ダイアログ: マーク=0,' + time1[0] + ':' + time1[1] + ':' + time2[0][0:5] + ',' + time2[1] + ':' + time1[3] + ':' + time1[4].rstrip() + ',Default,NTP ,0000,0000,0000,!効果,'
#ダイアログ: Marked=0,00:02:12,766,00:02:16,099,Default,NTP,0000,0000,0000,!Effect,Tyler Bob と Marian Taylor が一緒です #time8 = 'Dialogue : Marked=0
, ' + 時刻 1[0] + ':' + 時刻 1[1] + ':' + 時刻 2[0] + ',' + 時刻 2[1] + ':' + 時刻 1[3] + ': ' + 時刻 1[4 ].rstrip() + ',デフォルト,NTP,0000,0000,0000,!効果,'
#ダイアログ: マーク = 0,0:02:12.76,0:02:16.09,Default,NTP,0000,0000,0000,!効果,タイラー ボブとマリアン テイラーが私と一緒です #ダイアログ: マーク = 0,00:
02 :12,76,00:02:16,09,Default,NTP,0000,0000,0000,!効果,タイラー・ボブとマリアン・テイラーが一緒です #time8
= 'ダイアログ: マーク=0,' + time1[0] + ':' + time1[1] + ':' + time2[0][0:5] + ',' + time2[1] + ':' + time1[3 ] + ':' + time1[4] [0:5] + ',Default,NTP,0000,0000,0000,!Effect,'
#time2[0][2] = '.'
#time1[4][2] = '.'
#time2 = re .split(' --> ', time1[2])
time5 = re.split(',', time2[0][0:5])
time6 = re.split( ',', time1[4][0] :5])
#time8 = 'ダイアログ: マーク=0,' + time1[0] + ':' + time1[1] + ':' + time2[0][0:5] + ',' + time2[1] + ' :' + time1[3] + ':' + time1[4][0:5] + ',Default,NTP,0000,0000,0000,!Effect,' time8 = 'ダイアログ: マーク=0,' +
time1 [0] + ':' + time1[1] + ':' + time5[0] + '.' + time5[1] + ',' + time2[1] + ':' + time1[3] + ':' + time6[0] + '.' + time6[1] + ',Default,NTP,0000,0000,0000,!Effect,'
#else if temp == 2:
elif temp == 3:
#f3.write(line_en)
#f4.write(line)
#f2.write(line)
f2.write(time8 + line)
#f2.write('\n\n')
参考: https:
//mathpretty.com/10393.html
Python字幕変換ツール –asstosrt
https://fiime.cn/blog/281970ass/ssa
バッチ変換スクリプトを srt に実装する方法
https://www.techiedelight.com/zh/split-string-with-delimiters-python/Python
で区切り文字を使用して文字列を分割する
https://zhuanlan.zhihu.com/p/460511660
Pythonで文字列をカットする方法
TypeError: 'str' object doesn't support item assign
https://pythonjishu.com/python-error-66/
Python が「TypeError: 'str' object doesn't support item assign」を報告する理由と解決策
https://blog.51cto.com/u_15849381/5801826
Python TypeError: 'str' オブジェクトは項目割り当てエラーの解決策をサポートしていません
https://blog.csdn.net/scp_6453/article/details/107866043
Pythonで「TypeError 'str'オブジェクトは項目の割り当てをサポートしていません」の問題を解決する
Python文字列インターセプト
https://www.ycpai.cn/python/xBRw8f2K.html
Python文字列インターセプト方法
print(string[2:8]) # 出力: llo, W
#for line in Lines: Python は行ごとに読み取ります
https://blog.csdn.net/weixin_39662834/article/details/109925505
Python は行ごとに取得します_Python でファイルの内容を行ごとに読み取る 3 つの方法
Python if else if
https://blog.csdn.net/MeiWenjilu/article/details/127546798
Python の if と if_else と if_elif_else
https://blog.csdn.net/ldgk3ekkd/article/details/126383516
docx モジュールを使用して docx ファイルを読み書きする Python の方法と docx モジュールの一般的なメソッド
https://www.php.cn/faq/395631.html
Python で docx ファイルを読み書きする方法