1+ # process order
2+ from process_order import load_xlsx , process_data_to_menu , process_price_with_order
3+ # detect voice
4+ import speech_recognition
5+ # generate voice
6+ from pygame import mixer
7+ import tempfile
8+ from gtts import gTTS
9+
10+ # time
11+ from datetime import datetime
12+ from time import sleep
13+
14+ class Order_Bot :
15+ def __init__ (self , mode = 'voice1' ):
16+ # speaker init
17+ mixer .init ()
18+ # mode: voice1, voice2, text
19+ self .mode = mode
20+ # recognizer init
21+ self .recognizer = speech_recognition .Recognizer ()
22+
23+ def line_speaker (self , texts ,lang = 'zh-tw' ):
24+ with tempfile .NamedTemporaryFile (delete = True ) as fp :
25+ tts = gTTS (text = texts ,lang = lang )
26+ tts .save ("{}.mp3" .format (fp .name ))
27+ mixer .music .load ('{}.mp3' .format (fp .name ))
28+ mixer .music .play ()
29+ print (texts )
30+
31+ def listener (self ):
32+ if self .mode == 'voice1' :
33+ result = None
34+ while (result == None ):
35+ with speech_recognition .Microphone () as source :
36+ # recognizer.adjust_for_ambient_noise(source)
37+ audio = self .recognizer .listen (source )
38+ try :
39+ result = self .recognizer .recognize_google (audio ,language = 'zh-tw' )
40+ except :
41+ continue
42+ print (result )
43+ return result
44+ elif self .mode == 'text' :
45+ result = input ()
46+ return result
47+
48+ def order_manage (self ):
49+ data_dict = load_xlsx (file_name = 'script/menu.xlsx' )
50+ menu_dict = process_data_to_menu (data_dict )
51+ self .line_speaker ('您好,很高興為您服務,請問要做些甚麼?' )
52+ while (1 ):
53+ order_line = self .listener ()
54+ # 問好
55+ if '你好' in order_line :
56+ self .line_speaker ('你好。' )
57+
58+ # 有什麼吃的?
59+ elif '吃的' in order_line :
60+ eat_count = 0
61+ self .line_speaker ('想吃飯還是麵?' )
62+ while (eat_count < 2 ):
63+ order_line = self .listener ()
64+ if '飯' in order_line :
65+ self .line_speaker ('我們沒有飯' )
66+ eat_count += 1
67+ elif '麵' in order_line :
68+ self .line_speaker ('我們沒有麵' )
69+ eat_count += 1
70+ else :
71+ self .line_speaker ('我們沒有這個' )
72+ self .line_speaker ('我們有水餃' )
73+ continue
74+
75+ # 機率論
76+ elif '機率' in order_line :
77+ self .line_speaker ('請描述你所要計算的機率問題。講完後請說我說完了' )
78+ while (not '完' in order_line ):
79+ order_line = self .listener ()
80+ self .line_speaker ('請問所求為會發生還是不會發生的機率?' )
81+ order_line = self .listener ()
82+ while (not '會' in order_line ):
83+ order_line = self .listener ()
84+ if '不會' in order_line :
85+ self .line_speaker ('二分之一' )
86+ else :
87+ self .line_speaker ('二分之一' )
88+
89+ # 點餐
90+ elif '餐' in order_line :
91+ total_order = ''
92+ self .line_speaker ('請問要點些什麼呢?' )
93+ while (1 ):
94+ order_menu_line = self .listener ()
95+ if '和' in order_menu_line or '個' in order_menu_line :
96+ total_order += order_menu_line + '和'
97+ elif '餐' in order_menu_line or '點完' in order_menu_line :
98+ # 點完餐
99+ break
100+ else :
101+ self .line_speaker ('不好意思,請再說一次。' )
102+ self .line_speaker (process_price_with_order (menu_dict , total_order ))
103+
104+ # 問時間,幾點了
105+ elif ('時間' in order_line ) or ('幾點' in order_line ):
106+ now = datetime .now ()
107+ res_text = '現在時間是 %d 點 %d 分 %d 秒' % (now .hour , now .minute , now .second )
108+ self .line_speaker (res_text )
109+
110+ # 離開
111+ elif '離開' in order_line or '結束' in order_line :
112+ self .line_speaker ('很高興為您服務,很期待您下次光顧。' )
113+ sleep (6 )
114+ break
115+
116+ # not any option upper
117+ else :
118+ self .line_speaker ('不好意思,請再說一次。' )
119+
120+ def __call__ (self ):
121+ self .order_manage ()
122+
123+ if __name__ == '__main__' :
124+ order_bot = Order_Bot ('text' )
125+ order_bot ()
0 commit comments