tts_help.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import subprocess
  2. import requests
  3. import json
  4. import random
  5. import re
  6. import time
  7. from pydub import AudioSegment
  8. class TTS:
  9. @classmethod
  10. def get_pw_zm(cls, text):
  11. max_retries = 3
  12. for attempt in range(max_retries):
  13. url = "https://zh.api.guiji.cn/avatar2c/tool/sec_tts"
  14. payload = json.dumps({
  15. "text": text,
  16. "speaker_id": "160"
  17. })
  18. headers = {
  19. 'accept': 'application/json, text/plain, */*',
  20. 'accept-language': 'zh-CN',
  21. 'cache-control': 'no-cache',
  22. 'content-type': 'application/json',
  23. 'cookie': 'anylangIsLogin=true',
  24. 'origin': 'https://app.guiji.cn',
  25. 'pragma': 'no-cache',
  26. 'priority': 'u=1, i',
  27. 'referer': 'https://app.guiji.cn/',
  28. 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
  29. 'sec-ch-ua-mobile': '?0',
  30. 'sec-ch-ua-platform': '"macOS"',
  31. 'sec-fetch-dest': 'empty',
  32. 'sec-fetch-mode': 'cors',
  33. 'sec-fetch-site': 'same-site',
  34. 'token': '72912b4ac30b412cb19d2e835a678854'
  35. }
  36. wait_time = random.uniform(5, 20)
  37. time.sleep(wait_time)
  38. response = requests.request("POST", url, headers=headers, data=payload)
  39. try:
  40. response = response.json()
  41. code = response["code"]
  42. if code == 200:
  43. mp3 = response["data"]
  44. return mp3
  45. else:
  46. if attempt == max_retries - 1:
  47. return None
  48. except Exception:
  49. if attempt == max_retries - 1:
  50. return None
  51. """
  52. 音频下载到本地
  53. """
  54. @classmethod
  55. def download_mp3(cls, video_file, video_path_url, pw_random_id):
  56. pw_mp3_path = video_path_url + str(pw_random_id) +'pw_video.mp3'
  57. for i in range(3):
  58. payload = {}
  59. headers = {}
  60. response = requests.request("GET", video_file, headers=headers, data=payload)
  61. if response.status_code == 200:
  62. # 以二进制写入模式打开文件
  63. with open(f"{pw_mp3_path}", "wb") as file:
  64. # 将响应内容写入文件
  65. file.write(response.content)
  66. # 增加音频音量
  67. audio = AudioSegment.from_file(pw_mp3_path)
  68. louder_audio = audio + 10
  69. louder_audio.export(pw_mp3_path, format="mp3")
  70. time.sleep(5)
  71. return pw_mp3_path
  72. return ''
  73. @classmethod
  74. def get_srt_format(cls, pw_srt_text, pw_url_sec):
  75. segments = re.split(r'(,|。|!|?)', pw_srt_text)
  76. segments = [segments[i] + segments[i + 1] for i in range(0, len(segments) - 1, 2)]
  77. pw_url_sec = int(pw_url_sec) + 1
  78. # 确定每段显示时间
  79. num_segments = len(segments)
  80. duration_per_segment = pw_url_sec / num_segments
  81. srt_content = ""
  82. start_time = 0.0
  83. for i, segment in enumerate(segments):
  84. end_time = start_time + duration_per_segment
  85. srt_content += f"{i + 1}\n"
  86. srt_content += f"{int(start_time // 3600):02}:{int((start_time % 3600) // 60):02}:{int(start_time % 60):02},{int((start_time % 1) * 1000):03} --> "
  87. srt_content += f"{int(end_time // 3600):02}:{int((end_time % 3600) // 60):02}:{int(end_time % 60):02},{int((end_time % 1) * 1000):03}\n"
  88. srt_content += f"{segment.strip()}\n\n"
  89. start_time = end_time
  90. print(srt_content)
  91. return srt_content
  92. @classmethod
  93. def process_srt(cls, srt):
  94. lines = srt.strip().split('\n')
  95. processed_lines = []
  96. for line in lines:
  97. if re.match(r'^\d+$', line):
  98. processed_lines.append(line)
  99. elif re.match(r'^\d{2}:\d{2}:\d{2}\.\d{1,3}-->\d{2}:\d{2}:\d{2}\.\d{1,3}$', line):
  100. processed_lines.append(line.replace('-->', ' --> '))
  101. else:
  102. line = re.sub(r'[,。!?;、]$', '', line)
  103. # 添加换行符
  104. processed_lines.append(line + '\n')
  105. return '\n'.join(processed_lines)
  106. @classmethod
  107. def getSrt(cls, mp3_id):
  108. url = "http://api-internal.piaoquantv.com/produce-center/srt/get/content"
  109. payload = json.dumps({
  110. "params": {
  111. "resourceChannel": "outer",
  112. "videoPath": mp3_id
  113. }
  114. })
  115. headers = {
  116. 'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
  117. 'Content-Type': 'application/json',
  118. 'Accept': '*/*',
  119. 'Host': 'api-internal.piaoquantv.com',
  120. 'Connection': 'keep-alive'
  121. }
  122. response = requests.request("POST", url, headers=headers, data=payload)
  123. time.sleep(1)
  124. data_list = response.json()
  125. code = data_list["code"]
  126. if code == 0:
  127. srt = data_list["data"]
  128. if srt:
  129. srt = srt.replace("/n", "\n")
  130. # srt = re.sub(r'(\w+)([,。!?])', r'\n\n', srt)
  131. new_srt = cls.process_srt(srt)
  132. return new_srt
  133. else:
  134. return None
  135. else:
  136. return None
  137. if __name__ == '__main__':
  138. text = "真是太实用了,分享给身边的准妈妈们吧!这些孕期禁忌一定要记住,赶紧转发给更多人,帮助更多的宝妈们。一起为宝宝的健康加油!"
  139. mp3 = TTS.get_pw_zm(text)
  140. print(mp3)
  141. # command = [
  142. # 'ffmpeg',
  143. # '-i', mp3,
  144. # '-q:a', '0',
  145. # '-map', 'a',
  146. # # '-codec:a', 'libmp3lame', # 指定 MP3 编码器
  147. # "/Users/tzld/Desktop/video_rewriting/path/pw_video.mp3"
  148. # ]
  149. # subprocess.run(command)
  150. # print("完成")
  151. # video_file = 'https://digital-public.obs.myhuaweicloud.com/vcm_server/20240715/KnOgRTYKvZbWD2EX_ms/FwA2SEh7DZQGlwAe.wav'
  152. # result = subprocess.run(
  153. # ["ffprobe", "-v", "error", "-show_entries", "format=duration",
  154. # "-of", "default=noprint_wrappers=1:nokey=1", video_file],
  155. # capture_output=True, text=True)
  156. # print(float(result.stdout))