Python3+将2声道音频,分拆成1声

发布时间:2019-09-23 17:00:03编辑:auto阅读(1410)

    现在是将双声道的音频分拆成单声道的。
    同理可以将多声道的音频文件,转为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'))
    

    主要为了之后对两个音频的抵消与叠加进行处理做准备。
    拆分后的音频,文件大小也只有原先的一半。

关键字