Как выводить аудио на микрофон?

У меня есть код который получает звук с микрофона и воспроизводит его

r = sr.Recognizer()
with sr.Microphone(device_index = 1) as source:
    audio = r.listen(source)
engine = pt.init()
try:
    txt = r.recognize_google(audio, language = 'ru-RU').lower()
    print(f"[LOG] Уловил: {txt}")
    engine.say(txt)
    engine.runAndWait()
except:
    print("Я вас не раслышал, повторите?")

Но мне нужно чтобы это выводилось через микрофон и его мог использовать дискорд. Как это сделать через python?


Ответы (2 шт):

Автор решения: Easton

Это возможно, но не на 100% в python, так как требует установки другого программного обеспечения.

Первое, что нужно скачать https://www.vb-audio.com/Cable/, это создаст «Виртуальный аудиокабель», по которому программы могут воспроизводить музыку на устройстве ввода (которое выглядит как динамик), и он будет передавать ее на устройство вывода (что-то вроде микрофона).

Затем запустите эту команду в cmd: pip install pygame == 2.0.0.dev8 (или py -m pip install pygame == 2.0.0.dev8, в зависимости от вашей установки python) [Также причина, по которой это версия dev, заключается в том, что некоторые функции требуются только в sdl2, тогда как основная ветвь использует sdl1)

Потом:

>>> from pygame._sdl2 import get_num_audio_devices, get_audio_device_name #Get playback device names
>>> from pygame import mixer #Playing sound
>>> mixer.init() #Initialize the mixer, this will allow the next command to work
>>> [get_audio_device_name(x, 0).decode() for x in range(get_num_audio_devices(0))] #Returns playback devices
['Headphones (Oculus Virtual Audio Device)', 'MONITOR (2- NVIDIA High Definition Audio)', 'Speakers (High Definition Audio Device)', 'Speakers (NVIDIA RTX Voice)', 'CABLE Input (VB-Audio Virtual Cable)']
>>> mixer.quit() #Quit the mixer as it's initialized on your main playback device
>>> mixer.init(devicename='CABLE Input (VB-Audio Virtual Cable)') #Initialize it with the correct device
>>> mixer.music.load("Megalovania.mp3") #Load the mp3
>>> mixer.music.play() #Play it
→ Ссылка
Автор решения: Yan Wolf

speech_recognition не сможет вывести аудио в микрофон самостоятельно, он является только 'приемником', для этого воспользуйтесь sounddevice

pip install sounddevice
import argparse
import keyboard
import sounddevice as sd
import numpy  
assert numpy  

def int_or_str(text):

    """Helper function for argument parsing."""
    try:
        return int(text)
    except ValueError:
        return text


parser = argparse.ArgumentParser(add_help=False)
parser.add_argument(
    '-l', '--list-devices', action='store_true',
    help='show list of audio devices and exit')
args, remaining = parser.parse_known_args()
if args.list_devices:
    print(sd.query_devices())
    parser.exit(0)
parser = argparse.ArgumentParser(
    description=__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter,
    parents=[parser])
parser.add_argument(
    '-i', '--input-device', type=int_or_str,
    help='input device (numeric ID or substring)')
parser.add_argument(
    '-o', '--output-device', type=int_or_str,
    help='output device (numeric ID or substring)')
parser.add_argument(
    '-c', '--channels', type=int, default=2,
    help='number of channels')
parser.add_argument('--dtype', help='audio data type')
parser.add_argument('--samplerate', type=float, help='sampling rate')
parser.add_argument('--blocksize', type=int, help='block size')
parser.add_argument('--latency', type=float, help='latency in seconds')
args = parser.parse_args(remaining)

sd.default.device = None


def callback(indata, outdata, frames, time, status):

    if status:
        print(status)
    outdata[:] = indata


with sd.Stream(device=(args.input_device, args.output_device),
                samplerate=args.samplerate, blocksize=args.blocksize,
                dtype=args.dtype, latency=args.latency,
                channels=args.channels, callback=callback):
    print('#' * 80)
    print('press q quit')
    print('#' * 80)
    keyboard.wait('q')

Когда sd.default.device = None
Код будет использовать устройства по умолчанию.

Узнать какие устройства доступны сейчас:

import sounddevice as sd
print(sd.query_devices())

Вывод:

   0 Microsoft Sound Mapper - Input, MME (2 in, 0 out)
>  1 Микрофон (Logitech PRO X Gaming, MME (2 in, 0 out)
   2 Line 1(Micro1) (Virtual Audio C, MME (2 in, 0 out)
   3 Microsoft Sound Mapper - Output, MME (0 in, 2 out)
<  4 Динамики (Logitech PRO X Gaming, MME (0 in, 2 out)
   5 Line 1(Audio1) (Virtual Audio C, MME (0 in, 2 out)
   6 Первичный драйвер записи звука, Windows DirectSound (2 in, 0 out)
   7 Микрофон (Logitech PRO X Gaming Headset), Windows DirectSound (2 in, 0 out)
   8 Line 1(Micro1) (Virtual Audio Cable), Windows DirectSound (2 in, 0 out)
   9 Первичный звуковой драйвер, Windows DirectSound (0 in, 8 out)
  10 Динамики (Logitech PRO X Gaming Headset), Windows DirectSound (0 in, 8 out)

Например : sd.default.device = 1,4 -> input,output

Вся подробная документация на сайте проекта SoundDevice

→ Ссылка