Construindo um assistente de voz em Python, parte 1

Boa tarde. Provavelmente, todos assistiam a filmes sobre o homem de ferro e queriam um assistente de voz semelhante a Jarvis. Neste post, vou mostrar como fazer um assistente assim do zero. Meu programa será escrito em python 3 no sistema operacional Windows. Então vamos!



Implementação



Nosso assistente trabalhará de acordo com o seguinte princípio:



  1. Constantemente "ouça" o microfone
  2. Reconhecer palavras no google
  3. Execute o comando ou responda


1) Síntese da fala



Primeiro, instalaremos vozes russas no sistema Windows. Para fazer isso, siga o link e baixe as vozes na seção SAPI 5 -> Russo. Existem 4 vozes lá, você pode escolher qualquer uma que desejar. Instale e siga em frente.



Precisamos fornecer a biblioteca pyttsx3 para síntese de fala:



pip install pyttsx3


Em seguida, você pode executar o programa de teste e verificar se ele está funcionando corretamente.



import pyttsx3

text = '- '
tts = pyttsx3.init()
rate = tts.getProperty('rate') # 
tts.setProperty('rate', rate-40)

volume = tts.getProperty('volume') # 
tts.setProperty('volume', volume+0.9)

voices = tts.getProperty('voices')

#    
tts.setProperty('voice', 'ru') 

#    
for voice in voices:
    if voice.name == 'Anna':
        tts.setProperty('voice', voice.id)

tts.say(text)
tts.runAndWait()


2) Reconhecimento de fala



Existem muitas ferramentas de reconhecimento de fala, mas todas são pagas. Tentei encontrar uma solução gratuita para o meu projeto e encontrei! Esta é a biblioteca speech_recognition.



pip install SpeechRecognition


Também precisamos da biblioteca PyAudio para funcionar com o microfone.



pip install PyAudio


Algumas pessoas têm problemas ao instalar o PyAudio, então você deve seguir este link e baixar a versão do PyAudio que você precisa. Em seguida, entre no console:



pip instal   


Em seguida, você executa o programa de teste. Mas antes disso, você deve corrigir device_index = 1 nele para o valor de índice do seu microfone. Você pode descobrir o índice do microfone usando este programa:



import speech_recognition as sr
for index, name in enumerate(sr.Microphone.list_microphone_names()):
    print("Microphone with name \"{1}\" found for `Microphone(device_index={0})`".format(index, name))


Teste de reconhecimento de fala:



import speech_recognition as sr

def record_volume():
    r = sr.Recognizer()
    with sr.Microphone(device_index = 1) as source:
        print('.')
        r.adjust_for_ambient_noise(source, duration=0.5) #  
        print('...')
        audio = r.listen(source)
    print('.')
    try:
        query = r.recognize_google(audio, language = 'ru-RU')
        text = query.lower()
        print(f' : {query.lower()}')
    except:
        print('Error')

while True:
    record_volume()


Se tudo estiver bem, siga em frente.



Se você deseja que seu assistente fale apenas com você (sem IA), você pode fazer isso usando a ferramenta DialogFlow gratuita do Google. Depois de entrar, você verá uma tela onde já pode criar seu primeiro bot. Clique em Criar agente. Criamos um nome para o bot (nome do agente), selecione o idioma (idioma padrão) e clique em Criar. O bot foi criado!



Para adicionar novas respostas a diferentes perguntas, você precisa criar um novo intent. Para fazer isso, na seção de intents, clique em Create intent. Preenchemos os campos "Título" e Frases de treinamento, e a seguir as respostas. Clique em Salvar. Isso é tudo.



Para controlar um bot em python, você precisa escrever o código a seguir. No meu programa, o bot dá voz a todas as respostas.



import apiai, json, re
import pyttsx3
import speech_recognition as sr

tts = pyttsx3.init()
rate = tts.getProperty('rate')
tts.setProperty('rate', rate-40)
volume = tts.getProperty('volume')
tts.setProperty('volume', volume+0.9)
voices = tts.getProperty('voices')
tts.setProperty('voice', 'ru')
for voice in voices:
    if voice.name == 'Anna':
        tts.setProperty('voice', voice.id)

def record_volume():
    r = sr.Recognizer()
    with sr.Microphone(device_index = 1) as source:
        print('.')
        r.adjust_for_ambient_noise(source, duration=1) 
        print('...')
        audio = r.listen(source)
    print('.')
    try:
        query = r.recognize_google(audio, language = 'ru-RU')
        text = query.lower()
        print(f' : {query.lower()}')
        textMessage( text )
    except:
        print(' .')

def talk( text ):
    tts.say( text )
    tts.runAndWait()

def textMessage( text ):
    request = apiai.ApiAI(' ').text_request() #  API  Dialogflow
    request.lang = 'ru' #      
    request.session_id = ' id' # ID   (,    )
    request.query = text #        
    responseJson = json.loads(request.getresponse().read().decode('utf-8'))
    response = responseJson['result']['fulfillment']['speech'] #  JSON   
    #      -  ,   -    
    if response:
        request.audio_output = response
        talk(response)
    else:
        talk('.     .')

while True:
    record_volume()


Isso é tudo por hoje. Na próxima parte, direi como fazer um bot inteligente, ou seja, para que ele possa não apenas responder, mas também fazer algo.



All Articles