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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2735閲覧

Macで録音をしたい!

yamasandayo

総合スコア6

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2020/10/29 07:50

python3.7をMacBookで使っています。現在、音声を録音したいと思い。sounddeviceやpyaudioをインストールしました。ネットの情報を参考にしながら、録音を行っているのですが、Macbookのマイクが全く認識されません。マイクを検索できます。

% python3 -m sounddevice 0 Built-in Microphone, Core Audio (2 in, 0 out) 1 Built-in Output, Core Audio (0 in, 2 out) > 2 Logitech USB Headset, Core Audio (1 in, 0 out) < 3 Logitech USB Headset, Core Audio (0 in, 2 out)

しかし、下記のようにインデックスを入力するとエラーが出てきて認識することができません。

python

1import sounddevice as sd 2import numpy as np 3# sd.default.device = [in, out]のように、入出力で別々にアサイン 4sd.default.device = [0,1]
% python3 sounddevice.py Traceback (most recent call last): File "sounddevice.py", line 1, in <module> import sounddevice as sd File "/Users/itsuki/Documents/音の再生・録音/sounddevice.py", line 6, in <module> sd.default.device = [0,1] AttributeError: module 'sounddevice' has no attribute 'default'

そのため、pyaudioでも試して見たのですが、こちらはエラーはでませんが、値を全く拾っていないため、こちらもマイクの入力ができていないと思われます。

python

1import pyaudio 2import numpy as np 3from matplotlib import pyplot as plt 4 5 6DEVICE_INDEX = 0 7CHUNK = 1024 8FORMAT = pyaudio.paInt16 # 16bit 9CHANNELS = 1 # monaural 10RATE = 44100 # sampling frequency [Hz] 11time = 3 # 計測時間[s] 12 13def record(): 14 pa = pyaudio.PyAudio() 15 data = [] 16 dt = 1 / RATE 17 18 print("recording ...") 19 20 # ストリームの開始 21 stream = pa.open(format=FORMAT, 22 channels=CHANNELS, 23 rate=RATE, 24 input=True, 25 input_device_index = DEVICE_INDEX, 26 frames_per_buffer=CHUNK) 27 28 29 frames = [] 30 # フレームサイズ毎に音声を録音していくループ 31 for i in range(0, int(RATE / CHUNK * time)): 32 frame = stream.read(CHUNK) 33 data.append(frame) 34 35 # ストリームの終了 36 stream.stop_stream() 37 stream.close() 38 pa.terminate() 39 40 # データをまとめる処理 41 data = b"".join(data) 42 43 # データをNumpy配列に変換 44 data = np.frombuffer(data, dtype="int16") / \ 45 float((np.power(2, 16) / 2) - 1) 46 47 return data, i 48 49wfm, i = record() 50t = np.arange(0, CHUNK * (i+1) * (1 / RATE), 1 / RATE) 51 52# ここからグラフ描画 53# フォントの種類とサイズを設定する。 54plt.rcParams['font.size'] = 14 55plt.rcParams['font.family'] = 'Times New Roman' 56 57# 目盛を内側にする。 58plt.rcParams['xtick.direction'] = 'in' 59plt.rcParams['ytick.direction'] = 'in' 60 61# グラフの上下左右に目盛線を付ける。 62fig = plt.figure() 63ax1 = fig.add_subplot(111) 64ax1.yaxis.set_ticks_position('both') 65ax1.xaxis.set_ticks_position('both') 66 67# 軸のラベルを設定する。 68ax1.set_xlabel('Time [s]') 69ax1.set_ylabel('Sound pressure [Pa]') 70 71# データプロットの準備とともに、ラベルと線の太さ、凡例の設置を行う。 72ax1.plot(t, wfm, label='signal', lw=1) 73 74fig.tight_layout() 75 76# グラフを表示する。 77plt.show() 78plt.close() 79

イメージ説明

原因が分かる方がいれば、教えていただけるようお願い致します。

nanami0741👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

AttributeErrorの原因と回避方法

まず前半の

AttributeError : module 'sounddevice' has no attribute 'default'

が発生する件ですが、これは実行しようとしているスクリプトを「sounddevice.py」という名前にしているのが原因と思われます。

読み込もうとしているモジュール(sounddevice)と同じ名前のスクリプトを実行しようとすると、
名前が競合し、本来のsounddeviceモジュールがうまく読み込まれません。
したがって、適当な別の名前(my_audio_test.pyなど)で保存し直してください。

グラフが平坦になっている原因と回避方法

また、後半のグラフが平坦になっている原因ですが、これは(最近の)macプラットフォーム特有の事象です。
スクリプト自体は正常に動いているのですが、VSCodeなど、一部の開発用アプリケーション上でスクリプトを実行した場合、OSへのアクセス権限許可申請プロセスが発火せず、スクリプト側はアクセス許可なしで普通に実行されます。
一方、OS自体はマイク音声へのアクセス許可を発行していません。
結果、スクリプト側は無音の音声データを受け取ることになるため、グラフが平坦(音声ゼロのデータ)となってしまうのです。

これを回避するには、スクリプトを、VSCode等の開発環境上のターミナルではなく、通常のターミナルApp上で実行します。
すると、マイクへのアクセス権限許可ダイアログが出るはずなので、これを許可すれば、正常に録音され、
音声波形データのグラフが表示されます。
(もちろんマイクが正常につながっており、デバイス番号が正常に設定されていることが前提です)

投稿2020/10/29 14:49

編集2020/10/29 15:00
sfdust

総合スコア1135

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

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

yamasandayo

2020/10/30 00:20

ありがとうございます。 一つ目はファイル名を変更することで解決し、二つ目もVScodeではなくターミナルで実行することで録音することができました。 同様のプログラムはwindows10では録音できていたため、原因がわからず、半ばあきらめていたため、本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問