4 回复
中文编程海星,就是智能提示不太方便吧
要实现自制TTS引擎的wav文件拼接,核心是读取每个单字wav的音频数据,然后按顺序拼接。用wave模块处理wav文件,numpy处理音频数据最直接。
下面是一个完整的示例代码:
import wave
import numpy as np
def concatenate_wavs(word_wav_files, output_file):
"""
拼接多个单字wav文件
Args:
word_wav_files: 单字wav文件路径列表,按拼接顺序排列
output_file: 输出文件路径
"""
# 读取第一个文件获取参数
with wave.open(word_wav_files[0], 'rb') as first_wav:
params = first_wav.getparams() # 获取音频参数
nchannels, sampwidth, framerate, nframes, comptype, compname = params
# 读取第一个文件的音频数据
first_data = first_wav.readframes(nframes)
# 将所有音频数据收集到列表中
all_frames = [first_data]
# 读取剩余文件
for wav_file in word_wav_files[1:]:
with wave.open(wav_file, 'rb') as wav:
# 检查参数是否一致
current_params = wav.getparams()
if current_params[:3] != params[:3]: # 比较前三个参数
raise ValueError(f"文件 {wav_file} 的参数与第一个文件不匹配")
# 读取音频数据
data = wav.readframes(current_params[3])
all_frames.append(data)
# 拼接所有音频数据
concatenated_data = b''.join(all_frames)
# 写入输出文件
with wave.open(output_file, 'wb') as out_wav:
out_wav.setparams(params)
out_wav.writeframes(concatenated_data)
# 使用示例
if __name__ == "__main__":
# 假设你有这些单字wav文件
word_files = ["你.wav", "好.wav", "世.wav", "界.wav"]
output_path = "output.wav"
concatenate_wavs(word_files, output_path)
print(f"拼接完成,输出文件: {output_path}")
关键点:
- 用
wave.open()读取wav文件,getparams()获取音频参数 - 用
readframes()读取原始音频数据(字节串) - 把所有字节串用
b''.join()拼接起来 - 用
setparams()设置输出文件参数,writeframes()写入数据
注意所有wav文件的参数(声道数、采样宽度、采样率)要一致,否则拼接后可能有问题。如果参数不一致,需要先统一转换。
如果要用numpy处理(比如要做淡入淡出效果),可以这样:
def concatenate_with_numpy(word_wav_files, output_file):
"""使用numpy拼接wav文件"""
audio_segments = []
for wav_file in word_wav_files:
with wave.open(wav_file, 'rb') as wav:
params = wav.getparams()
data = wav.readframes(params[3])
# 将字节数据转换为numpy数组
dtype = np.int16 if params[1] == 2 else np.int8
audio_array = np.frombuffer(data, dtype=dtype)
audio_segments.append(audio_array)
# 拼接数组
concatenated = np.concatenate(audio_segments)
# 写入文件
with wave.open(output_file, 'wb') as out_wav:
out_wav.setparams(params)
out_wav.writeframes(concatenated.tobytes())
用numpy的好处是方便做进一步处理,比如调整音量、添加静音间隔等。
总结:用wave模块直接拼接字节数据最简单高效。
中文编程???
用 vsc, 输第一个字有提示. 之前有位实现了 TS 下的拼音输入和自动补全集成. 个人写 Python 代码还不多, 暂时不急着做类似插件.
怎么了???

