ubuntuのdockerコンテナでpythonから録音したい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 957
前提・実現したいこと
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マイクを正しく選択できていないからだと思います。
cat /proc/asound/modules
0 snd_hda_intel
1 snd_hda_intel
2 snd_usb_audio
該当のソースコード
test2.py
ちなみに、indexの値を0か1にするとエラーはなくなりますが、録音できません
# -*- coding: utf-8 -*
import pyaudio
import wave
def main():
rec_time = 5 # 録音時間[s]
file_path = "output.wav" #音声を保存するファイル名
fmt = pyaudio.paInt16 # 音声のフォーマット
ch = 1 # チャンネル1(モノラル)
sampling_rate = 44100 # サンプリング周波数
chunk = 2**11 # チャンク(データ点数)
audio = pyaudio.PyAudio()
index = 2 # 録音デバイスのインデックス番号(デフォルト1)
stream = audio.open(format=fmt, channels=ch, rate=sampling_rate, input=True,
input_device_index = index,
frames_per_buffer=chunk)
print("recording start...")
# 録音処理
frames = []
for i in range(0, int(sampling_rate / chunk * rec_time)):
data = stream.read(chunk, exception_on_overflow = False)
frames.append(data)
print("recording end...")
# 録音終了処理
stream.stop_stream()
stream.close()
audio.terminate()
# 録音データをファイルに保存
wav = wave.open(file_path, 'wb')
wav.setnchannels(ch)
wav.setsampwidth(audio.get_sample_size(fmt))
wav.setframerate(sampling_rate)
wav.writeframes(b''.join(frames))
wav.close()
if __name__ == '__main__':
main()
Dockerfile
FROM ubuntu:18.04
ENV TZ=Asia/Tokyo
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y tzdata alsa-utils wget sptk tk-dev
RUN apt-get install -y python3-pip portaudio19-dev python3-tk
RUN apt-get install -y vim usbutils
RUN pip3 install pyaudio numpy matplotlib
docker-compose.yml
version: '2'
services:
python:
build: ./
volumes:
- ./python:/home/python
- /tmp/.X11-unix/:/tmp/.X11-unix/
environment:
- "DISPLAY=$DISPLAY"
devices:
- /dev/snd
- /dev/usb
working_dir: "/home/python"
privileged: true
restart: always
tty: true
試したこと
コンテナ内で下記コマンド実行(何も聞こえない)
ホストで同じコマンドを叩いた場合は正常に聞こえます
arecord -f S16_LE -r 44100 | aplay
適当なwavファイル(a.wav)を拾ってきて再生(ホスト・コンテナ内どちらも再生できる)
aplay a.wav
コンテナ内で実行(ホストで実行したときも全く同じ結果)
arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 2: ALC892 Alt Analog [ALC892 Alt Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Device [USB PnP Audio Device], device 0: USB Audio [USB Audio]
Subdevices: 0/1
Subdevice #0: subdevice #0
cat /proc/asound/devices
1: : sequencer
2: [ 2] : control
3: [ 2- 0]: digital audio capture
4: [ 0] : control
5: [ 0- 0]: digital audio playback
6: [ 0- 0]: digital audio capture
7: [ 0- 2]: digital audio capture
8: [ 0- 0]: hardware dependent
9: [ 1] : control
10: [ 1- 3]: digital audio playback
11: [ 1- 7]: digital audio playback
12: [ 1- 8]: digital audio playback
13: [ 1- 9]: digital audio playback
14: [ 1- 0]: hardware dependent
33: : timer
cat /proc/asound/modules
0 snd_hda_intel
1 snd_hda_intel
2 snd_usb_audio
コンテナ内で実行(録音できている)
arecord -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
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
root@418e4d643374:/home/python# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 008: ID 0d8c:0134 C-Media Electronics, Inc.
Bus 001 Device 004: ID 8087:0aa7 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
このC-Media Electronics, Incがマイクのようで、inputの値にこれのDeviceID(8)を入れると動きました。
このデバイスIDはusbを抜き差しするたびに変わるみたいです...
プログラム側でこのIDを特定する方法があれば教えてください
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.97%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる