前提・実現したいこと
Dockerでコンテナ内でpythonから録音・再生をしたい(pyaudio使用)
発生している問題・エラーメッセージ
root@418e4d643374:/home/python# python3 test2.py ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map Expression 'parameters->channelCount <= maxChans' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1514 Expression 'ValidateParameters( inputParameters, hostApi, StreamDirection_In )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2818 Traceback (most recent call last): File "test2.py", line 42, in <module> main() File "test2.py", line 17, in main frames_per_buffer=chunk) File "/usr/local/lib/python3.6/dist-packages/pyaudio.py", line 750, in open stream = Stream(self, *args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/pyaudio.py", line 441, in __init__ self._stream = pa.open(**arguments) OSError: [Errno -9998] Invalid number of channels
おそらく、使いたいUSBマイクを正しく選択できていないからだと思います。
Bash
1cat /proc/asound/modules 2 0 snd_hda_intel 3 1 snd_hda_intel 4 2 snd_usb_audio
該当のソースコード
test2.py
ちなみに、indexの値を0か1にするとエラーはなくなりますが、録音できません
python
1# -*- coding: utf-8 -* 2import pyaudio 3import wave 4 5def main(): 6 rec_time = 5 # 録音時間[s] 7 file_path = "output.wav" #音声を保存するファイル名 8 fmt = pyaudio.paInt16 # 音声のフォーマット 9 ch = 1 # チャンネル1(モノラル) 10 sampling_rate = 44100 # サンプリング周波数 11 chunk = 2**11 # チャンク(データ点数) 12 audio = pyaudio.PyAudio() 13 index = 2 # 録音デバイスのインデックス番号(デフォルト1) 14 15 stream = audio.open(format=fmt, channels=ch, rate=sampling_rate, input=True, 16 input_device_index = index, 17 frames_per_buffer=chunk) 18 print("recording start...") 19 20 # 録音処理 21 frames = [] 22 for i in range(0, int(sampling_rate / chunk * rec_time)): 23 data = stream.read(chunk, exception_on_overflow = False) 24 frames.append(data) 25 26 print("recording end...") 27 28 # 録音終了処理 29 stream.stop_stream() 30 stream.close() 31 audio.terminate() 32 33 # 録音データをファイルに保存 34 wav = wave.open(file_path, 'wb') 35 wav.setnchannels(ch) 36 wav.setsampwidth(audio.get_sample_size(fmt)) 37 wav.setframerate(sampling_rate) 38 wav.writeframes(b''.join(frames)) 39 wav.close() 40 41if __name__ == '__main__': 42 main() 43
Dockerfile
Dockerfile
1FROM ubuntu:18.04 2ENV TZ=Asia/Tokyo 3ENV DEBIAN_FRONTEND=noninteractive 4RUN apt-get update 5RUN apt-get install -y tzdata alsa-utils wget sptk tk-dev 6RUN apt-get install -y python3-pip portaudio19-dev python3-tk 7RUN apt-get install -y vim usbutils 8RUN pip3 install pyaudio numpy matplotlib 9
docker-compose.yml
docker
1version: '2' 2services: 3 python: 4 build: ./ 5 volumes: 6 - ./python:/home/python 7 - /tmp/.X11-unix/:/tmp/.X11-unix/ 8 environment: 9 - "DISPLAY=$DISPLAY" 10 devices: 11 - /dev/snd 12 - /dev/usb 13 working_dir: "/home/python" 14 privileged: true 15 restart: always 16 tty: true
試したこと
コンテナ内で下記コマンド実行(何も聞こえない)
ホストで同じコマンドを叩いた場合は正常に聞こえます
bash
1arecord -f S16_LE -r 44100 | aplay
適当なwavファイル(a.wav)を拾ってきて再生(ホスト・コンテナ内どちらも再生できる)
bash
1aplay a.wav
コンテナ内で実行(ホストで実行したときも全く同じ結果)
bash
1arecord -l 2**** List of CAPTURE Hardware Devices **** 3card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog] 4 Subdevices: 1/1 5 Subdevice #0: subdevice #0 6card 0: PCH [HDA Intel PCH], device 2: ALC892 Alt Analog [ALC892 Alt Analog] 7 Subdevices: 1/1 8 Subdevice #0: subdevice #0 9card 2: Device [USB PnP Audio Device], device 0: USB Audio [USB Audio] 10 Subdevices: 0/1 11 Subdevice #0: subdevice #0 12
Bash
1cat /proc/asound/devices 2 1: : sequencer 3 2: [ 2] : control 4 3: [ 2- 0]: digital audio capture 5 4: [ 0] : control 6 5: [ 0- 0]: digital audio playback 7 6: [ 0- 0]: digital audio capture 8 7: [ 0- 2]: digital audio capture 9 8: [ 0- 0]: hardware dependent 10 9: [ 1] : control 11 10: [ 1- 3]: digital audio playback 12 11: [ 1- 7]: digital audio playback 13 12: [ 1- 8]: digital audio playback 14 13: [ 1- 9]: digital audio playback 15 14: [ 1- 0]: hardware dependent 16 33: : timer
Bash
1cat /proc/asound/modules 2 0 snd_hda_intel 3 1 snd_hda_intel 4 2 snd_usb_audio
コンテナ内で実行(録音できている)
bash
1arecord -D hw:2,0 record.wav
補足情報(FW/ツールのバージョンなど)
Python3.6.5
Docker version 18.03.1-ce
docker-compose version 1.22.0-rc2
ホストOS:ubuntu:18.04
コンテナOS:ubuntu:18.04

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。