Использование 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-помощник.

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

Похожие

Использование представлений отношений, аргументов и вложений
Эта статья также доступно на французском языке от KolossalDrupal , Существует невероятное количество функций, которые могут быть предоставлены Модуль просмотров особенно в сочетании с разумным использованием полей ссылок на узлы. Когда вы связываете узлы вашего сайта с полями Reference Node, эти отношения
Безопасность общего компьютера
Администратор общего компьютера должен защитить операционную систему и обеспечить конфиденциальность каждого пользователя. Все диски хорошо защищенного устройства должны быть в формате NTFS. Если вы используете другую файловую систему, первый шаг, который необходимо сделать для повышения безопасности, - это преобразовать тома в формат файла NTFS. Эта система является неотъемлемой частью безопасности в Windows XP. Подавляющее большинство инструкций в этой статье основано на механизме контроля
Eset Nod32 Keys Имя пользователя и пароль 25 октября 2018 г. [100% работает]
GoKeep: Использование Google Keep с iPhone и iPad
Майк Белшнер 23 апреля 2015 года в 15:48 • около 2 минут чтения
SEO фон - что это такое и как им пользоваться? - Деланте
SEO фон - что это? Фон SEO можно понять двумя способами: Для некоторых это общая ссылка, которая ведет на наш сайт и создается на разных каналах. Вы можете включать в себя: блоги, форумы, профили, каналы в социальных сетях, каталоги. Согласно второму подходу, он узко понимается как конкретная страница, на которой публикуются статьи. Чаще всего эти статьи имеют отношение к отрасли и позволяют получить ценные ссылки на наш сайт. В этой статье мы
Как редактировать документы Microsoft Office, хранящиеся на Google Диске
Энди Вулбер показывает, как редактировать документы Word, Excel и PowerPoint, хранящиеся на Google Диске, с вашего настольного или мобильного устройства. Что нового в TechRepublic Многие организации, которые
Quot; encoding = "UTF-8"?
Quot; encoding = "utf-8"?