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