1 | set flag NoAWT. set flag Android. set flag AndroidOnly. |
2 | |
3 | import android.app.*; |
4 | import android.content.*; |
5 | import android.os.Bundle; |
6 | import android.view.View; |
7 | import android.view.View.OnClickListener; |
8 | import android.speech.RecognitionListener; |
9 | import android.speech.RecognizerIntent; |
10 | import android.speech.SpeechRecognizer; |
11 | import android.widget.Button; |
12 | import android.widget.TextView; |
13 | import android.util.Log; |
14 | import android.media.*; |
15 | |
16 | static SpeechRecognizer sr; |
17 | static final String TAG = "MyStt3Activity"; |
18 | static S language = "en-US"; |
19 | static int extraResults = 1; |
20 | |
21 | static bool fastSynthesis = false; // use device voice (faster) |
22 | static bool noSpeech = false; // disable speech output |
23 | |
24 | static bool manualMode = false; // Start recognition on click only |
25 | sbool muteAlways, printErrors; |
26 | sbool listenAfterTalk = true; // it works now |
27 | |
28 | static volatile bool listening, recognitionCancelled; |
29 | |
30 | static new L<S> history; |
31 | static Lock speechLock = lock(); |
32 | |
33 | svoid leoMain { |
34 | if (androidIsAdminMode()) { |
35 | print("Going admin."); |
36 | androidUnsetAdminMode(); |
37 | removeMyselfAsInjection(); |
38 | aShowStartScreen(); |
39 | ret; |
40 | } |
41 | |
42 | aHideTitleBar(); |
43 | |
44 | androidSay_keepEngine = true; |
45 | |
46 | if (muteAlways) androidMuteAudio(); |
47 | |
48 | S hello = null; |
49 | |
50 | /*if (args.length != 0 && args[0].equals("nogfx")) |
51 | setOpt(getMainClass(), "showPicture", false);*/ |
52 | |
53 | try { |
54 | history.add("*"); |
55 | //hello = callStaticAnswerMethod("*", history); |
56 | if (hello == null) hello = german() ? "hallo" : "hello"; |
57 | } catch (Throwable e) { |
58 | e.printStackTrace(); |
59 | return; |
60 | } |
61 | |
62 | if (!androidIsAdminMode()) |
63 | aClearConsole(); |
64 | |
65 | listening = true; // so user can cancel early |
66 | //if (!noSpeech) say(hello); |
67 | justASec(); // show interface |
68 | callOptMC('happy); |
69 | |
70 | thread "Long-Poll" { |
71 | repeat with sleep 1 { |
72 | // TODO: interrupt connection on cleanup |
73 | // TODO: make it work for other users! |
74 | S action = postPageSilently("http://butter.botcompany.de:8080/1014866/raw", muricaCredentials()); |
75 | if (nempty(action)) |
76 | for (S s : lines(action)) say(s); |
77 | } |
78 | } |
79 | |
80 | // setLanguage(language); |
81 | |
82 | aAddMenuItems("Switch to manual mode", "Switch to auto mode"); |
83 | |
84 | // init engine? |
85 | if (german()) androidSayInGerman(""); else androidSayInEnglish(""); |
86 | |
87 | if (recognitionCancelled) recognitionCancelled = false; |
88 | else |
89 | androidUI(f newRecognizer); |
90 | |
91 | noMainDone(); |
92 | } |
93 | |
94 | static void newRecognizer() { |
95 | //print("listening"); |
96 | listening = true; |
97 | sr = SpeechRecognizer.createSpeechRecognizer(androidActivity()); |
98 | sr.setRecognitionListener(new listener()); |
99 | recog(); |
100 | } |
101 | |
102 | static class listener implements RecognitionListener { |
103 | public void onReadyForSpeech(Bundle params) { |
104 | if (recognitionCancelled) { |
105 | recognitionCancelled = false; |
106 | sr.stopListening(); |
107 | ret; |
108 | } |
109 | callOptMC('setBorderAndStatus, 0xFF66FF66, |
110 | german() ? "JETZT SPRECHEN!" : "TALK NOW!"); |
111 | callOptMC('oh); |
112 | //showText(german() ? "SAG WAS." : "TALK NOW."); |
113 | } |
114 | |
115 | public void onBeginningOfSpeech() { |
116 | //showText("User talks"); |
117 | //callOptMC('oh); |
118 | if (!manualMode && !muteAlways) |
119 | androidMuteAudio(); // Mute now, so we don't hear the end-of-speech sound |
120 | } |
121 | |
122 | public void onRmsChanged(float rmsdB) {} |
123 | public void onBufferReceived(byte[] buffer) {} |
124 | |
125 | public void onEndOfSpeech() { |
126 | ping(); |
127 | //showText("onEndOfSpeech"); |
128 | callOptMC('setBorderAndStatus, aWhite(), baseStatus()); |
129 | } |
130 | |
131 | public void onError(int error) { |
132 | ping(); |
133 | listening = false; |
134 | if (printErrors) |
135 | if (error == 6) // timeout |
136 | print("speech timeout"); |
137 | else |
138 | print("error " + error); // screw the errors! |
139 | try { |
140 | sr.destroy(); |
141 | } catch (Throwable e) { |
142 | print(e); |
143 | } |
144 | if (!manualMode) |
145 | newRecognizer(); |
146 | else |
147 | callOptMC('setBorderAndStatus, aWhite(), baseStatus()); |
148 | callOpt(getMainClass(), "happy"); |
149 | } |
150 | |
151 | public void onResults(Bundle results) { |
152 | ping(); |
153 | listening = false; |
154 | //showText("onResults"); |
155 | ArrayList<S> data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); |
156 | fS s = data.get(0); |
157 | onInput(s, false); |
158 | } |
159 | |
160 | public void onPartialResults(Bundle partialResults) { |
161 | print("onPartialResults"); |
162 | } |
163 | |
164 | public void onEvent(int eventType, Bundle params) { |
165 | print("onEvent" + eventType); |
166 | } |
167 | } |
168 | |
169 | svoid onInput(S _s, final bool typed) { |
170 | fS s = trim(_s); if (empty(s)) ret; |
171 | thread "onInput" { |
172 | mechQ(r { |
173 | appendToMechList_noUniq("Katze Speech Recognition Log With Date", "[" + localDateWithMilliseconds() + ", " + |
174 | (typed ? "typed on phone" : "through phone") + "] " + s) }); |
175 | aSetText(userTextView, lang("You: ", "Du: ") + s); |
176 | aPutViewBehindOtherView(userTextView, myTextView); |
177 | |
178 | showText( |
179 | (typed |
180 | ? lang("You typed: ", "Du schrubst: ") |
181 | : lang("I heard: ", "Ich habe geh\u00f6rt: ")) + quote(s)); |
182 | |
183 | // TODO: fix the java strings umlaut problem |
184 | |
185 | final boolean goodbye = match3("goodbye", s) || match3("bye", s) || match3("tsch\u00fcss", s) || match3("tsch\u00fcss ...", s); |
186 | |
187 | // get answer |
188 | |
189 | history.add(s); |
190 | |
191 | handleCommand(s); |
192 | |
193 | S answer; |
194 | try { |
195 | answer = goodbye ? "tsch\u00fcss" : callStaticAnswerMethod(s, history); |
196 | } catch (Throwable e) { |
197 | e.printStackTrace(); |
198 | appendToFile(getProgramFile("errors.txt"), getTheStackTrace(e)); |
199 | answer = "Fehler"; |
200 | } |
201 | |
202 | if (answer != null) |
203 | print(answer); |
204 | |
205 | androidUI(r { |
206 | if (goodbye) { |
207 | print("\nGOODBYE!"); |
208 | sr.destroy(); |
209 | |
210 | callOpt(getMainClass(), "disappear"); |
211 | } else { |
212 | sr.stopListening(); |
213 | listening = false; |
214 | //newRecognizer(); // always make a new one - gives endless errors |
215 | if (!manualMode) |
216 | recog(); |
217 | } |
218 | }); |
219 | } // end of thread |
220 | } |
221 | |
222 | svoid recog() { |
223 | if (sr == null) ret with newRecognizer(); |
224 | print("recog"); |
225 | listening = true; |
226 | justASec(); |
227 | Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); |
228 | intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); |
229 | intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, language); |
230 | intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test"); |
231 | |
232 | intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, extraResults); |
233 | |
234 | // customize recognition time settings |
235 | callOpt(mc(), "recogTimeSettings", intent); |
236 | |
237 | sr.startListening(intent); |
238 | print("started listening"); |
239 | } |
240 | |
241 | svoid say(fS s) { |
242 | ping(); |
243 | lock speechLock; |
244 | showText(">> " + s); |
245 | aSetText(myTextView, lang("Me: ", "Ich: ") + s); |
246 | aPutViewBehindOtherView(myTextView, userTextView); |
247 | if (manualMode && listening) { |
248 | print("User is speaking, postponing speech output."); |
249 | ret; |
250 | } |
251 | androidUI_wait(f stopListening); |
252 | history.add(s); |
253 | mechQ(r { |
254 | appendToMechList_noUniq("Katze | Things the phone said", "[" + localDateWithMilliseconds() + "] " + s) }); |
255 | if (!noSpeech) { |
256 | androidUnmuteAudio(); |
257 | callOptMC('oh); |
258 | if (fastSynthesis) { |
259 | if (german()) androidSayInGerman(s); else androidSayInEnglish(s); |
260 | } else { |
261 | File mp3 = cereproc_silent(german() ? "Leopold" : "Jack", s); |
262 | androidPlayMp3(androidActivity(), mp3); |
263 | } |
264 | callOptMC('happy); |
265 | if (listenAfterTalk) |
266 | //androidUI_noWait(r startListening); // works, but freezes UI |
267 | androidUI_noWait(r newRecognizer); |
268 | } |
269 | if (muteAlways) |
270 | androidMuteAudio(); |
271 | } |
272 | |
273 | static void stopListening() { |
274 | listening = false; |
275 | if (sr != null) |
276 | sr.stopListening(); |
277 | } |
278 | |
279 | svoid startListening() { |
280 | if (listening) ret; |
281 | listening = true; |
282 | recog(); |
283 | } |
284 | |
285 | sbool german() { |
286 | ret swic(language, "de"); |
287 | } |
288 | |
289 | svoid switchToManual { |
290 | stopListening(); |
291 | manualMode = true; |
292 | androidUnmuteAudio(); |
293 | } |
294 | |
295 | svoid switchToAuto { |
296 | manualMode = false; |
297 | startListening(); |
298 | androidUnmuteAudio(); |
299 | } |
300 | |
301 | svoid onMenuCommand(S s) { |
302 | //print("menu cmd: " + s); |
303 | handleCommand(s); |
304 | } |
305 | |
306 | // spoken, typed or through menu |
307 | svoid handleCommand(S s) { |
308 | if "stop listening|Switch to manual mode" switchToManual(); |
309 | if "Switch to auto mode" switchToAuto(); |
310 | if "german|deutsch" setLanguage("de-DE"); |
311 | if "english|englisch" setLanguage("en-US"); |
312 | } |
313 | |
314 | svoid cleanMeUp_leo { |
315 | if (sr != null) { |
316 | sr.destroy(); |
317 | sr = null; |
318 | } |
319 | } |
320 | |
321 | sS baseStatus() { |
322 | ret !manualMode ? "" : |
323 | german() ? "KLICKEN ZUM SPRECHEN" : "CLICK ON ME IF YOU WANT TO TALK"; |
324 | } |
325 | |
326 | sS lang(S en, S de) { |
327 | ret german() ? de : en; |
328 | } |
329 | |
330 | svoid setLanguage(S l) { |
331 | language = l; |
332 | setCurrentBotLanguage(l); |
333 | aSetText(lblInputView, inputViewLabel()); |
334 | androidUI_noWait(r newRecognizer); |
335 | } |
336 | |
337 | svoid justASec { |
338 | callOptMC('setBorderAndStatus, 0xFFFF0000, |
339 | german() ? "BITTE WARTEN" : "JUST A SEC"); // (initializing speech recognizer) |
340 | } |
341 | |
342 | // Don't use - freezes UI |
343 | svoid _cancelRecognition { |
344 | //print("Cancelling recognition " + listening + " " + (sr != null)); |
345 | recognitionCancelled = true; |
346 | //stopListening(); |
347 | //listening = false; |
348 | //if (sr != null) sr.cancel(); |
349 | //callOptMC('setBorderAndStatus, aWhite(), baseStatus()); |
350 | } |
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1001279 |
Snippet name: | Android Cat Main (include, old) |
Eternal ID of this version: | #1001279/118 |
Text MD5: | cfa19f07bc8a689fec04e968e3d6e2c0 |
Author: | stefan |
Category: | |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2019-05-21 14:01:15 |
Source code size: | 9419 bytes / 350 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 853 / 2570 |
Version history: | 117 change(s) |
Referenced in: | [show references] |