fft区分左右声道

import wave
import numpy as np
import simpleaudio as sa


project_path = "/home/amazing/python/sound"

music_file_path = project_path+"/data/3.wav"

if __name__ == '__main__':

    #打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
    f = wave.open(music_file_path, "rb")
    #读取格式信息
    #一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
    params = f.getparams()
    print(params)
    # _wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=9109296, comptype='NONE', compname='not compressed')
    nchannels, sampwidth, framerate, nframes = params[:4]
    #读取波形数据
    #读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)
    sound_buffer = f.readframes(nframes)
    f.close()



    # #将波形数据转换成数组
    # #需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
    wave_data = np.frombuffer(sound_buffer, dtype=np.int16)
    print(np.shape(wave_data))
    # (64644,)
    # #将wave_data数组改为2列, 声道数是2,所以改为2
    wave_data = wave_data.reshape((-1, 2))
    print(np.shape(wave_data))
    #转置数据
    wave_data = wave_data.T
    # print(np.shape(wave_data))
    # (2, 32322)

    left_channel_sound_data = wave_data[0]
    right_channel_sound_data = wave_data[1]

    play_obj = sa.play_buffer(sound_buffer, nchannels, sampwidth, framerate)
    # play_obj = sa.play_buffer(left_channel_sound_data.tobytes(), 1, sampwidth, framerate)
    # play_obj = sa.play_buffer(right_channel_sound_data.tobytes(), 1, sampwidth, framerate)

    play_obj.wait_done()

文章目录