run.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import json
  2. import glob
  3. import string
  4. import unicodedata
  5. from datetime import datetime
  6. import os
  7. import subprocess
  8. import threading
  9. from concurrent.futures import ThreadPoolExecutor
  10. findText="琪琪"
  11. replace_audio_file_name="resource/xiaodou002.mp3"
  12. def count_all_punctuation(text):
  13. chinese_punctuation = ",。!?《》【】、"
  14. count = 0
  15. for char in text:
  16. if char in string.punctuation or char in chinese_punctuation or unicodedata.category(char).startswith('P'):
  17. count += 1
  18. return count
  19. # 线程池任务执行函数
  20. def execCMD(command):
  21. print(command)
  22. try:
  23. # 执行命令并获取结果
  24. result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True)
  25. if result.returncode == 0:
  26. print("命令执行成功!")
  27. else:
  28. print(f"命令执行失败: {result.stderr}")
  29. except Exception as e:
  30. print(f"执行命令时发生错误: {str(e)}")
  31. def mergeAudio(file_list_name):
  32. output_mp3_name=file_list_name.replace(".txt",".mp3")
  33. command=f"ffmpeg -f concat -safe 0 -i {file_list_name} -c -c:a libmp3lame -b:a 128k copy {output_mp3_name}"
  34. print(command)
  35. try:
  36. # 执行命令并获取结果
  37. result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True)
  38. if result.returncode == 0:
  39. print("音频合并成功!")
  40. else:
  41. print(f"音频合并执行失败: {result.stderr}")
  42. except Exception as e:
  43. print(f"执行命令时发生错误: {str(e)}")
  44. def mergeAudio002(audios,mergeAudioName):
  45. # command=f'ffmpeg -i output/03_000000.mp3 -i resource/xiaodou002.mp3 -i output/03_000010.mp3 -i resource/xiaodou002.mp3 -filter_complex "[0][1][2][3]concat=n=4:v=0:a=1" -y merge/03_0000.mp3'
  46. command=f'ffmpeg'
  47. for audio in audios:
  48. command+=" -i "+audio
  49. command+=" -filter_complex "
  50. command+='"'
  51. for x in range(len(audios)):
  52. command+=f"[{str(x)}]"
  53. command+=f"concat=n={str(len(audios))}:v=0:a=1"
  54. command+='"'
  55. command+=f" -y {mergeAudioName}"
  56. try:
  57. # 执行命令并获取结果
  58. result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True)
  59. if result.returncode == 0:
  60. print("音频合并成功!")
  61. else:
  62. print(f"音频合并执行失败: {result.stderr}")
  63. except Exception as e:
  64. print(f"执行命令时发生错误: {str(e)}")
  65. def merge_audio_video(video_file,audio_file,output_file):
  66. command=f"ffmpeg -i {video_file} -i {audio_file} -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -strict experimental {output_file}"
  67. try:
  68. # 执行命令并获取结果
  69. result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True)
  70. if result.returncode == 0:
  71. print("音频替换成功!")
  72. else:
  73. print(f"音频替换执行失败: {result.stderr}")
  74. except Exception as e:
  75. print(f"执行命令时发生错误: {str(e)}")
  76. def replace_audio(splits):
  77. if len(splits)==1:
  78. return [], None
  79. file_name=os.path.basename(splits[0]['filePath']).replace(".mp3","")
  80. audios=[]
  81. for index,x in enumerate(splits):
  82. if 'endTime' in x:
  83. cmd=f"ffmpeg -i {x['filePath']} -ss {x['startTime']} -to {x['endTime']} -ac 2 -ar 44100 -ab 128k -y output/{file_name}0000{index}.mp3"
  84. audios.append(f"output/{file_name}0000{index}.mp3")
  85. audios.append(replace_audio_file_name)
  86. else:
  87. cmd=f"ffmpeg -i {x['filePath']} -ss {x['startTime']} -ac 2 -ar 44100 -ab 128k -y output/{file_name}0000{index}.mp3"
  88. audios.append(f"output/{file_name}0000{index}.mp3")
  89. execCMD(cmd)
  90. return audios,file_name
  91. def timeConversion(time):
  92. seconds = time // 1000
  93. milliseconds_remaining = time % 1000
  94. minutes = seconds // 60
  95. seconds_remaining = seconds % 60
  96. time_str = "{:02}:{:02}:{:02}.{:03}".format(minutes // 60, minutes % 60, seconds_remaining, milliseconds_remaining)
  97. return time_str
  98. def exJson(path):
  99. with open(path, 'r', encoding='utf-8') as file:
  100. # print(os.path.dirname(path).replace("subtitle","input"))
  101. splits=[]
  102. times=[0]
  103. file_path = os.path.dirname(path).replace("subtitle","input")+"/"+os.path.basename(path).replace("json","mp3")
  104. content = file.read().strip()
  105. jsonData = json.loads(content)
  106. respData = jsonData["resp"]
  107. for utterance in respData["utterances"]:
  108. text=utterance["text"]
  109. if findText in text:
  110. findIndex=text.find(findText)
  111. words=utterance["words"]
  112. findIndex=findIndex-count_all_punctuation(text[:findIndex])
  113. startIndex=findIndex
  114. endIndex=findIndex+len(findText)
  115. # print("startTime")
  116. # print(words[startIndex]["start_time"])
  117. # print(timeConversion(words[startIndex]["start_time"]))
  118. # print("endTime")
  119. # print(words[endIndex]["end_time"])
  120. # print("--------------------------------")
  121. times.append(words[startIndex]["start_time"])
  122. times.append(words[endIndex]["end_time"])
  123. # splits.append({'filePath':file_path,'startTime':timeConversion(words[startIndex]["start_time"]),'endTime':timeConversion(words[startIndex]["end_time"])})
  124. # replace_audio(splits)
  125. for i in range(0, len(times), 2):
  126. if i+1==len(times):
  127. splits.append({'filePath':file_path,'startTime':timeConversion(times[i])})
  128. else:
  129. splits.append({'filePath':file_path,'startTime':timeConversion(times[i]),'endTime':timeConversion(times[i+1])})
  130. audios,file_name=replace_audio(splits)
  131. if len(audios)==0:
  132. return
  133. mergeAudio002(audios,f"merge/{file_name}0000.mp3")
  134. merge_audio_video(f"input/{file_name}.mp4",f"merge/{file_name}0000.mp3",f"output_video/{file_name}.mp4")
  135. if __name__ == '__main__':
  136. for x in glob.glob(r"D:\replace_audio_script\merge\*"):
  137. os.remove(x)
  138. for x in glob.glob(r"D:\replace_audio_script\output\*"):
  139. os.remove(x)
  140. for x in glob.glob(r"D:\replace_audio_script\output_video\*"):
  141. os.remove(x)
  142. for x in glob.glob(r"D:\replace_audio_script\subtitle\*.json"):
  143. exJson(x)