2.1采集与读取

语言录制

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 2
WAVE_OUTPUT_FILENAME = "Oldboy.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("start recording......")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("end!")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

语音播放

"""PyAudio Example: Play a WAVE file."""

import pyaudio
import wave

CHUNK = 1024
FILENAME = 'C2_1_y.wav'


def player(filename=FILENAME):
    wf = wave.open(filename, 'rb')

    p = pyaudio.PyAudio()

    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    data = wf.readframes(CHUNK)

    while data != b'':
        stream.write(data)
        data = wf.readframes(CHUNK)

    stream.stop_stream()
    stream.close()

    p.terminate()


player(FILENAME)

读取并可视化

import librosa  # 填充,默认频率为22050,可以改变频率
from scipy.io import wavfile  # 原音无损
import numpy as np
import librosa.display
import matplotlib.pyplot as plt
fs, data = wavfile.read('C2_1_y.wav')  # 原始频率,原始数据
print("长度 = {0} 秒".format(len(data) / fs))
data1, sample_rate = librosa.load('C2_1_y.wav')
print("长度 = {0} 秒".format(len(data1) / sample_rate))
plt.figure(figsize=(14, 5))
librosa.display.waveplot(data1, sample_rate)
plt.show()

通用基础类

import pyaudio
import wave
import librosa
import librosa.display
import matplotlib.pyplot as plt


# from scipy.io import wavfile

class soundBase:
    def __init__(self, path):
        self.path = path

    def audiorecorder(self, len=2, formater=pyaudio.paInt16, rate=16000, frames_per_buffer=1024, channels=2):
        p = pyaudio.PyAudio()
        stream = p.open(format=formater, channels=channels, rate=rate, input=True, frames_per_buffer=frames_per_buffer)
        print("start recording......")
        frames = []
        for i in range(0, int(rate / frames_per_buffer * len)):
            data = stream.read(frames_per_buffer)
            frames.append(data)
        print("stop recording......")
        stream.stop_stream()
        stream.close()
        p.terminate()
        wf = wave.open(self.path, 'wb')
        wf.setnchannels(channels)
        wf.setsampwidth(p.get_sample_size(formater))
        wf.setframerate(rate)
        wf.writeframes(b''.join(frames))
        wf.close()

    def audioplayer(self, frames_per_buffer=1024):
        wf = wave.open(self.path, 'rb')
        p = pyaudio.PyAudio()
        stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                        channels=wf.getnchannels(),
                        rate=wf.getframerate(),
                        output=True)
        data = wf.readframes(frames_per_buffer)
        while data != b'':
            stream.write(data)
            data = wf.readframes(frames_per_buffer)

        stream.stop_stream()
        stream.close()
        p.terminate()

    def audiowrite(self):
        pass

    def audioread(self):
        data, sample_rate = librosa.load(self.path)
        return data, sample_rate

    def soundplot(self, data=[], sr=22050, size=(14, 5)):
        if len(data) == 0:
            data, _ = self.audioread()
        plt.figure(figsize=size)
        librosa.display.waveplot(data, sr=sr)
        plt.show()


sb = soundBase('C2_1_y.wav')
data, sr = sb.audioread()
sb.soundplot(data, sr)

matlab版本更新后函数更新

matlab老版本(如matlab2010)使用的函数名在新版本中已经取消了,对应关系如下:

wavrecord audiorecorder
wavplay audioplayer
wavwrite audioplayer

你可能感兴趣的:(2.1采集与读取)