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

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

ただいまの
回答率

90.32%

  • Python 3.x

    7435questions

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

  • Docker

    808questions

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

  • docker-compose

    162questions

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 245

ascreit

score 1

 前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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で質問しよう!

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    7435questions

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

  • Docker

    808questions

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

  • docker-compose

    162questions