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