porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java
Go to the documentation of this file.
1 /*
2  Copyright 2021 Picovoice Inc.
3 
4  You may not use this file except in compliance with the license. A copy of the license is
5  located in the "LICENSE" file accompanying this source.
6 
7  Unless required by applicable law or agreed to in writing, software distributed under the
8  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
9  express or implied. See the License for the specific language governing permissions and
10  limitations under the License.
11 */
12 
13 package ai.picovoice.porcupine.sttdemo;
14 
15 
16 import android.Manifest;
17 import android.content.Intent;
18 import android.content.pm.PackageManager;
19 import android.graphics.Color;
20 import android.os.Bundle;
21 import android.os.Handler;
22 import android.os.Looper;
23 import android.speech.RecognitionListener;
24 import android.speech.RecognizerIntent;
25 import android.speech.SpeechRecognizer;
26 import android.view.View;
27 import android.widget.TextView;
28 import android.widget.Toast;
29 import android.widget.ToggleButton;
30 
31 import androidx.annotation.NonNull;
32 import androidx.appcompat.app.AppCompatActivity;
33 import androidx.core.app.ActivityCompat;
34 import androidx.core.content.ContextCompat;
35 
36 import java.util.ArrayList;
37 import java.util.Locale;
38 
48 
49 enum AppState {
50  STOPPED,
51  WAKEWORD,
52  STT
53 }
54 
55 public class MainActivity extends AppCompatActivity {
57 
58  private static final String ACCESS_KEY = "${YOUR_ACCESS_KEY_HERE}";
59 
61 
62  private TextView intentTextView;
63  private ToggleButton recordButton;
64 
65  private SpeechRecognizer speechRecognizer;
66  private Intent speechRecognizerIntent;
67 
68  private AppState currentState;
69 
70  private void displayError(String message) {
71  Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
72  }
73 
75  @Override
76  public void invoke(int keywordIndex) {
77  runOnUiThread(() -> {
78  intentTextView.setText("");
79  try {
80  // need to stop porcupine manager before speechRecognizer can start listening.
82  } catch (PorcupineException e) {
83  displayError("Failed to stop Porcupine.");
84  return;
85  }
86 
88  currentState = AppState.STT;
89  });
90  }
91  };
92 
93  @Override
94  protected void onCreate(Bundle savedInstanceState) {
95  super.onCreate(savedInstanceState);
96  setContentView(R.layout.activity_main);
97 
98  intentTextView = findViewById(R.id.intentView);
99  recordButton = findViewById(R.id.record_button);
100 
101  // on android 11, RecognitionService has to be specifically added to android manifest.
102  if (!SpeechRecognizer.isRecognitionAvailable(this)) {
103  displayError("Speech Recognition not available.");
104  }
105 
106  speechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
107  speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
108  speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
109  speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
110 
111  try {
114  .setKeyword(defaultKeyword)
115  .setSensitivity(0.7f)
116  .build(getApplicationContext(), porcupineManagerCallback);
117 
120  String.format("%s\nEnsure your accessKey '%s' is a valid access key.", e.getMessage(), ACCESS_KEY)
121  );
122  } catch (PorcupineActivationException e) {
123  onPorcupineInitError("AccessKey activation error");
125  onPorcupineInitError("AccessKey reached its device limit");
127  onPorcupineInitError("AccessKey refused");
129  onPorcupineInitError("AccessKey has been throttled");
130  } catch (PorcupineException e) {
131  onPorcupineInitError("Failed to initialize Porcupine " + e.getMessage());
132  }
133 
134  currentState = AppState.STOPPED;
135  }
136 
137  private void onPorcupineInitError(final String errorMessage) {
138  runOnUiThread(() -> {
139  TextView errorText = findViewById(R.id.errorMessage);
140  errorText.setText(errorMessage);
141  errorText.setVisibility(View.VISIBLE);
142 
143  ToggleButton recordButton = findViewById(R.id.record_button);
144  recordButton.setBackground(ContextCompat.getDrawable(
145  getApplicationContext(),
146  R.drawable.disabled_button_background));
147  recordButton.setChecked(false);
148  recordButton.setEnabled(false);
149  });
150  }
151 
152  @Override
153  protected void onStop() {
154  if (recordButton.isChecked()) {
155  stopService();
156  recordButton.toggle();
157  speechRecognizer.destroy();
158  }
159 
160  super.onStop();
161  }
162 
163  private boolean hasRecordPermission() {
164  return ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
165  }
166 
167  private void requestRecordPermission() {
168  ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 0);
169  }
170 
171  private void playback(int milliSeconds) {
172  speechRecognizer.stopListening();
173  currentState = AppState.WAKEWORD;
174 
175  new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
176  @Override
177  public void run() {
178  if (currentState == AppState.WAKEWORD) {
180  intentTextView.setTextColor(Color.WHITE);
181  intentTextView.setText("Listening for " + defaultKeyword + " ...");
182  }
183  }
184  }, milliSeconds);
185  }
186 
187  private void stopService() {
188  if(porcupineManager != null) {
189  try {
191  } catch (PorcupineException e) {
192  displayError("Failed to stop porcupine.");
193  }
194  }
195 
196  intentTextView.setText("");
197  speechRecognizer.stopListening();
198  speechRecognizer.destroy();
199  currentState = AppState.STOPPED;
200  }
201 
202  @Override
203  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
204  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
205  if (grantResults.length == 0 || grantResults[0] == PackageManager.PERMISSION_DENIED) {
206  onPorcupineInitError("Microphone permission is required for this demo");
207  } else {
208  speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
209  speechRecognizer.setRecognitionListener(new SpeechListener());
210  playback(0);
211  }
212  }
213 
214  public void process(View view) {
215  if (recordButton.isChecked()) {
216  if (hasRecordPermission()) {
217  speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
218  speechRecognizer.setRecognitionListener(new SpeechListener());
219  playback(0);
220  } else {
222  }
223  } else {
224  stopService();
225  }
226  }
227 
228  private class SpeechListener implements RecognitionListener {
229  @Override
230  public void onReadyForSpeech(Bundle params) {
231  }
232 
233  @Override
234  public void onBeginningOfSpeech() {
235  }
236 
237  @Override
238  public void onRmsChanged(float rmsdB) {
239  }
240 
241  @Override
242  public void onBufferReceived(byte[] buffer) {
243  }
244 
245  @Override
246  public void onEndOfSpeech() {
247  }
248 
249  @Override
250  public void onError(int error) {
251  switch (error) {
252  case SpeechRecognizer.ERROR_AUDIO:
253  displayError("Error recording audio.");
254  break;
255  case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
256  displayError("Insufficient permissions.");
257  break;
258  case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
259  case SpeechRecognizer.ERROR_NETWORK:
260  displayError("Network Error.");
261  break;
262  case SpeechRecognizer.ERROR_NO_MATCH:
263  if (recordButton.isChecked()) {
264  displayError("No recognition result matched.");
265  playback(1000);
266  }
267  case SpeechRecognizer.ERROR_CLIENT:
268  return;
269  case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
270  displayError("Recognition service is busy.");
271  break;
272  case SpeechRecognizer.ERROR_SERVER:
273  displayError("Server Error.");
274  break;
275  case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
276  displayError("No speech input.");
277  break;
278  default:
279  displayError("Something wrong occurred.");
280  }
281 
282  stopService();
283  recordButton.toggle();
284  }
285 
286  @Override
287  public void onResults(Bundle results) {
288  ArrayList<String> data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
289  intentTextView.setTextColor(Color.WHITE);
290  intentTextView.setText(data.get(0));
291 
292  playback(3000);
293  }
294 
295  @Override
296  public void onPartialResults(Bundle partialResults) {
297  ArrayList<String> data = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
298  intentTextView.setTextColor(Color.DKGRAY);
299  intentTextView.setText(data.get(0));
300  }
301 
302  @Override
303  public void onEvent(int eventType, Bundle params) {
304  }
305  }
306 }
R
#define R
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/stb_vorbis.c:5104
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onEndOfSpeech
void onEndOfSpeech()
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:246
ai.picovoice.porcupine
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationException.java:11
ai.picovoice.porcupine.sttdemo.MainActivity.playback
void playback(int milliSeconds)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:171
ai.picovoice.porcupine.sttdemo.MainActivity.recordButton
ToggleButton recordButton
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:63
run
void run(class_loader::ClassLoader *loader)
ai.picovoice.porcupine.sttdemo.MainActivity.speechRecognizer
SpeechRecognizer speechRecognizer
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:65
ai.picovoice.porcupine.PorcupineManager.start
void start()
Definition: PorcupineManager.java:70
ai.picovoice.porcupine.PorcupineManager.Builder.setAccessKey
PorcupineManager.Builder setAccessKey(String accessKey)
Definition: PorcupineManager.java:100
ai.picovoice.porcupine.PorcupineManager.Builder
Definition: PorcupineManager.java:91
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onBufferReceived
void onBufferReceived(byte[] buffer)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:242
ai.picovoice.porcupine.sttdemo.MainActivity.onPorcupineInitError
void onPorcupineInitError(final String errorMessage)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:137
ai.picovoice.porcupine.sttdemo.MainActivity.onStop
void onStop()
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:153
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onEvent
void onEvent(int eventType, Bundle params)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:303
ai.picovoice.porcupine.sttdemo.MainActivity.hasRecordPermission
boolean hasRecordPermission()
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:163
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:228
f
f
ai.picovoice.porcupine.sttdemo.MainActivity.onCreate
void onCreate(Bundle savedInstanceState)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:94
ai.picovoice.porcupine.sttdemo.MainActivity.porcupineManagerCallback
final PorcupineManagerCallback porcupineManagerCallback
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:74
ai.picovoice.porcupine.PorcupineActivationRefusedException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationRefusedException.java:13
ai.picovoice.porcupine.PorcupineException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineException.java:13
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onResults
void onResults(Bundle results)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:287
ai.picovoice.porcupine.PorcupineActivationException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationException.java:13
ai.picovoice.porcupine.PorcupineActivationLimitException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationLimitException.java:13
ai.picovoice.porcupine.sttdemo.MainActivity.currentState
AppState currentState
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:68
ai.picovoice.porcupine.sttdemo.MainActivity.speechRecognizerIntent
Intent speechRecognizerIntent
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:66
ai.picovoice.porcupine.sttdemo.MainActivity.porcupineManager
PorcupineManager porcupineManager
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:56
ai.picovoice.porcupine.sttdemo.MainActivity
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:55
ai
ai.picovoice
ai.picovoice.porcupine.sttdemo.MainActivity.stopService
void stopService()
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:187
ai.picovoice.porcupine.sttdemo.MainActivity.process
void process(View view)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:214
ai.picovoice.porcupine.PorcupineManagerCallback
Definition: PorcupineManagerCallback.java:15
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onError
void onError(int error)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:250
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onRmsChanged
void onRmsChanged(float rmsdB)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:238
ai.picovoice.porcupine.sttdemo.MainActivity.requestRecordPermission
void requestRecordPermission()
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:167
error
static int error(vorb *f, enum STBVorbisError e)
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/stb_vorbis.c:896
ai.picovoice.porcupine.sttdemo.MainActivity.ACCESS_KEY
static final String ACCESS_KEY
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:58
ai.picovoice.porcupine.sttdemo.MainActivity.defaultKeyword
final Porcupine.BuiltInKeyword defaultKeyword
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:60
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.PORCUPINE
PORCUPINE
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:158
ai.picovoice.porcupine.Porcupine
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:35
ai.picovoice.porcupine.PorcupineActivationThrottledException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationThrottledException.java:13
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onBeginningOfSpeech
void onBeginningOfSpeech()
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:234
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onPartialResults
void onPartialResults(Bundle partialResults)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:296
ai.picovoice.porcupine.sttdemo.MainActivity.intentTextView
TextView intentTextView
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:62
ai.picovoice.porcupine.PorcupineManager
Definition: PorcupineManager.java:35
ai.picovoice.porcupine.Porcupine.BuiltInKeyword
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:145
ai.picovoice.porcupine.sttdemo.MainActivity.displayError
void displayError(String message)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:70
ai.picovoice.porcupine.PorcupineInvalidArgumentException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineInvalidArgumentException.java:13
ai.picovoice.porcupine.PorcupineManager.stop
void stop()
Definition: PorcupineManager.java:80
ai.picovoice.porcupine.sttdemo.MainActivity.onRequestPermissionsResult
void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:203
ai.picovoice.porcupine.sttdemo.MainActivity.SpeechListener.onReadyForSpeech
void onReadyForSpeech(Bundle params)
Definition: porcupine/demo/android/STT/porcupine-stt-demo-app/src/main/java/ai/picovoice/porcupine/sttdemo/MainActivity.java:230


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:13:56