Использование Android-преобразования текста в речь для создания Smart Assistant

  1. Говорящий
  2. прослушивание
  3. Учусь
  4. Умная речь

В этом уроке я покажу вам, как создать простое приложение для Android, которое слушает речь пользователя и преобразует его в текст. Затем приложение будет анализировать текст и использовать его в качестве команды для хранения данных или ответа пользователя.

Пользовательский интерфейс приложения прост, всего одна кнопка ImageButton в центре полноэкранного градиентного фона. Каждый раз, когда пользователь говорит, они нажимают кнопку и разговаривают.

Вы можете найти окончательный проект на Github ,

Создайте новый проект в Android Studio, выбрав минимальный уровень API 18 и добавив пустое действие . Это будет единственное мероприятие в проекте.

Чтобы сделать просмотр полноэкранным, откройте AndroidManifest.xml и установите android: theme = "@ style / Theme.AppCompat.NoActionBar". Это скроет панель действий от нашей активности.

Теперь у вас есть полноэкранный белый макет с TextView внутри. Чтобы улучшить его, добавьте градиентную форму в RelativeLayout

Щелкните правой кнопкой мыши на папке Drawable и выберите New -> Drawable файл ресурсов . Назовите это 'background' и замените код следующим:

<? xml version = "1.0&quot; encoding = "UTF-8"?> <shape xmlns: android = "http://schemas.android.com/apk/res/android" android: shape = "rectangle"> <градиент android: type = "linear" android: startColor = "# FF85FBFF" android: endColor = "# FF008080" android: angle = "45" /> </ shape>

Не стесняйтесь менять цвета и угол на ваш собственный.

ImageButton внутри макета использует изображение из Значки дизайна материалов , Загрузите и добавьте его как src.

Обновите код в файле activity_main.xml :

<? xml version = "1.0&quot; encoding = "utf-8"?> <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: background =" @ drawable / background "android: id =" @ + id / rel "tools: context =" com.example .theodhor.speechapplication.MainActivity "> <ImageButton android: layout_width =" wrap_content "android: layout_height =" wrap_content "android: id =" @ + id / микрофонButton "android: layout_centerVertical =" true "android: layout_centerHor horizontal =" true "android : src = "@ drawable / ic_mic_none_white_48dp" android: background = "@ null" /> </ RelativeLayout>

Говорящий

Теперь пользовательский интерфейс завершен, следующим шагом является Java-код внутри MainActivity.

Объявите переменную TextToSpeech над методом onCreate:

приватный TextToSpeech tts;

Внутри onCreate добавить:

tts = new TextToSpeech (this, 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", "Этот язык не поддерживается");} говорить ("Привет");} else {Log.e ("TTS", "Ошибка инициализации!");}}});

Это запускает службу TextToSpeech. Метод speak () принимает параметр String, представляющий собой текст, который вы хотите использовать для Android.

Создайте метод и добавьте этот код:

private void speak (текст строки) {if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP) {tts.speak (text, TextToSpeech.QUEUE_FLUSH, null, null); } else {tts.speak (text, TextToSpeech.QUEUE_FLUSH, null); }}

Внутри метода есть проверка Build.VERSION, потому что tts.speak (param, param, param) не рекомендуется для уровней API выше 5.1

После speak () создайте другой метод, чтобы остановить службу TextToSpeech, когда пользователь закрывает приложение:

@Override public void onDestroy () {if (tts! = Null) {tts.stop (); tts.shutdown (); } super.onDestroy (); }

На этом этапе приложение говорит «Привет» после запуска. Следующий шаг - заставить его слушать.

прослушивание

Чтобы заставить приложение слушать, вы будете использовать кнопку микрофона. Добавьте этот код в onCreate:

findViewById (R.id.microphoneButton) .setOnClickListener (new View.OnClickListener () {@Override public void onClick (View v) {listen ();}});

Нажатие на функцию ImageButton вызовет эту функцию:

private void listen () {Intent i = new Intent (RecognizerIntent.ACTION_RECOGNIZE_SPEECH); i.putExtra (RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); i.putExtra (RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault ()); i.putExtra (RecognizerIntent.EXTRA_PROMPT, «Скажи что-нибудь»); try {startActivityForResult (i, 100); } catch (ActivityNotFoundException a) {Toast.makeText (MainActivity.this, «Ваше устройство не поддерживает распознавание речи», Toast.LENGTH_SHORT) .show (); }}

Этот метод запускает прослушивание, которое отображается в виде диалога с текстовой подсказкой. Язык речи берется с устройства через метод Locale.getDefault ().

Метод startActivityForResult (i, 100) ожидает, пока текущее действие вернет результат. 100 - это произвольный код, прикрепленный к начальному действию, и может быть любым числом, которое подходит для вашего варианта использования. Когда результат возвращается из запущенного действия, он содержит этот код и использует его для различения нескольких результатов друг от друга.

