Распознавание речи Android

200
28 июля 2018, 01:40

В сети очень много вопросов пропавшему автору интересного кода - прямого распознавания речи. Код выдаёт 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), может есть похожие проекты распознавания голоса в прямом времени?

READ ALSO
Android/Java — как выводить несколько переменных в строке?

Android/Java — как выводить несколько переменных в строке?

Делаю простое приложение по заказу кофе, основываясь на одном курсе из Udacity, только добавляя свои фишки, ибо они оставляют много "дыр"

226
Начало работы с vk api

Начало работы с vk api

Хочу написать бота для вкНо столкнулся с такой проблемой

190
Переход с одного webview на другой

Переход с одного webview на другой

В Android studio сделал простой список используя массив listviewПредположим что в нем 3 пункта при нажатии на каждый выходит свой текст в файле txt

188
Jsoup java не подгружаются некоторые элементы

Jsoup java не подгружаются некоторые элементы

Парсю сайт с ценами на бензин , вот мой код:

153