2021년 2월 8일 월요일

[우분투의 사운드와 MIDI] PulseAudiuo를 쓰면 특정 애플리케이션의 재생음만을 녹음할 수 있다

메트로놈 앱과 FluidSynth를 같이 실행한 상태에서 컴퓨터에 연결한 MIDI 키보드 콘트롤러를 이용하여 나의 연주를 녹음하려고 한다. 나는 워낙 박자치라서(자꾸 빨라짐) 메트로놈이 꼭 필요하다. FluidSynth의 소리만 녹음하려면 어떻게 해야 할까? JACK + Audacity라면 그다지 어렵지 않을 것이다. 그러나 나는 명령행에서 직접 녹음을 하고 싶다.

지금까지는 펄스오디오의 module-null-sink와 module-loopback을 이용하는 방법을 공부해 왔다. 하지만 오늘 실현하고 싶은 것은 성격이 약간 다르다. 검색을 통해 알아낸 것은 move-sink-input이라는 모듈과 parec 명령어이다. 더욱 깊숙하게 들어간다면 oggenc 또는 lame도 알아야 한다. Ogg는 멀티미디어 컨테이너 포맷으로서 특허권으로 보호되지 않는 오픈 표준 파일 형식이라 한다. MP3와 비교하자면 용량 대비 음질이 좋고, 라이센스 비용(MP3 재생기 제조사의 경우)이 들지 않는다고 한다. 리눅스 매뉴얼에 의하면:

  • oggenc reads audio data in either raw, WAV, or AIFF format and encodes it into an Ogg Vorbis stream.
  • LAME is a program which can be used to create compressed audio files. (Lame ain't an MP3 encoder 음?).

이 과정을 편리하게 실행해 주는 스크립트인 pulse-recorder.bash라는 것이 있다. 뒤에서 좀 더 자세히 다루도록 하겠다.

USB 오디오 인터페이스를 연결한 상태라면 메트로놈 소리는 컴퓨터의 내장 스피커로, FluidSynth의 소리는 USB 오디오 인터페이스로 보내면 될 것만 같다. 과연 그럴까?

PulseAudio Volume Control의 Playback 탭에서 Orange Metronome의 소리를 '내장 오디오 아날로그 스테레오'로 나오게 하면 될 것만 같다. 그러나 '딱' 소리가 나는 순간에만 Playback 탭에 메트로놈 앱이 살짝 나오고 사라진다. 도저히 현실적으로 이를 클릭하여 바꾸지를 못한다.

Audacity의 생성(G) 메뉴에서 'Rhythm Track...'을 생성하여 넣은 뒤 재생을 개시하면 PulseAudio Volume Control의 Playback 탭에서 지속적으로 표시되므로 출력 방향을 바꿀 수는 있다.

보다 근본적인 해결책은 PulseAudio에서 제공한다. 이미 누군가에 의해 pulse-recorder.bash라는 스크립트가 나와 있다. 작동 과정을 살펴보면 녹음을 하려는 애플리케이션을 null sink로 보내고, 그것의 모니터 출력을 loopback으로 보내어 녹음을 하는 것이다. 이 글의 도입부에서 굵은 글씨로 표현한 것들이 이 스크립트에서 쓰인다. 다음은 실행 사례이다. 약간의 오해가 있어서 ogg 파일로 녹음하도록 스크립트를 수정했던 것에 대한 실행 화면을 기록하였다. 

hyjeong@CQ61:~/bin$ pulse-recorder.bash 
    index: 2021
		application.name = "ALSA plug-in [fluidsynth]"
		module-stream-restore.id = "sink-input-by-application-name:ALSA plug-in [fluidsynth]"
Choose recording index: 2021
temp.ogg file already exist, replace (y/n)? y
Encoding standard input to 
         "temp.ogg" 
at approximate bitrate 192 kbps (VBR encoding enabled)
	Encoding [ 0m11s so far] / # Ctrl+C를 눌러 종료
hyjeong@CQ61:~/bin$

이 스크립트를 사용하면 Orange Metronome의 index를 확인할 수 있다(application.name = "libao[ogg123]"). 녹음을 하는 명령줄은 다음과 같은데, 만들어진 mp3 파일은 aplay에서 제대로 재생이 되지 않았다. 아, 될 턱이 없지. mp3 파일은 aplay가 아니라 play 유틸리티로 재생할 수 있다.

$ parec --format=s16le -d record-n-play.monitor | lame -r -q 3 --lowpass 17 --abr 192 - "temp.mp3"

다음과 같이 ogg 파일로 녹음해도 된다. Ogg 파일을 재생할 수 없는 상황이라면 SoX를 사용하여 ogg를 mp3로 전환할 수 있다('sox file.ogg file.mp3'). 오디오 파일 기록과 전환에 관한 유틸리티, 그리고 pulse-recorder.bash 원본 스크립트가 제대로 이해하려면 공부가 필요하다. 도대체 이 많은 옵션 및 파라미터의 기능을 언제 다 찾아본단 말인가? 배움은 더디고, 찾아볼 것은 많다...

$ parec -d record-n-play.monitor | oggenc -b 192 -o temp.ogg --raw -

명령어를 직접 입력하여 이 기능을 따라하고 싶다면 다음 사이트를 참조한다. 많은 공부가 되는 웹사이트이다.

[Ask Ubuntu] Record a program's output with PulseAudio

parec 명령어를 직접 쓸 일은 많지 않으나, PulseAudio의 기능을 익히는 데는 좋은 재료가 된다. 다음의 사이트도 검토해 보자.

[Ask Ubuntu] How can I record the audio output using sox?

댓글 없음: