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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python

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

Q&A

解決済

1回答

721閲覧

PythonのSimpleAudioで再生機器を指定したい

kwkwkw

総合スコア13

Python

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

0グッド

0クリップ

投稿2023/09/21 15:27

実現したいこと

現在、pythonで音を流すために

simpleaudio.play_buffer(audiodata, num_channels, bytes_per_sample, sample_rate)

を使っていますが、音を再生するスピーカーがWindowsで設定した既定のデバイスになってしまいます。これをWindowsの既定デバイスとは違ったものに音を再生させたいと思っています。

前提

SoundDeviceというライブラリーでは、

sd.default.device = [0,1]

のように記述することは知っていますが、SoundDeviceを使用したくありません。その理由として、Numpy配列の音を再生したいと思っており、SoundDeviceや他の再生するライブラリーをNumpy配列から再生しようとしても音に無視できないほどのノイズが入って正しく再生されず、simpleaudioだけうまくいったからです。

試したこと

simpleaudioのライブラリー内に、

import simpleaudio._simpleaudio as _sa def play_buffer(audio_data, num_channels, bytes_per_sample, sample_rate): play_id = _sa._play_buffer(audio_data, num_channels, bytes_per_sample, sample_rate) return PlayObject(play_id)

というコードがありましたが、_simpleaudioに飛ぼうとしても「ファイルが見つからなかったため、エディターを開くことが出来ませんでした。」と表示されました。

出来ればsimpleaudioを用いて再生するデバイスを変更する方法を教えてほしいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

お力になれずすみませんが、おそらくsimpleaudio単体では不可能だと思います。

以下のソースコードのコメントにある通り「デフォルト音声出力デバイスへの出力」に固定されてしまっています。
https://github.com/hamiltron/py-simple-audio/blob/1.0.4/c_src/simpleaudio_win.c#L171-L172

同じような要望として「Linuxで再生デバイスを選択したい」という要望が2016年に上がっています。
しかし、作者の時間的な制約によりこの機能の実装はされず現在にいたります。
https://github.com/hamiltron/py-simple-audio/issues/11

※余談ですが、作者は代替としてあなたが提示しているSoundDeviceを紹介しています。

それでもsimpleaudioを利用するのであれば、たとえば力技ですがplay_bufferを実行する直前に何かしらの方法でWindowsのデフォルトの音声出力デバイスを変更することで実現できるかと思いますが、ちょっと現実的ではないと思います。

ちなみに、_simpleaudio ですが、これはC言語で実装された関数になっているため、PythonのコードとしてはIDEなどジャンプすることはできないと思います。
以下で実装されています。

https://github.com/hamiltron/py-simple-audio/blob/1.0.4/c_src/simpleaudio.c#L190

直接の解決にはなっていませんが、ご参考になれば幸いです。

投稿2023/09/21 16:20

編集2023/09/22 06:32
toge_

総合スコア308

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

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

kwkwkw

2023/09/22 05:51

解答ありがとうございます。大変参考になりました。 教えていただいた、waveOutOpen関数の第二引数である"uDeviceID"にデバイス識別子を入力すればできそうな感じだと思いました。 https://learn.microsoft.com/ja-jp/windows/win32/api/mmeapi/nf-mmeapi-waveoutopen 例えば、コードをC言語で編集したのちに、pythonで利用できるファイルに変更すれば実装可能でしょうか。「できるかもしれません」などの曖昧なものでもいいので回答していただけるとありがたいです。
toge_

2023/09/22 07:58 編集

はい、uDeviceIDに0以外の値を入れることでデフォルト以外の音声出力デバイスを選択できるようになります。 0以外の値にしてしまうと、出力デバイスが一つしかない環境では動作しなくなってしまうため、 waveOutGetNumDevsでデバイス数を確認したり、waveOutGetDevCapsでデバイス名を確認したりする必要があるかもしれません。 汎用的にやろうとすればどこまでもできてしまうので、どこかで妥協が必要ですね。 該当のソースを変更した後は、C言語のソースをコンパイルする環境が必要になります。 おそらくVisual Studioをインストールするのが一番簡単だと思います。 今手元にWindows環境がないので確認ができませんが、以下のような手順でできた気がします。 1. Visual Studioをインストール 2. スタートメニューに登録される「C/C++用コマンドプロンプト」といったアプリを起動 3. 編集したsimpleaudioのソースのフォルダに移動 4. 環境変数DISTUTILS_USE_SDKとMSSdkを1に設定 5. python setup.py installを実行 この通りの手順だけでは不足していると思いますが、ヒントぐらいになれば幸いです。
kwkwkw

2023/09/22 07:48

環境構築まで本当に丁寧に教えていただきありがとうございます。以前C言語を触っていたこともあるので、なんとかして実装してみようかと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問