【Raspi4:사운드 입문】python으로 소리 입력을 안정적으로 기록한다♪

소리 입력은 몇 번인가 다루어 왔습니다만, 이번 Rasipi4에서도 안정적으로 쭉 입출력 할 수 있게 되었으므로, 정리하는 것으로 했습니다.
중요한 것은 아래 참고 1.와 같습니다. 덧붙여 작년은 참고 2.와 같은 일을 해 놀고 있었습니다.
올해는 이 후에 조금 다른 일을 하려고 합니다.
【참고】
1. PyAudio Input overflowed
2. 【Scipy】FFT, STFT와 wavelet 변환으로 놀아 본 ♬~⑦ 실시간 스펙트로그램; 고속화

중요한 것



즉,로드 할 때 다음과 같은 덤프를 기록하면 오버 플로우가 발생하지 않으므로 계속 기록 할 수 있습니다.
※이 기사는 Rasipi4에서도 이것이 해결되었다는 이야기입니다
# -*- coding:utf-8 -*-
import pyaudio
import matplotlib.pyplot as plt
import numpy as np
import wave
import struct

읽은 사운드를 다음 함수로 wav 파일로 저장합니다.
def savewav(sig,sk):
    RATE = 44100 #サンプリング周波数
    #サイン波を-32768から32767の整数値に変換(signed 16bit pcmへ)
    swav = [(int(32767*x)) for x in sig] #32767
    #バイナリ化
    binwave = struct.pack("h" * len(swav), *swav)
    #サイン波をwavファイルとして書き出し
    w = wave.Wave_write("./wine/"+str(sk)+".wav")
    params = (1, 2, RATE, len(binwave), 'NONE', 'not compressed')
    w.setparams(params)
    w.writeframes(binwave)
    w.close()

소리의 입출력을 True로 하고 있습니다.
음성(문장)을 입력하므로 긴(102400/44100=2.3sec)에 녹음합니다.
RATE=44100
p=pyaudio.PyAudio()
N=100
CHUNK=1024*N
stream=p.open(format = pyaudio.paInt16,
        channels = 1,
        rate = RATE,
        frames_per_buffer = CHUNK,
        input = True,
        output = True) # inputとoutputを同時にTrueにする

그리고 드디어 연속 녹음 시작입니다. exception_on_overflow를 False로 설정합니다. sig를 32768로 나누었습니다.
sk=0
while stream.is_active():
    input = stream.read(CHUNK, exception_on_overflow = False)
    print(len(input))
    sig =[]
    sig = np.frombuffer(input, dtype="int16") / 32768
    savewav(sig,sk)
    fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 4, 4*2))
    lns1=ax1.plot(sig[0:1024] ,".-",color="red")
    ax1.set_xticks(np.linspace(0, 882, 3))
    ax1.set_ylabel("sig0")
    ax1.set_title('short plot')
    lns2=ax2.plot(sig[0:CHUNK], "-",color="blue")
    ax2.set_xticks(np.linspace(0, 44100*2, 5))
    ax2.set_ylabel("sig1")
    ax2.set_title('long plot')
    ax1.grid()
    ax2.grid()
    plt.pause(0.5)
    plt.savefig("./wine/sound_{}.png".format(sk))
    plt.close()
    sk+=1
    output = stream.write(input)

오, 어, 네. . 의 연속 측정 결과
x-축 메모리; 44100=1sec



요약



・연속 측정이 가능하게 되었다

・음 관계로 R-python 연계를 하고 싶다

좋은 웹페이지 즐겨찾기