我正在编写一个代码,用于接收语音输入,然后取决于所说的内容;它应该提供音频输出。在我的代码中,我一直保持简单,并使其只重复所说的内容。
我的主要问题是我必须将音频输出与嘴巴运动联系起来。基本上,当它提供音频输出时,它应该切换嘴巴来移动。
我正在使用线程来同时运行两者。如何将语音部分与人脸联系起来?
import speech_recognition
import pyttsx3
import speech_recognition as sr
from tkinter import Tk, HIDDEN, NORMAL, Canvas
import threading
def smile_func():
def toggle_eyes():
current_color = c.itemcget(eye_left, 'fill')
new_color= c.body_color if current_color == "white" else "white"
#new_color = 'white' if current_color == 'white' else 'white'
current_state = c.itemcget(pupil_left, 'state')
new_state = NORMAL if current_state == HIDDEN else HIDDEN
c.itemconfigure(pupil_left, state=new_state)
c.itemconfigure(pupil_right, state=new_state)
c.itemconfigure(eye_left, fill=new_color)
c.itemconfigure(eye_right, fill=new_color)
def blink():
toggle_eyes()
win.after(250, toggle_eyes)
win.after(3000, blink)
def toggle_tongue():
if not c.tongue_out:
c.itemconfigure(tongue_tip, state=NORMAL)
c.itemconfigure(tongue_main, state=NORMAL)
c.tongue_out=True
else:
c.itemconfigure(tongue_tip, state=HIDDEN)
c.itemconfigure(tongue_main, state=HIDDEN)
c.tongue_out = False
def toggle_tongue1():
print("ouch")
if not c.tongue_out:
c.itemconfigure(tongue_tip, state=NORMAL)
c.itemconfigure(tongue_main, state=NORMAL)
c.tongue_out=True
else:
c.itemconfigure(tongue_tip, state=HIDDEN)
c.itemconfigure(tongue_main, state=HIDDEN)
c.tongue_out = False
def cheek(event):
global cheek
toggle_tongue()
win.after(500, toggle_tongue1)
return
win = Tk()
c= Canvas(win, width=400, height=400)
c.configure(bg="black", highlightthickness=0)
c.body_color= "yellow"
body = c.create_rectangle(35,20, 365, 350, outline=c.body_color,fill = "yellow")
eye_left= c.create_oval(130, 110, 160, 170, outline="black", fill="white")
pupil_left= c.create_oval(140, 145, 150, 155, outline="black", fill="black")
eye_right= c.create_oval(230, 110, 260, 170, outline="black", fill="white")
pupil_right= c.create_oval(240, 145, 250, 155, outline="black", fill="black")
mouth_normal= c.create_line(170, 250, 200, 272, 230, 250, smooth=1, width=2, state=NORMAL)
mouth_happy= c.create_line(170, 250, 200, 282, 230, 250, smooth=1, width=2, state=NORMAL)
tongue_main= c.create_rectangle(170, 250,230, 290, outline='red', fill='red', state=HIDDEN)
tongue_tip= c.create_oval(170, 285, 230, 300, outline='red', fill='red', state=HIDDEN)
c.pack()
c.bind('<Button-1>', cheek)
c.crossed_eyes= False
c.tongue_out=False
#c.happy_level = 0
c.happy_level = 1
win.after(1000, blink)
win.mainloop()
#speech and text xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
engine= pyttsx3.init()
def record_audio():
r = sr.Recognizer()
with sr.Microphone() as source:
#r.phrase_threshold=1
print("adjusting ambient noise")
r.adjust_for_ambient_noise(source)#,duration=5)
#r.energy_threshold=350
#r.pause_threshold=1
print("listening ....")
audio = r.listen(source)
print("got it")
voice_data=''
try:
voice_data= r.recognize_google(audio, language = "en")
voice_data=voice_data.lower()
except Exception as e:
print(e)
return "None"
except sr.RequestError:
alexis_speak('sorry my speech server is down') #print
array=[voice_data]
return array
def alexis_speak(text):
engine.say(text)
engine.runAndWait()
print(text)
def speech_func():
while 1:
voice_data=record_audio()
alexis_speak(voice_data)
if __name__ == "__main__":
# creating thread
t1 = threading.Thread(target=speech_func )
t2 = threading.Thread(target=smile_func )
# starting thread 1
t1.start()
# starting thread 2
t2.start()
# wait until thread 1 is completely executed
t1.join()
# wait until thread 2 is completely executed
t2.join()
# both threads completely executed
print("Done!")
#xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx