본문 바로가기
Development/Python

Python Audio Processing

by 곽동현 IMCOMKING 2020. 5. 2.


Realtime Fast Audio Library: sounddevice

소리를 녹음하거나 재생하려면 sounddevice라는 라이브러리를 사용하는 것이 가장 빠르다. Sounddevice는 PortAudio라는 library의 python wrapper에 해당하며 Audio stream을 numpy로도 다룰 수 있게 해준다.
단, Windows 10의 WSL 1을 사용하는 경우 사운드에 대한 device접근이 불가능해서 동작이 안된다. 이러한 경우 WSL 2(?)가 해당 기능을 제공하거나, 혹은 anaconda를 사용해야한다.

설치방법

sudo apt install libportaudio2
pip install sounddevice



Python 기본 내장 library wave

wave를 사용하면 windows 운영체제에서 재생 가능한 형태로 저장할 수 있다.

아래는 wave를 사용해 wave_file을 읽고 쓰는 클래스이다.


import numpy as np
import wave
import matplotlib.pyplot as plt
import sounddevice as sd

class SoundFile:
def __init__(self, file_name=None):
# https://docs.python.org/3.6/library/wave.html
pass

def write(self, file_name, signal, nchannels=1, sampwidth=2, framerate=44100, duration_sec = 4, comptype="NONE", compname="noncompressed"):
file = wave.open(file_name, 'wb')
file.setparams( ( nchannels, sampwidth, framerate, framerate * duration_sec, comptype, compname) )
file.writeframes( signal )
file.close()

def read(self, file_name):
file = wave.open(file_name, 'rb')
nchannels, sampwidth, framerate, nframes, comptype, compname = file.getparams()
duration_sec = nframes / framerate
signal = file.readframes( nframes )
signal = np.frombuffer(signal)
file.close()
return signal, nchannels, sampwidth, framerate, duration_sec, nframes, comptype, compname


사용 예시 코드

sf = SoundFile()
file_name = "test.wav"
time = np.arange(0, 5000, 0.02);
amplitude = np.sin(time)
plt.plot(time, amplitude)
sd.play(amplitude, samplerate)
sf.write(file_name, amplitude)
signal, nchannels, sampwidth, framerate, duration_sec, nframes, comptype, compname = sf.read("test.wav")

sd.play(signal, samplerate)





Sound Level 측정 함수

아래의 코드는 decibel을 측정하는 것은 아니다. 말그대로 상대적 sound level이다.
import sounddevice as sd
from numpy import linalg as LA
import numpy as np

duration = 10 # seconds

def print_sound(indata, outdata, frames, time, status):
volume_norm = np.linalg.norm(indata)*10
print (int(volume_norm))

with sd.Stream(callback=print_sound):
sd.sleep(duration * 1000)



Wav file에서 Decibel 계산하기

일단 decibel의 정확한 정의는 상대적인 값이다. 따라서 reference signal과 calibration이 없으면 정확한 의미의 decibel은 구현할 수가 없다.
그러나 대부분의 wave-file 편집기들은 decibel 값을 제공하고 있으며, 이는 매우 단순한 계산 공식을 따른다.

dB = 20 * log10(amplitude)

따라서 우리도 이와 같은 간단한 방법으로 dB를 측정해볼 수 있다.



Sound Pressure Level


Decibel




Decibel Level 연산 library

여기에는 wav로부터 decibel을 계산해주는 것은 구현되지 않음. dB Level 간의 energetic 연산만 구현되어 있음.
pip install acoustics



Sound 처리 관련 라이브러리

soundmeter

pip install soundmeter --allow-all-external --allow-unverified pyaudio

https://github.com/shichao-an/soundmeter


audioop

https://docs.python.org/2/library/audioop.html#module-audioop




PySox

Sox의 python wrapper이다. Sox가 매우 다양한 소리에 대한 전처리 및 기능을 cli로 제공하고 있는데, 이를 python으로 warpping한 것이다.

pip install sox

https://github.com/rabitt/pysox





Library Pydub 

wav file을 mp3로 변환해준다.


설치방법

pip install pydub





댓글0