В сети очень много вопросов пропавшему автору интересного кода - прямого распознавания речи. Код выдаёт 9-ю ошибку. Видео автора: https://www.youtube.com/watch?v=KMm739q0N4M&feature=youtu.be
MainActivity
package by.umdom.voice;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import android.content.Context;
import android.media.AudioManager;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.widget.Toast;
public class MainActivity extends Activity implements TextToSpeech.OnInitListener {//Создание основного
// класса с интерфейсом RecognitionListener для обработки событий связанных с распознаванием речи
// и интерфейсом для инициализации синтезатора голоса
public int r19=10;
public int upbluetooth = 1;
public String spout;
public String sp;
public TextToSpeech tts;
private TextView returnedText;
private TextView ErrText;
private TextView editTexts;
private TextView temText;
private TextView oText;
public Button Button1;
public Button Button2;
public Button Button3;
public SpeechRecognizer speech = null;
public Intent recognizerIntent;
//Socket, с помощью которого будут отправляться данные на bluetooth Arduino
public BluetoothSocket clientSocket;
// UUID случае подключения к последовательному bluetooth устройству
private UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
public HashMap<String, String> params = new HashMap<String, String>();
private int bluecancel=0;
public String st;
public int value=100;
public int bytes;
public byte[] buffer = new byte[128];
public String readMessage;
public Timer time;
private Context ma;
// Вопросы
public String sp0 = "выключить красный";
public String sp1 = "включить красный";
public String sp2 = "выключить зеленый";
public String sp3 = "включить зеленый";
public String sp4 = "выключить синий";
public String sp5 = "включить синий";
public String sp6 = "температура";
public String sp10 = "как тебя зовут";
public String sp11 = "что ты умеешь";
public String sp12 = "твои команды";
public String sp13 = "спасибо";
public String sp14 = "откуда ты";
public String sp15 = "привет";
public String sp16 = "маша";
public String sp19 = "конец связи";
// Ответы
public String sp20 = "меня зовут маша";
public String sp21 = "я могу включать и выключать свет и определять температуру";
public String sp22 = "Включить зеленый. Выключить зеленый. То же для красного и синего. Температура.";
public String sp23 = "пожалуйста";
public String sp24 = "я из хмельницкого";
public String sp25 = "здравствуйте";
public String sp26 = "я здесь";
public String sp29 = "до свидания";
public String sp30 = "красный выключила";
public String sp31 = "красный включила";
public String sp32 = "зеленый выключила";
public String sp33 = "зеленый включила";
public String sp34 = "синий выключила";
public String sp35 = "синий включила";
public AudioManager myAudioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
returnedText = (TextView) findViewById(R.id.textView1);
ErrText = (TextView) findViewById(R.id.textView2);
temText = (TextView) findViewById(R.id.textView6);
oText = (TextView) findViewById(R.id.textView5);
editTexts = (TextView) findViewById(R.id.editTexts);
Button1 = (Button) findViewById(R.id.button1);
Button2 = (Button) findViewById(R.id.button2);
Button3 = (Button) findViewById(R.id.button3);
utteranceProgressListener TextSpeech = new utteranceProgressListener(); //Экземпляр класса слушателя
tts = new TextToSpeech(this, this);
tts.setOnUtteranceProgressListener(TextSpeech); //Установка слушателя синтеза речи
ma=this;
// Создание экземпляра класса AudioManager
myAudioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
}
@Override
public void onDestroy() {
super.onDestroy();
// Остановить синтезатор речи tts!
if (tts != null) {
tts.stop();
tts.shutdown();
}
if (upbluetooth == 0) {
try {
clientSocket.close(); // Закрыть соединение с bluetooth
} catch (IOException e2) {
}
}
}
@Override
public void onInit(int status) { // Инициализация перед синтезом речи
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.getDefault());
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
}
} else {
Log.e("TTS", "Init Failed!");
}
}
public void bspeesh() {
speech = SpeechRecognizer.createSpeechRecognizer(ma); //Создание объекта распознавателя речи
speech.setRecognitionListener(thiss); //Установить обработчик событий распознавания
// Передача параметров
recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
this.getPackageName());
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
}
RecognitionListener thiss = new RecognitionListener(){
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
oText.setText("НЕ ГОВОРИ");
}
@Override
public void onError(int errorCode) {
speak_off(); //Выключить звук в случае любой ошибки
String errorMessage = getErrorText(errorCode); // Вызов метода расшифровки ошибки
ErrText.setText(errorMessage + "; Ошибка=№"+errorCode);
speech.destroy();
bspeesh();
oText.setText("ГОВОРИ");
speech.startListening(recognizerIntent);
}
@Override
public void onEvent(int arg0, Bundle arg1) {
}
@Override
public void onPartialResults(Bundle arg0) {
}
@Override
public void onReadyForSpeech(Bundle arg0) {
}
@Override
public void onResults(Bundle results) { // Результаты распознавания
ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
sp = data.get(0).toString();
value=100;
returnedText.setText(sp);
spout = sp;
int r0 = sp.compareTo(sp0);
int r1 = sp.compareTo(sp1);
int r2 = sp.compareTo(sp2);
int r3 = sp.compareTo(sp3);
int r4 = sp.compareTo(sp4);
int r5 = sp.compareTo(sp5);
int r6 = sp.compareTo(sp6);
int r10 = sp.compareTo(sp10);
int r11 = sp.compareTo(sp11);
int r12 = sp.compareTo(sp12);
int r13 = sp.compareTo(sp13);
int r14 = sp.compareTo(sp14);
int r15 = sp.compareTo(sp15);
int r16 = sp.compareTo(sp16);
int r19 = sp.compareTo(sp19);
if (r0 == 0) spout = sp30;
if (r1 == 0) spout = sp31;
if (r2 == 0) spout = sp32;
if (r3 == 0) spout = sp33;
if (r4 == 0) spout = sp34;
if (r5 == 0) spout = sp35;
if (r6 == 0) spout = sp6;
if (r10 == 0) spout = sp20;
if (r11 == 0) spout = sp21;
if (r12 == 0) spout = sp22;
if (r13 == 0) spout = sp23;
if (r14 == 0) spout = sp24;
if (r15 == 0) spout = sp25;
if (r16 == 0) spout = sp26;
if (r19 == 0) spout = sp29;
if (upbluetooth == 0) { // Если подключение к bluetooth существует то
// результат сравнения представляем символом
// Например, если результат распознавания голоса соответствует строке
// "включить зеленый" то на bluetooth посылаем символ 3 (код 51)
if (r1 == 0) value = 49;
if (r0 == 0) value = 48;
if (r3 == 0) value = 51;
if (r2 == 0) value = 50;
if (r5 == 0) value = 53;
if (r4 == 0) value = 52;
if (r6 == 0) value = 54;
// Посылаем данные
if (value != 54) outData(value);
if (value == 54) {
temText.setText(readMessage); // Распечатываем температуру
spout = readMessage;
}
}
if (r0==0||r1==0||r2==0||r3==0||r4==0||r5==0||r6==0||r10==0||r11==0||r12==0
||r13==0||r14==0||r15==0||r16==0||r19==0||value==54) // Синтез речи
// выполняется в случае наличия команд и фраз в памяти
{
speak_on(); // Включаем динамики
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "HELLO");
tts.speak(spout, TextToSpeech.QUEUE_ADD, params);// Синтезировать речь
}
else
{
speak_off(); // Если фразы и команды не описаны, выполняется распознавание речи, вывод результата
// в виде строки при выключенных динамиках
speech.stopListening(); //Прекратить слушать речь
speech.destroy(); // Уничтожить объект SpeechRecognizer
bspeesh();
oText.setText("ГОВОРИ");
speech.startListening(recognizerIntent);
}
}
@Override
public void onRmsChanged(float rmsdB) {
}
};
public void onClick1(View view) { // После нажатия на кнопку начать распознавание речи
if(upbluetooth == 0) {
//При нажатии на кнопку останавливаю таймер работы программы по передаче и чтению температуры
time.cancel();
time.purge();
// Запускаю таймер работы программы с новыми начальными данными(посылка запроса температуры и прием темпелатуры)
bluecancel = 0;
time = new Timer();
bluetoothInOut bInOut = new bluetoothInOut();
time.schedule(bInOut, 500, 1000);
}
speak_off();
bspeesh(); // Вызов метода для активизации распознавателя голоса
oText.setText("ГОВОРИ");
speech.startListening(recognizerIntent); // Начать прослушивание речи
}
public void speak_off() // Метод для выключение внешних динамиков планшета
{
myAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}
public void speak_on() // Метод включения внешних динамиков планшета
{
myAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 20, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}
public void onClick2(View view) { // После нажатия на кнопку закончить распознавание
if (speech != null) {
speech.stopListening(); //Прекратить слушать речь
speech.destroy(); // Уничтожить объект SpeechRecognizer
// останавливаю таймер
if (upbluetooth == 0) {
time.cancel();
time.purge();
// и запускаю таймер работы программы с новыми начальными данными(без посылки запроса температуры но с приемом температуры)
bluecancel = 1;
time = new Timer();
bluetoothInOut bInOut = new bluetoothInOut();
time.schedule(bInOut, 500, 1000);
}
}
}
public void onClick3(View view) {
st = editTexts.getText().toString().toUpperCase(); // Получаем адрес bluetooth с строки ввода
bluet();
}
// Класс, который необходим для фиксации окончания синтеза речи с целью запуска активити
// распознавания голоса
public class utteranceProgressListener extends UtteranceProgressListener {
@Override
public void onDone(String utteranceId) { // Действия после окончания речи синтезатором
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
r19 = sp.compareTo(sp19);
if(r19 != 0) { // Если не "конец связи", то активити распознавания голоса запускается вновь
oText.setText("ГОВОРИ");
speech.startListening(recognizerIntent);
}
else {
if(upbluetooth==0) { //Если Bluetooth включен то
// если произнесено "конец связи" - останавливаю таймер
time.cancel();
time.purge();
// и запускаю таймер работы программы с новыми начальными данными(без посылки запроса температуры но с приемом температуры)
bluecancel = 1;
time = new Timer();
bluetoothInOut bInOut = new bluetoothInOut();
time.schedule(bInOut, 500, 1000);
}
}
}
} );
}
@Override
public void onStart(String utteranceId) {
}
@Override
public void onError(String utteranceId) {
}
}
public void bluet() { // Подключение к bluetooth при нажатии на кнопку
Intent enableBt = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
enableBt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(enableBt);
// Используется bluetooth по умолчанию
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
try {
// Выбираем bluetooth с конкретным адресом для простоты
BluetoothDevice device = bluetooth.getRemoteDevice(st);
// Создание RFCOMM секретного socket - а для входящих и исходящих сообщений
clientSocket = device.createRfcommSocketToServiceRecord(uuid);
// Попытка подключения к удаленному bluetooth
clientSocket.connect();
// Если попытка удалась, выводится сообщение внизу экрана
Toast.makeText(getApplicationContext(), "Связь с bluetooth установлена", Toast.LENGTH_LONG).show();
upbluetooth=0;
bluecancel=0;
time = new Timer();
bluetoothInOut bInOut = new bluetoothInOut();
time.schedule(bInOut,500,1000); //Через 500 миллисекунд после запуска программы начинать
// запрашивать температуру каждую секунду
}
//В случае появления ошибок сообщаем, что bluetooth не подключен
catch (IOException e) {
upbluetooth=1;
Toast.makeText(getApplicationContext(), "Проверь bluetooth!", Toast.LENGTH_LONG).show();
}
}
public class bluetoothInOut extends TimerTask {
public void run() {
try {
if( bluecancel == 0 ) // Только в этом случае посылаем запрос температуры
{
OutputStream outStream = clientSocket.getOutputStream();
outStream.write(54);}
// Получаем входной поток для приема данных
InputStream inb = clientSocket.getInputStream();
// Преобразование входного потока от bluetooth в строку
DataInputStream in = new DataInputStream(inb);
bytes = in.read(buffer);
if (bytes > 10 ) // Если через bluetooth получено (например) больше 10 байт, то
{
// преобразуем байты в строку с нулевого индекса до индекса bytes
readMessage = new String(buffer, 0, bytes);
}
} catch (IOException e) {
}
}
}
public void outData(int value) { // Выполняет передачу данных на Bluetooth
try {
// Получаем выходной поток для передачи данных
OutputStream outStream = clientSocket.getOutputStream();
// Посылаем данные
outStream.write(value);
} catch (IOException e) {
}
}
public static String getErrorText(int errorCode) { // Метод возврата ошибки по ее коду
String message;
switch (errorCode) {
case SpeechRecognizer.ERROR_AUDIO:
message = "Audio recording error";
break;
case SpeechRecognizer.ERROR_CLIENT:
message = "Client side error";
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
message = "Insufficient permissions";
break;
case SpeechRecognizer.ERROR_NETWORK:
message = "Network error";
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
message = "Network timeout";
break;
case SpeechRecognizer.ERROR_NO_MATCH:
message = "No match";
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
message = "RecognitionService busy";
break;
case SpeechRecognizer.ERROR_SERVER:
message = "error from server";
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
message = "No speech input";
break;
default:
message = "Didn't understand, please try again.";
break;
}
return message;
}
}
Manifest
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
activity_main.xml (на смартфоне кривовато смотрится)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
tools:context=".MainActivity"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Распознанный текст"
android:id="@+id/textView1"
android:textSize="30dp"
android:textColor="#ff000000"
android:gravity="center"
android:width="700dp"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Сообщение об ошибке"
android:id="@+id/textView2"
android:textColor="#ffff0513"
android:textSize="25dp"
android:gravity="center"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Запустить распознавание"
android:id="@+id/button1"
android:onClick="onClick1"
android:layout_marginTop="94dp"
android:textSize="40dp"
android:layout_below="@+id/button3"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Остановить распознавание"
android:id="@+id/button2"
android:onClick="onClick2"
android:textSize="40dp"
android:layout_marginTop="81dp"
android:layout_below="@+id/button1"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Подключить bluetooth"
android:id="@+id/button3"
android:onClick="onClick3"
android:layout_below="@+id/editTexts"
android:layout_centerHorizontal="true"
android:textSize="40dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Введите адрес и нажмите кнопку"
android:id="@+id/textView3"
android:layout_above="@+id/editTexts"
android:layout_centerHorizontal="true"
android:textSize="30dp"
android:gravity="center" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editTexts"
android:width="300dp"
android:text="00:21:13:04:96:D0"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:textSize="35dp"
android:gravity="center" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView5"
android:hint="Готовность распознавания"
android:textSize="40dp"
android:textStyle="bold"
android:textColor="#ff121dff"
android:textColorHint="#ff0610ff"
android:gravity="center"
android:layout_marginBottom="105dp"
android:layout_above="@+id/textView3"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView6"
android:hint="Температура"
android:textSize="40dp"
android:textColor="#ff059f0e"
android:textColorHint="#ff0ecd0b"
android:textStyle="bold"
android:layout_above="@+id/textView5"
android:layout_centerHorizontal="true"
android:layout_marginBottom="110dp" />
</RelativeLayout>
Проект интересный но выдаёт 9-ю ошибку (Time out), может есть похожие проекты распознавания голоса в прямом времени?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Делаю простое приложение по заказу кофе, основываясь на одном курсе из Udacity, только добавляя свои фишки, ибо они оставляют много "дыр"
В Android studio сделал простой список используя массив listviewПредположим что в нем 3 пункта при нажатии на каждый выходит свой текст в файле txt