Java tutorial
/* * Copyright (c) Microsoft. All rights reserved. * Licensed under the MIT license. * // * Microsoft Cognitive Services (formerly Project Oxford): https://www.microsoft.com/cognitive-services * // * Microsoft Cognitive Services (formerly Project Oxford) GitHub: * https://github.com/Microsoft/Cognitive-Speech-STT-Android * // * Copyright (c) Microsoft Corporation * All rights reserved. * // * MIT License: * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * // * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * // * THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.microsoft.AzureIntelligentServicesExample; import android.app.Activity; import android.app.AlertDialog; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Vibrator; import android.preference.PreferenceManager; import android.speech.tts.TextToSpeech; import android.support.v4.app.NotificationCompat; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import com.microsoft.bing.speech.SpeechClientStatus; import com.microsoft.projectoxford.speechrecognition.DataRecognitionClient; import com.microsoft.projectoxford.speechrecognition.ISpeechRecognitionServerEvents; import com.microsoft.projectoxford.speechrecognition.MicrophoneRecognitionClient; import com.microsoft.projectoxford.speechrecognition.RecognitionResult; import com.microsoft.projectoxford.speechrecognition.RecognitionStatus; import com.microsoft.projectoxford.speechrecognition.SpeechRecognitionMode; import com.microsoft.projectoxford.speechrecognition.SpeechRecognitionServiceFactory; import java.io.InputStream; import java.util.Locale; public class MainActivity extends Activity implements ISpeechRecognitionServerEvents { int m_waitSeconds = 0; DataRecognitionClient dataClient = null; MicrophoneRecognitionClient micClient = null; FinalResponseStatus isReceivedResponse = FinalResponseStatus.NotReceived; EditText _logText; Button _startButton; TextToSpeech tts; public enum FinalResponseStatus { NotReceived, OK, Timeout } public String getPrimaryKey() { return this.getString(R.string.primaryKey); } /** * Gets the secondary subscription key */ public String getSecondaryKey() { return this.getString(R.string.secondaryKey); } /** * Gets the LUIS application identifier. * @return The LUIS application identifier. */ private String getLuisAppId() { return this.getString(R.string.luisAppID); } /** * Gets the LUIS subscription identifier. * @return The LUIS subscription identifier. */ private String getLuisSubscriptionID() { return this.getString(R.string.luisSubscriptionID); } /** * Gets a value indicating whether or not to use the microphone. * @return true if [use microphone]; otherwise, false. */ private Boolean getUseMicrophone() { return true; } /** * Gets a value indicating whether LUIS results are desired. * @return true if LUIS results are to be returned otherwise, false. */ private Boolean getWantIntent() { return false; } /** * Gets the current speech recognition mode. * @return The speech recognition mode. */ private SpeechRecognitionMode getMode() { return SpeechRecognitionMode.LongDictation; } /** * Gets the default locale. * @return The default locale. */ private String getDefaultLocale() { return "en-us"; } // Method to start the service public void startService(View view) { startService(new Intent(getBaseContext(), listenService.class)); } // Method to stop the service public void stopService(View view) { stopService(new Intent(getBaseContext(), listenService.class)); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this._logText = (EditText) findViewById(R.id.editText1); this._startButton = (Button) findViewById(R.id.button1); tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { int result = tts.setLanguage(Locale.US); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e("TTS", "This Language is not supported"); Intent installIntent = new Intent(); installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity(installIntent); } } else { Log.e("TTS", "Initilization Failed!"); } } }); ImageView sendBtn = (ImageView) findViewById(R.id.sendBtn); final EditText message = (EditText) findViewById(R.id.message); sendBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { _logText.append("ME : " + message.getText().toString() + "\n"); speakOut(message.getText().toString()); message.setText(""); } }); if (getString(R.string.primaryKey).startsWith("Please")) { new AlertDialog.Builder(this).setTitle(getString(R.string.add_subscription_key_tip_title)) .setMessage(getString(R.string.add_subscription_key_tip)).setCancelable(false).show(); } // setup the buttons final MainActivity This = this; this._startButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { This.StartButton_Click(arg0); } }); } private void StartButton_Click(View arg0) { this._startButton.setEnabled(false); this.m_waitSeconds = 20; if (this.getUseMicrophone()) { if (this.micClient == null) { if (this.getWantIntent()) { this.micClient = SpeechRecognitionServiceFactory.createMicrophoneClientWithIntent(this, this.getDefaultLocale(), this, this.getPrimaryKey(), this.getSecondaryKey(), this.getLuisAppId(), this.getLuisSubscriptionID()); } else { this.micClient = SpeechRecognitionServiceFactory.createMicrophoneClient(this, this.getMode(), this.getDefaultLocale(), this, this.getPrimaryKey(), this.getSecondaryKey()); } } this.micClient.startMicAndRecognition(); } } public void onFinalResponseReceived(final RecognitionResult response) { boolean isFinalDicationMessage = this.getMode() == SpeechRecognitionMode.LongDictation && (response.RecognitionStatus == RecognitionStatus.EndOfDictation || response.RecognitionStatus == RecognitionStatus.DictationEndSilenceTimeout); if (null != this.micClient && this.getUseMicrophone() && ((this.getMode() == SpeechRecognitionMode.ShortPhrase) || isFinalDicationMessage)) { // we got the final result, so it we can end the mic reco. No need to do this // for dataReco, since we already called endAudio() on it as soon as we were done // sending all the data. this.micClient.endMicAndRecognition(); } if (isFinalDicationMessage) { this._startButton.setEnabled(true); this.isReceivedResponse = FinalResponseStatus.OK; } if (!isFinalDicationMessage) { this.WriteLine("********* Final Result ************"); for (int i = 0; i < response.Results.length; i++) { this.WriteLine("[" + i + "]" + " Confidence=" + response.Results[i].Confidence + " Text=\"" + response.Results[i].DisplayText + "\""); } this.WriteLine(); } } public void onIntentReceived(final String payload) { this.WriteLine("--- Intent received by onIntentReceived() ---"); this.WriteLine(payload); this.WriteLine(); } public void onPartialResponseReceived(final String response) { //this.WriteLine("--- Partial result received by onPartialResponseReceived() ---"); this.WriteLine(response); this.WriteLine(); } public void onError(final int errorCode, final String response) { this._startButton.setEnabled(true); this.WriteLine("--- Error received by onError() ---"); this.WriteLine("Error code: " + SpeechClientStatus.fromInt(errorCode) + " " + errorCode); this.WriteLine("Error text: " + response); this.WriteLine(); } public void onAudioEvent(boolean recording) { this.WriteLine("--- Microphone status change received by onAudioEvent() ---"); this.WriteLine("********* Microphone status: " + recording + " *********"); if (recording) { this.WriteLine("Please start speaking."); } WriteLine(); if (!recording) { this.micClient.endMicAndRecognition(); this._startButton.setEnabled(true); } } private void WriteLine() { this.WriteLine(""); } public void showNotification() { Notification notification = new NotificationCompat.Builder(this) .setSmallIcon(android.R.drawable.ic_menu_report_image).setContentTitle("Alert") .setContentText("User is called.").setAutoCancel(true).build(); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(0, notification); } private void WriteLine(String text) { final SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); String user_name = getPrefs.getString("userName", ""); if (text.contains(user_name)) { Vibrator v = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE); v.vibrate(500); showNotification(); } this._logText.append(text + "\n"); } /* * Speech recognition with data (for example from a file or audio source). * The data is broken up into buffers and each buffer is sent to the Speech Recognition Service. * No modification is done to the buffers, so the user can apply their * own VAD (Voice Activation Detection) or Silence Detection * * @param dataClient * @param recoMode * @param filename */ private class RecognitionTask extends AsyncTask<Void, Void, Void> { DataRecognitionClient dataClient; SpeechRecognitionMode recoMode; String filename; RecognitionTask(DataRecognitionClient dataClient, SpeechRecognitionMode recoMode, String filename) { this.dataClient = dataClient; this.recoMode = recoMode; this.filename = filename; } @Override protected Void doInBackground(Void... params) { try { // Note for wave files, we can just send data from the file right to the server. // In the case you are not an audio file in wave format, and instead you have just // raw data (for example audio coming over bluetooth), then before sending up any // audio data, you must first send up an SpeechAudioFormat descriptor to describe // the layout and format of your raw audio data via DataRecognitionClient's sendAudioFormat() method. // String filename = recoMode == SpeechRecognitionMode.ShortPhrase ? "whatstheweatherlike.wav" : "batman.wav"; InputStream fileStream = getAssets().open(filename); int bytesRead = 0; byte[] buffer = new byte[1024]; do { // Get Audio data to send into byte buffer. bytesRead = fileStream.read(buffer); if (bytesRead > -1) { // Send of audio data to service. dataClient.sendAudio(buffer, bytesRead); } } while (bytesRead > 0); } catch (Throwable throwable) { throwable.printStackTrace(); } finally { dataClient.endAudio(); } return null; } } private void speakOut(String sent) { tts.speak(sent, TextToSpeech.QUEUE_FLUSH, null); } }