"""配音生成脚本模板"""
import sys, os, time
sys.path.insert(0, '.')
sys.path.insert(0, 'third_party/Matcha-TTS')
import torch, soundfile as sf
from cosyvoice.cli.cosyvoice import CosyVoice2
model = CosyVoice2('pretrained_models/CosyVoice2-0.5B', load_jit=False, load_trt=False)
VOICES = {
'narrator': {
'wav': 'asset/ref/zh_male_narrator.wav',
'text': '在这个宁静的夜晚,远处的灯火逐渐亮了起来,仿佛在诉说着一个关于希望的故事。',
},
'deep': {
'wav': 'asset/ref/zh_male_deep.wav',
'text': '唉,你看看这个情况,实在是让人心酸,我真的没有办法了。',
},
'sweet': {
'wav': 'asset/ref/zh_female_sweet.wav',
'text': '哎呀,这也太让人失望了吧,本来以为会很好的呢,结果全完了。',
},
'angry': {
'wav': 'asset/ref/zh_female_angry.wav',
'text': '我真的太生气了,这件事情绝对不能就这么算了,我一定要讨个说法!',
},
}
output_dir = '<项目输出目录>/配音'
os.makedirs(output_dir, exist_ok=True)
for idx, (filename, tts_text, voice_key, speed) in enumerate(SCENES, 1):
voice = VOICES[voice_key]
for result in model.inference_zero_shot(
tts_text,
prompt_text=voice['text'],
prompt_wav=voice['wav'],
stream=False,
speed=speed,
):
audio = result['tts_speech'].squeeze().cpu().numpy()
sf.write(f'{output_dir}/{filename}.wav', audio, model.sample_rate)
ffmpeg -y -i video.mp4 -i merged_voice.wav -i bgm.wav \
-filter_complex \
"[0:v]drawtext=text='字幕':fontfile=C\\:/Windows/Fonts/msyh.ttc:\
fontsize=38:fontcolor=white:borderw=2:bordercolor=black:\
x=(w-text_w)/2:y=h-150:enable='between(t,1,4)', \
... 更多 drawtext ...[v]; \
[1:a]volume=1.0[voice]; [2:a]volume=0.3[bgm]; \
[voice][bgm]amix=inputs=2:duration=first[audio]" \
-map "[v]" -map "[audio]" \
-c:v libx264 -preset fast -crf 20 -c:a aac -b:a 192k \
-shortest output_字幕.mp4