现在是将双声道的音频分拆成单声道的.
同理可以将多声道的音频文件, 转为 1 声道的音频文件.
注意新形成的音频文件的 rate, 需要与原音频的相同.
- import os
- import wave
- import numpy as np
- import pyaudio
- file1 = os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))), '音频文件 / 执迷不悟. wav')
- f = wave.open(file1, "rb")
- params = f.getparams()
- nchannels, sampwidth, framerate, nframes = params[:4]
- print(nchannels, sampwidth, framerate, nframes) # 2 2 44100 11625348
- # 读取波形数据
- str_data = f.readframes(nframes)
- f.close()
- # 将波形数据转换为数组
- wave_data = np.fromstring(str_data, dtype=np.int16)
- wave_data.shape = -1, 2
- wave_data = wave_data.T
- wave_data_1 = wave_data[0] # 声道 1
- wave_data_2 = wave_data[1] # 声道 2
- w1 = wave_data_1.tostring()
- w2 = wave_data_2.tostring()
- # 实现录音
- def record(re_frames, WAVE_OUTPUT_FILENAME):
- """
- :param re_frames: 是二进制的数据
- :param WAVE_OUTPUT_FILENAME: 输出的位置
- :return:
- """
- p = pyaudio.PyAudio()
- CHANNELS = 1
- FORMAT = pyaudio.paInt16
- RATE = framerate # 这个要跟原音频文件的比特率相同
- print("开始录音")
- wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
- wf.setnchannels(CHANNELS)
- wf.setsampwidth(p.get_sample_size(FORMAT))
- wf.setframerate(RATE)
- wf.writeframes(re_frames)
- wf.close()
- print("关闭录音")
- record(w1, os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))), '音频文件 / 执迷不悟 1.wav'))
- record(w1, os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))), '音频文件 / 执迷不悟 2.wav'))
主要为了之后对两个音频的抵消与叠加进行处理做准备.
拆分后的音频, 文件大小也只有原先的一半.
来源: http://www.bubuko.com/infodetail-2846203.html