Python3+叠加两个音频文件,实现混

发布时间:2019-09-24 08:33:11编辑:auto阅读(1939)

    将两个单声道的音频文件叠加成一个新的音频文件。
    实现:a + b = c(新)
    
    同理,如果用 c - b 可以得到文件a
    
    同理,也可以将多个单声道音频文件叠加到一起。

    注意:

    • 两个文件要是相同声道的文件,这里的代码只适用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__))), '音频文件/demo1.wav')
    file2 = os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))), '音频文件/demo2.wav')
    
    f1 = wave.open(file1, 'rb')
    f2 = wave.open(file2, 'rb')
    
    # 音频1的数据
    params1 = f1.getparams()
    nchannels1, sampwidth1, framerate1, nframes1, comptype1, compname1 = params1[:6]
    print(nchannels1, sampwidth1, framerate1, nframes1, comptype1, compname1)
    f1_str_data = f1.readframes(nframes1)
    f1.close()
    f1_wave_data = np.fromstring(f1_str_data, dtype=np.int16)
    
    # 音频2的数据
    params2 = f2.getparams()
    nchannels2, sampwidth2, framerate2, nframes2, comptype2, compname2 = params2[:6]
    print(nchannels2, sampwidth2, framerate2, nframes2, comptype2, compname2)
    f2_str_data = f2.readframes(nframes2)
    f2.close()
    f2_wave_data = np.fromstring(f2_str_data, dtype=np.int16)
    
    # 对不同长度的音频用数据零对齐补位
    if nframes1 < nframes2:
        length = abs(nframes2 - nframes1)
        temp_array = np.zeros(length, dtype=np.int16)
        rf1_wave_data = np.concatenate((f1_wave_data, temp_array))
        rf2_wave_data = f2_wave_data
    elif nframes1 > nframes2:
        length = abs(nframes2 - nframes1)
        temp_array = np.zeros(length, dtype=np.int16)
        rf2_wave_data = np.concatenate((f2_wave_data, temp_array))
        rf1_wave_data = f1_wave_data
    else:
        rf1_wave_data = f1_wave_data
        rf2_wave_data = f2_wave_data
    
    # ================================
    # 合并1和2的数据
    new_wave_data = rf1_wave_data + rf2_wave_data
    new_wave = new_wave_data.tostring()
    
    p = pyaudio.PyAudio()
    CHANNELS = 1
    FORMAT = pyaudio.paInt16
    RATE = 44100
    
    # 实现录音
    def record(re_frames, WAVE_OUTPUT_FILENAME):
        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(new_wave, 'demo1+2.wav')

关键字