声音.wav文件的读取与保存-示例代码:
import librosa
import librosa.display
import numpy as np
from scipy.io.wavfile import writedef split_wav():# 读取音频文件audio_data, sample_rate = librosa.load(input_file, sr=None) # sr不指定为None,就会读取为22050Hzprint("文件的采样率为: {}Hz".format(sample_rate))# 计算音频时长total_duration = len(audio_data) / sample_rateprint("文件的总时长为: {}S".format(total_duration))# 分割点位置start_time = 90 # 录音开始的时长minend_time = 120 start_sample = int(start_time * 60 * sample_rate)end_sample = int(end_time * 60 * sample_rate)# 分割音频audio_part = audio_data[start_sample:end_sample]# 保存分割后的音频文件# 为了符合 WAV 文件的格式,我们需要将浮点数表示的归一化音频数据转换为整数。乘以 32767 是为了将范围从 [-1, 1] 映射到 [-32767, 32767],并且将浮点数转换为整数。write(output_file1, sample_rate, np.int16(audio_part * 32767.0))write(output_file2, sample_rate, audio_part)return audio_part# 文件地址
input_file = r"C:\Users\85007\Desktop\test_wave\yaofeijie_20231101210759.wav"
output_file1 = r"C:\Users\85007\Desktop\test_wave\yaofeijie_20231101210759_part1.wav"
output_file2 = r"C:\Users\85007\Desktop\test_wave\yaofeijie_20231101210759_part2.wav"audio_part = split_wav()
print("切割音频文件结束")# 对比实验
print("读取原始文件的数值为: {}".format(audio_part[:5]))
temp_data1, sample_rate = librosa.load(output_file1, sr=None)
print("乘了32767文件的数值为: {}".format(temp_data1[:5]))
temp_data2, sample_rate = librosa.load(output_file2, sr=None)
print("未乘32767文件的数值为: {}".format(temp_data2[:5]))
ChatGPT声称:为了符合 WAV 文件的格式,我们需要将浮点数表示的归一化音频数据转换为整数。乘以 32767 是为了将范围从 [-1, 1] 映射到 [-32767, 32767],并且将浮点数转换为整数。
后续实验证明,GPT是错误的!
上述代码的运行结果
测试结论:
(1)通过librosa.load读取wav文件,会自动把数值缩放到【-1,1】。
(2)不要听ChatGPT胡说八道,乘了32767后反而把新保存的结果和原始结果不一样。