1. 程式人生 > >Python3+將2聲道音頻,分拆成1聲道

Python3+將2聲道音頻,分拆成1聲道

for sam 現在 相同 拆分後 一半 put code imp

現在是將雙聲道的音頻分拆成單聲道的。 同理可以將多聲道的音頻文件,轉為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‘))

主要為了之後對兩個音頻的抵消與疊加進行處理做準備。
拆分後的音頻,文件大小也只有原先的一半。

Python3+將2聲道音頻,分拆成1聲道