فهرست منبع

字幕显示优化

zhangyong 9 ماه پیش
والد
کامیت
1f25a3e92f
1فایلهای تغییر یافته به همراه59 افزوده شده و 5 حذف شده
  1. 59 5
      common/tts_help.py

+ 59 - 5
common/tts_help.py

@@ -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],