如何调整SeamlessM4Tv2Model生成音频的语速?
调整SeamlessM4T v2生成音频语速至指定时长的解决思路
核心说明
SeamlessM4T v2的generate()方法中,speech_temperature和speech_do_sample仅控制生成音频的随机性,不影响时长。要将3秒音频调整为5秒,可从后期音频变速或模型生成阶段的长度控制两个方向入手,其中后期处理是更直接可靠的方案。
方法一:后期音频变速处理(推荐)
利用音频处理库对生成后的音频进行变速,保持音调不变。
用librosa实现的代码示例:
import librosa import soundfile as sf # 原生成逻辑不变 text_inputs = processor(text="I have a daughter 2 years old, I wanted her name to be Hương Ly", src_lang="eng", return_tensors="pt").to(device) audio_array = model.generate(**text_inputs, tgt_lang=language)[0].cpu().numpy().squeeze() # 计算变速比例:原时长3秒→目标5秒,速度变为原速的3/5=0.6倍 original_duration = len(audio_array) / 16000 # 基于采样率16000计算原时长 speed_ratio = original_duration / 5 # 变速处理,保持音调不变 audio_slowed = librosa.effects.time_stretch(audio_array, rate=speed_ratio) # 保存处理后的音频 file_path = 'audio_from_text_slowed.wav' sf.write(file_path, audio_slowed, 16000)
用pydub实现的代码示例:
from pydub import AudioSegment import soundfile as sf # 先保存原生成音频 text_inputs = processor(text="I have a daughter 2 years old, I wanted her name to be Hương Ly", src_lang="eng", return_tensors="pt").to(device) audio_array = model.generate(**text_inputs, tgt_lang=language)[0].cpu().numpy().squeeze() original_file = 'audio_from_text.wav' sf.write(original_file, audio_array, 16000) # 加载音频并调整速度至原速的60% audio = AudioSegment.from_wav(original_file) audio_slowed = audio.speedup(playback_speed=0.6, chunk_size=150, crossfade=25) audio_slowed.export('audio_from_text_slowed.wav', format='wav')
方法二:模型生成阶段尝试控制长度(可选)
SeamlessM4T v2的generate()方法支持speech_max_length参数,可尝试设置该参数限制生成语音的最大token数,间接调整时长。但该方法依赖模型对文本的映射,效果不如后期处理稳定:
# 在generate中添加speech_max_length参数 audio_array = model.generate( **text_inputs, tgt_lang=language, speech_max_length=int(16000 * 5) # 按采样率16000,5秒对应80000个采样点,需根据模型token映射关系调整 )[0].cpu().numpy().squeeze()
注意:该参数取值需结合模型语音token与采样点的对应关系调整,可能需要多次测试才能匹配目标时长。
内容的提问来源于stack exchange,提问作者lam vu Nguyen
相关产品推荐
相关产品推荐

