Как вызвать пакет звукового устройства Python на встроенном выходе - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь записать аудиовыход компьютера (не вход в микрофон, а ввод в динамики - до того, как он покинет устройство) на Mac OS X 10.14.1 с python3 и sounddevice.

Как выКак видно из следующей трассировки, я перепробовал каждое разумное количество входных каналов и количество входных каналов по умолчанию, но не повезло.Я также посмотрел исходный код, но не смог определить мою проблему.

Есть ли способ записи потока вывода звука в моей системе?

Python 3.6.2 (v3.6.2:5fd33b5926, Jul 16 2017, 20:11:06) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sounddevice as sd
>>> sd.query_devices()
> 0 Built-in Microphone, Core Audio (2 in, 0 out)
< 1 Built-in Output, Core Audio (0 in, 2 out)
>>> sd.default.device = 1
>>> print("Channels should be 0 (number of input channels) or 2 (number of output channels)")
Channels should be 0 (number of input channels) or 2 (number of output channels)
>>> duration = 10
>>> fs = 44100
>>> x = sd.rec(int(duration * fs), samplerate=fs, channels=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 224, in rec
    ctx.input_dtype, callback, blocking, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 2417, in start_stream
    **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 1301, in __init__
    **_remove_self(locals()))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 780, in __init__
    'Error opening {0}'.format(self.__class__.__name__))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 2572, in _check
    raise PortAudioError(errormsg, err)
sounddevice.PortAudioError: Error opening InputStream: Invalid number of channels [PaErrorCode -9998]
>>> x = sd.rec(int(duration * fs), samplerate=fs, channels=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 224, in rec
    ctx.input_dtype, callback, blocking, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 2417, in start_stream
    **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 1301, in __init__
    **_remove_self(locals()))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 780, in __init__
    'Error opening {0}'.format(self.__class__.__name__))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 2572, in _check
    raise PortAudioError(errormsg, err)
sounddevice.PortAudioError: Error opening InputStream: Invalid number of channels [PaErrorCode -9998]
>>> x = sd.rec(int(duration * fs), samplerate=fs)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 215, in rec
    ctx.frames = ctx.check_out(out, frames, channels, dtype, mapping)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sounddevice.py", line 2351, in check_out
    'Unable to determine number of input channels')
TypeError: Unable to determine number of input channels

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Похоже, вы говорите, что записываете:

sd.rec(...

, а записываемое устройство не имеет входов, что верно.

Показан хороший пример воспроизведения звуков.здесь:

https://python -sounddevice.readthedocs.io / en / 0.3.12 / examples.html # play-a-sound-file

или используйтеочень краткий пример, предоставленный Марком ниже.

Что касается возврата вывода на вход, требующий некоторой продвинутой работы, например, вниз на уровне драйвера.Я отмечаю, что есть виртуальное устройство OSX под названием SoundFlower, которое делает это.См .:

https://apple.stackexchange.com/questions/221980/os-x-route-audio-output-to-audio-input

Источник можно найти здесь:

https://github.com/mattingalls/Soundflower

Сделайте свой выбор, используя этот существующий инструмент или многое другое.более крутой путь, чтобы попытаться понять и извлечь подмножество желаемого поведения (смелость в SoundflowerEngine :: createAudioStreams).

0 голосов
/ 12 декабря 2018

Я написал следующий скрипт, который работает как в Python 2.x, так и в 3.x.

Следующий код отлично работает в Windows, но еще не протестирован в MAC OS X. Надеюсь, что этоможет работать для вас.

И самое главное, не забудьте установить sounddevice, soundfile, numpy

import sounddevice
import soundfile

rec_rate = 40000  # Hertz
rec_duration = 10  # seconds
rec_name = 'names.wav'  # Name for file
rec_data = sounddevice.rec(int(rec_rate * rec_duration), samplerate=rec_rate, channels=1, blocking=True)  # Recording ...
soundfile.write(rec_name, rec_data, rec_rate)  # Writing recorded sound in a file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...