Как запустить Espeak и Pocketsphinx одновременно? - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь запустить Pocketsphinx вместе с Espeak, чтобы, когда слово распознается, оно отвечало с текстом на речь.

Я заставил обоих работать с этим эскизом, но как только Pocketsphinx запустился, Espeak перестает работать.Нет ошибок, просто нет звука.

Так не уверены, что происходит не так?Нужно ли запускать их в отдельных потоках или один блокирует другой?

from pocketsphinx import LiveSpeech
from subprocess import call
import pyttsx3
import os

def speak(txt):
    print("speaking: "+txt)
    call(["sudo", "espeak", txt])

def init_speech():
    return LiveSpeech(
        audio_device = None,
        sampling_rate=16000,
        lm=False,
        kws=keyword_dir)

speak('hello world one') # this works

root_dir = os.path.dirname(os.path.abspath(__file__))
keyword_dir = os.path.join(root_dir, 'data/keyphrase.list')

speech = init_speech()

speak('hello world two') # and now it does not work

while True:
    for phrase in speech:
        topWord = phrase.segments()[0]
        print(topWord) #this works
        speak(topWord) # this is the goal

1 Ответ

0 голосов
/ 01 мая 2019

Я нашел решение проблемы. Espeak не использовал правильную звуковую карту, так как pocketsphinx устанавливает pulseaudio. Чтобы указать, куда Espeak отправляет аудио для использования флага stdout:

- стандартный вывод | aplay -D "sysdefault: CARD = seeed2micvoicec"

используйте команду aplay -L, чтобы найти имя вашей карты

from pocketsphinx import LiveSpeech
import os

def speak(txt):
    os.system('espeak "'+txt+'" --stdout | aplay -D "sysdefault:CARD=seeed2micvoicec"')
    print("TtS: " + txt)

def init_speech():
    return LiveSpeech(
        audio_device = None,
        sampling_rate=16000,
        lm=False,
        kws=keyword_dir)

speak('hello world one') # this works

root_dir = os.path.dirname(os.path.abspath(__file__))
keyword_dir = os.path.join(root_dir, 'keyphrase.list')

speech = init_speech()
print("running")
speak('hello world two') # and now it does not work

while True:
    for phrase in speech:
        topWord = phrase.segments()[0]
        print(phrase) #this works
        speak(topWord) # this is the goal
...