실시간 음향 처리를 위한 python module 사용법
참조한 youtube link
https://www.youtube.com/watch?v=AShHJdSIxkY
PyAudio는 cross-platform 오디오 I/O 라이브러리인 PortAudio에 대한 Python 바인딩을 제공한다.
PyAudio는 Python을 통해 Linux, Windows, Mac OS와 같은 다양한 플랫폼에서 오디오를 쉽게 재생/녹음할 수 있는 기능을 제공한다.
http://people.csail.mit.edu/hubert/pyaudio/
CHUNK : the (arbitrarily chosen) number of frames the (potentially very long) signals are split into in this example
rate : Sampling rate
Channels : number of channels
format : Sampling size and format
input : Specifies whether this is an input stream
output : Specifies whether this is an output stream
PyAudio와 librosa 같이 설치하기
Anaconda install
conda env 생성 후,
pip install librosa
conda install pyaudio
본 과제에서 요구하는 기능은 풍물/사물놀이 음향 데이터(form 마이크)를 받았을 때 harmonic과 percussive를 나누어 이를 활용하여 드론을 제어하는 것
컴퓨터에 연결된 blue yeti 마이크를 input channel로 audio stream을 받아서 이를 실시간으로 처리함
관련 코드
class AudioHandler(object):
def __init__(self):
self.FORMAT = pyaudio.paFloat32
self.CHANNELS = 1
self.RATE = 44100
self.CHUNK = 1024 * 2
self.p = None
self.stream = None
self.WAVE_OUTPUT_FILENAME = "output.wave"
self.RECORD_SECONDS = 5
self.frames = []
self.data = []
self.arr = np.array([])
self.recording = True
def start(self):
self.p = pyaudio.PyAudio()
self.stream = self.p.open(format=self.FORMAT,
channels=self.CHANNELS,
rate=self.RATE,
input=True,
output=False,
stream_callback=self.callback,
frames_per_buffer=self.CHUNK)
audio stream을 실시간으로 처리하기 위하여 stream_callback 활용, callback 함수를 call함
def callback(self, in_data, frame_count, time_info, flag):
numpy_array = np.frombuffer(in_data, dtype=np.float32)
y_harmonic, y_percussive = librosa.effects.hpss(numpy_array)
self.arr = np.append(self.arr,y_percussive)
print(sys.getsizeof(self.arr))
해당 callback 함수 내 librosa 라이브러리를 활용하여 percussive audio data 구분
librosa.effects.hpss의 input은 numpy array를 받으며, output 또한 numpy array(harmonic / percussive)
np.append는 numpy array의 append
현재는 mainloop에서 특정 key 입력을 받으면 append된 numpy array를 wav 파일로서 출력하는 형태로 개발함
이 때 사용한 라이브러리는 soundfile
sf.write('output_percussive.wav',self.arr,self.RATE)
--> 마이크로부터 실시간으로 들어오는 audio stream을 time window로 구분, 구분된 stream의 평균 audio 세기에 따라 드론이 움직이는 함수 추가 개발 예정
2021.06.30. 추가
Real-time audio segmentation 관련 참조
https://github.com/tyiannak/pyAudioAnalysis
참조 블로그
https://hyongdoc.tistory.com/400?category=884319
https://dacon.io/competitions/official/235616/codeshare/1305?page=1&dtype=recent
https://sanghyu.tistory.com/45
사물놀이 주파수 관련 논문
https://www.dbpia.co.kr/Journal/articleDetail?nodeId=NODE00536716
Matplot for display spectrum
https://gist.github.com/sshh12/62c740b329229c7292f2a7b520b0b6f3
MFCC 관련 설명 블로그
* https://brightwon.tistory.com/11
http://keunwoochoi.blogspot.com/2016/03/2.html
https://hyunlee103.tistory.com/45
'Research > Projects' 카테고리의 다른 글
30주년 연구 중간점검과 간단한 뒤풀이 (0) | 2021.08.27 |
---|---|
Audio pitch estimation (0) | 2021.07.19 |