質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

6919閲覧

ubuntuのdockerコンテナでpythonから録音したい

ascreit

総合スコア7

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2018/07/21 16:45

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Bash

1root@418e4d643374:/home/python# lsusb 2Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub 3Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver 4Bus 001 Device 008: ID 0d8c:0134 C-Media Electronics, Inc. 5Bus 001 Device 004: ID 8087:0aa7 Intel Corp. 6Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 7

このC-Media Electronics, Incがマイクのようで、inputの値にこれのDeviceID(8)を入れると動きました。
このデバイスIDはusbを抜き差しするたびに変わるみたいです...
プログラム側でこのIDを特定する方法があれば教えてください

投稿2018/07/21 17:53

ascreit

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問