|
@@ -1,4 +1,5 @@
|
|
|
import subprocess
|
|
|
+from datetime import timedelta
|
|
|
|
|
|
import requests
|
|
|
import json
|
|
@@ -7,6 +8,8 @@ import re
|
|
|
import time
|
|
|
from pydub import AudioSegment
|
|
|
|
|
|
+
|
|
|
+
|
|
|
class TTS:
|
|
|
|
|
|
@classmethod
|
|
@@ -114,6 +117,53 @@ class TTS:
|
|
|
|
|
|
return '\n'.join(processed_lines)
|
|
|
|
|
|
+ @classmethod
|
|
|
+ def parse_timecode(cls, timecode):
|
|
|
+ h, m, s = map(float, timecode.replace(',', '.').split(':'))
|
|
|
+ return timedelta(hours=h, minutes=m, seconds=s)
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def format_timecode(cls, delta):
|
|
|
+ total_seconds = delta.total_seconds()
|
|
|
+ hours, remainder = divmod(total_seconds, 3600)
|
|
|
+ minutes, seconds = divmod(remainder, 60)
|
|
|
+ return f"{int(hours):02}:{int(minutes):02}:{seconds:06.3f}".replace('.', ',')
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def split_subtitle(cls, subtitle_string):
|
|
|
+ max_len = 10
|
|
|
+ lines = subtitle_string.strip().split('\n')
|
|
|
+ subtitles = []
|
|
|
+ for i in range(0, len(lines), 4):
|
|
|
+ sub_id = int(lines[i].strip())
|
|
|
+ timecode_line = lines[i + 1].strip()
|
|
|
+ start_time, end_time = timecode_line.split(' --> ')
|
|
|
+ text = lines[i + 2].strip()
|
|
|
+
|
|
|
+ start_delta = cls.parse_timecode(start_time)
|
|
|
+ end_delta = cls.parse_timecode(end_time)
|
|
|
+ total_duration = (end_delta - start_delta).total_seconds()
|
|
|
+ char_duration = total_duration / len(text)
|
|
|
+
|
|
|
+ current_start = start_delta
|
|
|
+ for j in range(0, len(text), max_len):
|
|
|
+ segment = text[j:j + max_len]
|
|
|
+ current_end = current_start + timedelta(seconds=char_duration * len(segment))
|
|
|
+ subtitles.append((sub_id, current_start, current_end, segment))
|
|
|
+ current_start = current_end
|
|
|
+ sub_id += 1
|
|
|
+
|
|
|
+ return subtitles
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def generate_srt(cls, subtitles):
|
|
|
+ srt_content = ''
|
|
|
+ for idx, sub in enumerate(subtitles, start=1):
|
|
|
+ srt_content += f"{idx}\n"
|
|
|
+ srt_content += f"{cls.format_timecode(sub[1])} --> {cls.format_timecode(sub[2])}\n"
|
|
|
+ srt_content += f"{sub[3]}\n\n"
|
|
|
+ return srt_content.strip()
|
|
|
+
|
|
|
@classmethod
|
|
|
def getSrt(cls, mp3_id):
|
|
|
url = "http://api-internal.piaoquantv.com/produce-center/srt/get/content"
|
|
@@ -142,7 +192,10 @@ class TTS:
|
|
|
srt = srt.replace("/n", "\n")
|
|
|
# srt = re.sub(r'(\w+)([,。!?])', r'\n\n', srt)
|
|
|
new_srt = cls.process_srt(srt)
|
|
|
- return new_srt
|
|
|
+ result = cls.split_subtitle(new_srt)
|
|
|
+ # 生成SRT格式内容
|
|
|
+ srt_content = cls.generate_srt(result)
|
|
|
+ return srt_content
|
|
|
else:
|
|
|
return None
|
|
|
else:
|
|
@@ -150,9 +203,9 @@ class TTS:
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
- text = "真是太实用了,分享给身边的准妈妈们吧!这些孕期禁忌一定要记住,赶紧转发给更多人,帮助更多的宝妈们。一起为宝宝的健康加油!"
|
|
|
- mp3 = TTS.get_pw_zm(text)
|
|
|
- print(mp3)
|
|
|
+ # text = "真是太实用了,分享给身边的准妈妈们吧!这些孕期禁忌一定要记住,赶紧转发给更多人,帮助更多的宝妈们。一起为宝宝的健康加油!"
|
|
|
+ # mp3 = TTS.get_pw_zm(text)
|
|
|
+ # print(mp3)
|
|
|
# command = [
|
|
|
# 'ffmpeg',
|
|
|
# '-i', mp3,
|
|
@@ -163,7 +216,8 @@ if __name__ == '__main__':
|
|
|
# ]
|
|
|
# subprocess.run(command)
|
|
|
# print("完成")
|
|
|
- # video_file = 'https://digital-public.obs.myhuaweicloud.com/vcm_server/20240715/KnOgRTYKvZbWD2EX_ms/FwA2SEh7DZQGlwAe.wav'
|
|
|
+ video_file = 'https://digital-public.obs.myhuaweicloud.com/vcm_server/20240715/KnOgRTYKvZbWD2EX_ms/FwA2SEh7DZQGlwAe.wav'
|
|
|
+ TTS.getSrt(video_file)
|
|
|
# result = subprocess.run(
|
|
|
# ["ffprobe", "-v", "error", "-show_entries", "format=duration",
|
|
|
# "-of", "default=noprint_wrappers=1:nokey=1", video_file],
|