tts_help.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import subprocess
  2. import requests
  3. import json
  4. import random
  5. import re
  6. import time
  7. class TTS:
  8. @classmethod
  9. def get_pw_zm(cls, text):
  10. max_retries = 3
  11. for attempt in range(max_retries):
  12. url = "https://zh.api.guiji.cn/avatar2c/tool/sec_tts"
  13. payload = json.dumps({
  14. "text": text,
  15. "speaker_id": "160"
  16. })
  17. headers = {
  18. 'accept': 'application/json, text/plain, */*',
  19. 'accept-language': 'zh-CN',
  20. 'cache-control': 'no-cache',
  21. 'content-type': 'application/json',
  22. 'cookie': 'anylangIsLogin=true',
  23. 'origin': 'https://app.guiji.cn',
  24. 'pragma': 'no-cache',
  25. 'priority': 'u=1, i',
  26. 'referer': 'https://app.guiji.cn/',
  27. 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
  28. 'sec-ch-ua-mobile': '?0',
  29. 'sec-ch-ua-platform': '"macOS"',
  30. 'sec-fetch-dest': 'empty',
  31. 'sec-fetch-mode': 'cors',
  32. 'sec-fetch-site': 'same-site',
  33. 'token': '72912b4ac30b412cb19d2e835a678854'
  34. }
  35. wait_time = random.uniform(5, 20)
  36. time.sleep(wait_time)
  37. response = requests.request("POST", url, headers=headers, data=payload)
  38. try:
  39. response = response.json()
  40. code = response["code"]
  41. if code == 200:
  42. mp3 = response["data"]
  43. return mp3
  44. else:
  45. if attempt == max_retries - 1:
  46. return None
  47. except Exception:
  48. if attempt == max_retries - 1:
  49. return None
  50. """
  51. 音频下载到本地
  52. """
  53. @classmethod
  54. def download_mp3(cls, video_file, video_path_url, pw_random_id):
  55. pw_mp3_path = video_path_url + str(pw_random_id) +'pw_video.mp3'
  56. for i in range(3):
  57. payload = {}
  58. headers = {}
  59. response = requests.request("GET", video_file, headers=headers, data=payload)
  60. if response.status_code == 200:
  61. # 以二进制写入模式打开文件
  62. with open(f"{pw_mp3_path}", "wb") as file:
  63. # 将响应内容写入文件
  64. file.write(response.content)
  65. time.sleep(5)
  66. return pw_mp3_path
  67. return ''
  68. @classmethod
  69. def get_srt_format(cls, pw_srt_text, pw_url_sec):
  70. segments = re.split(r'(,|。|!|?)', pw_srt_text)
  71. segments = [segments[i] + segments[i + 1] for i in range(0, len(segments) - 1, 2)]
  72. pw_url_sec = int(pw_url_sec) + 1
  73. # 确定每段显示时间
  74. num_segments = len(segments)
  75. duration_per_segment = pw_url_sec / num_segments
  76. srt_content = ""
  77. start_time = 0.0
  78. for i, segment in enumerate(segments):
  79. end_time = start_time + duration_per_segment
  80. srt_content += f"{i + 1}\n"
  81. 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} --> "
  82. 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"
  83. srt_content += f"{segment.strip()}\n\n"
  84. start_time = end_time
  85. print(srt_content)
  86. return srt_content
  87. if __name__ == '__main__':
  88. text = "真是太实用了,分享给身边的准妈妈们吧!这些孕期禁忌一定要记住,赶紧转发给更多人,帮助更多的宝妈们。一起为宝宝的健康加油!"
  89. mp3 = TTS.get_pw_zm(text)
  90. print(mp3)
  91. # command = [
  92. # 'ffmpeg',
  93. # '-i', mp3,
  94. # '-q:a', '0',
  95. # '-map', 'a',
  96. # # '-codec:a', 'libmp3lame', # 指定 MP3 编码器
  97. # "/Users/tzld/Desktop/video_rewriting/path/pw_video.mp3"
  98. # ]
  99. # subprocess.run(command)
  100. # print("完成")
  101. # video_file = 'https://digital-public.obs.myhuaweicloud.com/vcm_server/20240715/KnOgRTYKvZbWD2EX_ms/FwA2SEh7DZQGlwAe.wav'
  102. # result = subprocess.run(
  103. # ["ffprobe", "-v", "error", "-show_entries", "format=duration",
  104. # "-of", "default=noprint_wrappers=1:nokey=1", video_file],
  105. # capture_output=True, text=True)
  106. # print(float(result.stdout))