Чтобы поймать результат от запущенного действия, добавьте этот переопределенный метод:

@Override protected void onActivityResult (int requestCode, int resultCode, данные намерений) {super.onActivityResult (requestCode, resultCode, data); if (requestCode == 100) {if (resultCode == RESULT_OK && null! = data) {ArrayList <String> res = data.getStringArrayListExtra (RecognizerIntent.EXTRA_RESULTS); String inSpeech = res.get (0); признание (inSpeech); }}}

Этот метод перехватывает каждый результат, полученный в результате действия, и использует requestCode для результата распознавателя речи. Если requestCode равен 100, resultCode равен OK и данные из этого результата не равны NULL. Вы получаете строку результата из res.get (0)

Создайте новый метод распознавания, который будет принимать строку в качестве параметра:

распознавание приватной пустоты (текст строки) {Log.e («речь», «+ текст»); }

На этом этапе приложение может прослушивать после того, как пользователь нажимает кнопку микрофона, и преобразовывает речь пользователя в текст. Результат печатается в журнале ошибок .

Учусь

Чтобы сделать приложение более интересным, на этом шаге вы собираетесь сделать приложение способным изучать простые вещи, такие как ваше имя. Чтобы сделать это возможным, вам нужно использовать локальное хранилище.

Добавьте эти строки над методом onCreate:

личные настройки SharedPreferences; частный редактор SharedPreferences.Editor; приватная статическая final String PREFS = "prefs"; приватная статическая final String NAME = "name"; приватная статическая final String AGE = "age"; приватная статическая final String AS_NAME = "as_name";

Затем внутри onCreate добавьте:

предпочтения = getSharedPreferences (PREFS, 0); редактор = предпочтения.edit ();

Сначала вам нужно заставить приложение задать вопрос, поэтому измените говорить («Привет»), чтобы говорить («Как вас зовут?»)

Здесь вы можете использовать простую логику, поэтому, когда кто-то спрашивает: «Как вас зовут?», Вы получите ответ «Меня зовут Дори», взяв имя из ответа. Простой способ - разделить строку ответа пробелами (»«) и получить значение последнего индекса.

Обновите код в методе распознавания:

распознавание приватной пустоты (текст строки) {Log.e («речь», «+ текст»); // создаем массив, содержащий слова ответа String [] speech = text.split (""); // последнее слово - это наше имя String name = speech [speech.length-1]; // мы получили имя, мы можем поместить его в локальное хранилище и сохранить изменения editor.putString (NAME, name) .apply (); // сделать так, чтобы приложение сообщало нам свое имя («Ваше имя» + Preferences.getString (NAME, null)); }

Метод распознавания использует все результаты речи пользователя. Поскольку речь может отличаться, вы можете различать их, используя определенные слова, которые они могут содержать.

Например, код внутри этого метода может быть:

распознавание приватной пустоты (текст строки) {Log.e («речь», «+ текст»); String [] speech = text.split (""); // если речь содержит эти слова, пользователь произносит их имя if (text.contains ("my name is")) {String name = speech [speech.length-1]; Log.e («Ваше имя», «» + имя); editor.putString (имя, название) .Нанесите (); говорить («Ваше имя» + Preferences.getString (ИМЯ, ноль)); }}

Но это все еще простое взаимодействие с приложением. Вы можете заставить его узнать свой возраст или даже дать ему имя.

Внутри того же метода, попробуйте эти простые условия:

// Это должен быть возраст // Просто говорите: мне х лет. if (text.contains ("years") && text.contains ("old")) {String age = speech [speech.length-3]; Log.e («ЭТО», «+ возраст»); editor.putString (AGE, age) .apply (); } // Затем задайте его для вашего возраста if (text.contains ("сколько мне лет")) {говорить ("Вы" + предпочтения.getString (ВОЗРАСТ, ноль) + "лет."); }

Приложение может сказать вам время:

// Спросите: который час? if (text.contains ("который час")) {SimpleDateFormat sdfDate = new SimpleDateFormat ("ЧЧ: мм"); // дд / мм / гггг Дата сейчас = новая дата (); String [] strDate = sdfDate.format (сейчас) .split (":"); if (strDate [1] .contains ("00")) strDate [1] = "часы"; говорить («Время пришло» + sdfDate.format (сейчас)); }

Умная речь

В проект GitHub Я включил больше примеров, чтобы вы могли поэкспериментировать и создать свой собственный Android-помощник.

Надеюсь, вам понравился этот урок, и вы поговорили с вами по телефону Любые вопросы или комментарии, пожалуйста, дайте мне знать ниже.

Quot; encoding = "UTF-8"?
Quot; encoding = "utf-8"?