2020년 12월 21일 월요일

우분투 명령행에서 USB 마이크로폰으로 녹음하기

SoX 유틸리티의 rec 명령어를 써서 USB 마이크 입력 녹음을 해 보고 싶었는데 사용법이 너무 복잡하여 도대체 어떻게 해야 하는지를 이해하기 어렵다. 검색을 통해서 alsa-utils에 포함된 프로그램으로서 사용하기 무난한 arecord를 쓰기로 하였다. 컴퓨터에 연결된 입력 디바이스의 샘플 레이트를 먼저 확인해 본다.

$ pactl list short sinks
0	alsa_output.pci-0000_00_1b.0.hdmi-stereo	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED
1	alsa_output.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-stereo	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED

44.1 kHz라고? 48kHz로 알고 있는데 무슨 영문인지 모르겠다. 's16le'는 signed 16-bit little endian을 의미하는 sample format이다. arecord에서는 -f로 이를 지정한다. 특별히 지정하지 않으면 unsigned 8-bit('-f U8'과 같다)로 녹음이 되는데 음질은 형편없다.

다른 옵션에 대하여 심각하게 생각하지 않고 5초간 마이크로 녹음을 시도한다. 입력 디바이스를 명령행 옵션으로 지정하지 않았음에도 불구하고 원하는대로 마이크가 작동될 것인가?

$ arecord -f S16_LE -r 60000 -d 5 test.mp3
녹음 WAVE 'test.mp3' : Signed 16 bit Little Endian, 60000 Hz 비율, 모노
$ play test.mp3 
play WARN alsa: can't encode 0-bit Unknown or not applicable

test.mp3:

 File Size: 600k      Bit Rate: 960k
  Encoding: Signed PCM    
  Channels: 1 @ 16-bit   
Samplerate: 60000Hz      
Replaygain: off         
  Duration: 00:00:05.00  

In:100%  00:00:05.00 [00:00:00.00] Out:300k  [      |      ]        Clip:0    
Done.

60 kHz(-r  또는 --rate=#, 단위는 Hz)로 녹음이 잘 되었다. 가능한 값이 아닌데 어떻게 녹음이 된 것일까? 미스테리는 차차 풀기로 한다. 녹음할 시간을 미리 지정하기 싫다면 -d 0 옵션을 주어 녹음을 개시한 뒤 Ctrl+C를 눌러서 종료하면 된다. 기본값이 0이니 아예 -d 옵션을 주지 않아도 된다. 저장할 파일의 확장자에 따라서 출력 파일의 형식은 자동으로 결정된다.

입력을 받을 오디오 기기에 대한 정보를 전혀 주지 않았음에도 불구하고 알아서 USB 마이크로 입력이 잘 되었다. 아마도 PulseAudio가 개입하여 우선 순위 입출력 기기를 알아서 결정하고 있는 듯하다. USB 마이크로폰이 꽂혀 있지만 노트북 컴퓨터의 내장 마이크로폰을 사용하여 녹음하게 만들 수는 없을까? -D hw:#,#(select PCM by name) 옵션으로 디바이스를 선택할 수 있다고 하는데, (0.0)으로는 잘 되지 않는다. 

$ arecord -f S16_LE -r 44100 -d 5 -D hw:0,0 test.mp3
녹음 WAVE 'test.mp3' : Signed 16 bit Little Endian, 44100 Hz 비율, 모노
arecord: set_params:1305: 사용할 수 없는 채널 수입니다
hyjeong@CQ61:~$ arecord -f S16_LE -r 44100 -d 5 -D hw:1,0 test.mp3
녹음 WAVE 'test.mp3' : Signed 16 bit Little Endian, 44100 Hz 비율, 모노
$ arecord -f S16_LE -r 60000 -d 5 -D hw:1,0 test.mp3
녹음 WAVE 'test.mp3' : Signed 16 bit Little Endian, 60000 Hz 비율, 모노
경고: 비율이 정확하지 않습니다(요청함 = 60000Hz, 가져옴 = 48000Hz)
         플러그인 를, 연결해보십시오

-D hw:1,0이 USB 마이크로폰을 가리키는 것은 맞다. 그런데 이를 지정하지 않으면 -r 60000이라는 비상식적인 샘플링 레이트로 녹음이 되지만, -D hw:1,0을 지정하면 정확하지 않다면서 자동으로 48 kHz를 선택한다. 

-D default를 입력하면 여전히 USB 마이크로폰으로 녹음이 된다. 분명히 현 상태에서는 hw:1,0이 default인 것이 맞다. 컴퓨터 내장 마이크로는 녹음을 할 수가 없는가? 내가 뭘 잘못 알고 있는 것인지...

디바이스를 지정하지 않은 상태에서 녹음을 하면서 PulseAudio Volume Control을 열어 보았다.

내장 마이크에 해당하는 입력 디바이스는 보이지 않는다. 에혀~ 나도 모르겠다.

Audacity에서 USB 마이크로폰으로 녹음하는 것도 미스테리!

웹캠 캡처용 프로그램(예: Guvcview)으로 녹음을 할 때에는 PulseAudio로 오디오 콘트롤을 설정하는 것 말고는 특별히 할 일이 없다. 그러나 Audacity로 마이크 입력 녹음을 하려면 JACK 서버를 미리 구동해야 한다. 아, 정말 모르겠다! 유튜브에서 재생되는 음악이나 악기(가상악기 또는 MIDI 장비의 아날로그 출력)를 audacity에서 녹음할 때에는 JACK의 도움을 필요로 하지 않았었다. 올해 내내 리눅스에서 음악을 다루는 - 단지 듣기만 할 때에는 별다른 문제가 없음 - 문제와 씨름을 하고 있는데 아직도 많은 구석이 미스테리로 남아 있다. PulseAudio 설정 예제를 보고만 있어도 머릿속이 하얗게 표백되는 것 같은 느낌이 든다.

댓글 없음: