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

Однако, когда я пытаюсь запустить оба одновременно, это дает мне ошибки, потому что у одного есть эксклюзивный доступ к моему микрофону.

После некоторого чтения я узнал о плагине dsnoop. Это должно позволить мне разделить microhpone между приложениями. Поэтому я попытался изменить файл .asoundrc, чтобы использовать dsnoop.

Я проверил это с помощью arecord на двух терминалах, и я могу записывать одновременно без каких-либо проблем. Но как только я хочу запустить Google Assistant, я получаю сообщение об ошибке:

(Google) pi@Thomas:~ $ googlesamples-assistant-pushtotalk
INFO:root:Connecting to embeddedassistant.googleapis.com
Expression 'paInvalidSampleRate' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2048
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->capture, inParams, self->primeBuffers, hwParamsCapture, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2719
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2843
Traceback (most recent call last):
  File "/home/pi/Assistants-Pi/Google/bin/googlesamples-assistant-pushtotalk", line 8, in <module>
    sys.exit(main())
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/googlesamples/assistant/grpc/pushtotalk.py", line 351, in main
    flush_size=audio_flush_size
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/googlesamples/assistant/grpc/audio_helpers.py", line 190, in __init__
    blocksize=int(block_size/2),  # blocksize is in number of frames.
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/sounddevice.py", line 1345, in __init__
    **_remove_self(locals()))
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/sounddevice.py", line 861, in __init__
    'Error opening {0}'.format(self.__class__.__name__))
  File "/home/pi/Assistants-Pi/Google/lib/python3.7/site-packages/sounddevice.py", line 2653, in _check
    raise PortAudioError(errormsg, err)
sounddevice.PortAudioError: Error opening RawStream: Invalid sample rate [PaErrorCode -9997]

Я пытался ввести все разные частоты дискретизации в свой .asoundrc, но, похоже, ни одна из них не работает. У кого-нибудь еще есть эта проблема или знает, как ее решить?

Вот как теперь выглядит мой файл .asoundrc (который работает для arecord бок о бок в двух терминалах):

pcm.!default {
    type asym
    playback.pcm {
        type plug
        slave.pcm "output"
    }
    capture.pcm {
        type plug
        slave.pcm "input"
    }
}
pcm.output {
    type hw
    card 0
    rate 16000
}
ctl.!default {
    type hw
    card 0
}
pcm.input {
    type dsnoop
    card 1
}
-1
Thomas Desmet 10 Апр 2020 в 17:04

1 ответ

Это работает для меня (только часть dsnoop - другое сложнее):

pcm.dsnoopUB1 {
    type dsnoop         # this plugin splits one capture stream to more
    ipc_key 2052        # (IPC = Inter-Process Communication) must be unique
    ipc_key_add_uid 0   # multi-user sharing
    ipc_perm 0666       # permissions for multi-user sharing
    slave {pcm "hw:UB1,0"; channels 1}  # HW identification (see arecord -l), micrpohone - mostly mono
}

pcm.!default {
    type asym
    playback.pcm "plug:assistJK"
    capture.pcm "plug:dsnoopUB1"
}

Я проверил это снова и пришел к выводу, что вам нужно определить только ipc_key. В моем случае это работает - я могу без проблем запустить два (или более) экземпляра Google Assistant SDK.

0
Tomas 11 Май 2020 в 20:54
Хотя допустимо давать ответы только на основе кода, для сообщества часто бывает более полезным, если вы также можете предоставить объяснение кода и помочь людям понять, почему он решает проблему. Это может уменьшить количество дополнительных вопросов и помочь новым разработчикам понять основные концепции. Не могли бы вы добавить в свой вопрос дополнительные сведения?
 – 
Jeremy Caney
11 Май 2020 в 05:04