
Fragment для добавления голосового управления через Spokestack в любое приложение для Android. Вы можете найти простое демонстрационное приложение, которое показывает лоток в действии в каталоге example .
Когда вы добавите фрагмент лотка Spokestack в свой макет, вы получите кнопку микрофона в форме вкладки на боковой стороне экрана ( на какой стороне она находится на вас, подробнее об этом позже). Постукивание или перетаскивание вкладки показывает остальную часть подноса, который расположен как поток обмена сообщениями в приложении чата. Открытие лотка активирует микрофон, и все, что, по словам пользователя, будет отправлено через службу автоматического распознавания речи (ASR) и отображается в виде текста. Этот текст затем отправляется в модель понимания естественного языка (NLU) для классификации. Результаты классификации отправляются в компонент приложения, который вы установили для прослушивания событий из лотка, который может создать ответ, который лоток будет отображать и читать пользователю через службу синтеза текста в речь (TTS). Микрофон будет восстановлен, если ответ приложения направит его; В противном случае поднос закроет и отключит ASR.
И именно так вы добавили голос в свое приложение!

Да, и после этого начального взаимодействия поднос можно открыть с помощью бодрствования вместо крана. WakeWord «Spokestack» по умолчанию, но это можно настроить.
Если что -то из этого не имело смысла, не бойтесь! Читайте дальше, и мы рассмотрим все детали ниже.
Примечание : лоток Spokestack раньше был размещен на JCenter, но с момента объявления о его прекращении мы перенесли дистрибуцию в Maven Central. Пожалуйста, убедитесь, что ваш файл build.gradle на уровне корня включает в себя mavenCentral() в свой блок repositories , чтобы получить доступ к версиям> = 0.4.1.
Убедитесь, что вы используете версию 0.4.2 или выше, чтобы правильно разрешить зависимость от библиотеки Spokestack Core после того, как JCenter становится недоступной.
По умолчанию лоток Spokestack обрабатывает ASR, NLU и TTS для голосовых взаимодействий с пользователями - он преобразует их голос в текст, обрабатывая этот текст для создания действия и синтезируя ответ приложения, который будет прочитал обратно пользователю. Для получения дополнительной информации об этих функциях см. Документы Spokestack.
Чтобы использовать NLU и TTS, вам понадобится бесплатная учетная запись Spokestack. На странице вашей учетной записи вы сможете создавать и загружать модели NLU; И идентификатор клиента и секретный ключ необходимы во время выполнения для запросов TTS.
Во -первых, однако, добавьте зависимость в build.gradle вашего приложения (проверьте значок JCenter выше для последней версии):
implementation ' io.spokestack:tray:0.4.1 ' Как упомянуто выше, лоток для Spokestack реализуется как Fragment , который воспринимает поверхность вашего существующего Activity и обрабатывает голосовое взаимодействие, поэтому вы захотите добавить его в макет своей деятельности:
<!-- nested in the main layout, after other views/sublayouts -->
< include
android : id = " @+id/tray_fragment "
layout = " @layout/spokestack_tray_fragment "
/> Примечание . В зависимости от макета вашего приложения вам также придется добавить android:clipChildren="false" в родительский макет (ы) фрагмента, чтобы избежать исчезновения микрофона, когда лоток открывается.
Затем сделайте саму свою деятельность расширить TrayActivity (подкласс AppCompatActivity ), реализуйте методы, которые в нем требуются, и библиотека позаботится об остальном.
Если вы предпочитаете сделать настройку самостоятельно, вот образец, который не использует TrayActivity :
import io.spokestack.tray.*
class MyActivity : AppCompatActivity (), SpokestackTrayListener {
lateinit var tray : SpokestackTray
// ...
override fun onCreate ( savedInstanceState : Bundle ? ) {
val config = TrayConfig . Builder ()
// credentials from your Spokestack account
.credentials( " spokestack-client-id " , " spokestack-secret-key " )
.wakewordModelURL( " https://path-to-wakeword-models " )
.nluURL( " https://path-to-nlu-files " )
// note the implementation of `SpokestackTrayListener` in the class declaration
.withListener( this )
// optional builder customization; see the documentation for more details...
.build()
supportFragmentManager.fragmentFactory = SpokestackTrayFactory (config)
// note that the factory is instantiated and set on the manager BEFORE calling
// `super.onCreate()`
super .onCreate(savedInstanceState)
}
override fun onStart () {
// set the value of the lateinit `tray` var
tray = SpokestackTray .getInstance(config)
super .onStart()
} Когда вы загружаете модели Spokestack WakeWord или NLU, у вас будет несколько URL -адресов для разных файлов. wakewordModelURL и nluURL выше требуют только пути к соответствующему каталогу, а не полным файлам URL. Итак, для демонстрации "Spokestack" WakeWord, установите wakewordModelURL на "https://d3dmqd7cy685il.cloudfront.net/model/wake/spokestack/".
Лоток предназначен для беспрепятственного использования между действиями - например, чтобы позволить пользователю продолжать давать голосовую команду, пока приложение переключает действия - поэтому его состояние хранится вне самого фрагмента и переживает разрушение фрагментов. Если вашему приложению необходимо выпустить ресурсы, удерживаемые лотком и его базовым экземпляром Spokestack , вызовите метод stop() лотка. Если вам необходимо повторно установить голосовое управление до того, как текущий экземпляр фрагмента лотка будет уничтожен, вы должны вызвать start() .
Если вы хотите сохранить состояние подноса после смерти, вы можете сохранить его в его родительских действиях onRestoreInstanceState onSaveInstanceState использованием методов getState() и loadState() ; Смотрите их документацию для более подробной информации.
Скорее всего, если вы позволите пользователю поговорить с вашим приложением, вы хотите, чтобы приложение поговорило. Лоток интегрирован с службой TTS Spokestack, поэтому синтезирование звука так же просто, как и транскрибировать его.
Когда вы расширяете TrayActivity , один из методов, которые вам придется реализовать, - getTrayListener() , который создает и возвращает SpokestackTrayListener . Этот интерфейс помогает вашему приложению в реагировании на события, полученные и произведенные подносом. Поскольку каждый вариант использования уникален, все его методы являются необязательными; То, что нас интересует, - это onClassification . Этот метод вызывается после того, как речь пользователя была расшифрована ASR и классифицируется NLU. Он поставляет ваше приложение с результатом NLU и просит вас вернуть ответ:
override fun onClassification ( result : NLUResult ): VoicePrompt {
return if (result.intent == " your-special-intent " ) {
VoicePrompt ( " I hear you loud and clear " )
} else {
VoicePrompt (
" Sorry; I didn't catch that " ,
expectFollowup = true )
}
} Необязательный второй параметр в конструкторе VoicePrompt сообщает, что если вы ожидаете ответа - если вы есть, он возобновит активное прослушивание после воспроизведения вашей подсказки, поэтому пользователь не должен использовать WakeWord или кнопку для каждого взаимодействия.
Приведенный выше образец приведет вас в работу с минимальной суетой, но он далеко от всего, что предлагает лоток для спикштака. Когда вы создаете экземпляр TrayConfig , вы можете настроить и предоставить сам базовый строитель Spokestack . Это позволит вам делать такие вещи, как изменение поставщиков ASR, настроить пользовательских слушателей для событий из отдельных систем и добавить пользовательские компоненты речевой обработки, если вам нужно. Вы можете прочитать о Spokestack Builder здесь.
Существует также ряд вариантов, которые применимы к самому лотке, доступны с помощью вспомогательных методов в экземпляре TrayConfig.Builder . Описание каждого из них здесь сделало бы эту Readme ... хотя и тяжело, так что проверьте документацию для получения более подробной информации. Документация на TrayConfig.Builder [здесь] (https://spokestack.github.io/spokestack-tray-android/pokestack-tray/io.spokestack.tray/ray-config/-builder**.
Большинство аспектов пользовательского интерфейса подноса могут быть настроены. Часто это достигается в XML путем переоценки значений, установленных в библиотеке.
Единственным исключением из этого является ориентация подноса: его кнопка микрофона по умолчанию появляется в качестве правой вкладки на стороне левша экрана, а поднос скользит слева. Это также поддерживает первую ориентацию, но требует двух изменений для этого:
.orientation(TrayConfig.Orientation.RIGHT) на строительном застройке TrayConfig , прежде чем создавать конфигурацию.< include
layout = " @layout/spokestack_tray_fragment "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
app : layout_constraintBottom_toBottomOf = " parent "
app : layout_constraintEnd_toEndOf = " parent " /> Нам нужно только последнее ограничение здесь; Остальные атрибуты идентичны макете источника. Поскольку мы используем, include , однако, переопределение одного атрибута означает переопределение всех из них; Смотрите примечание в конце абзаца здесь.
Настройки пользовательского интерфейса на основе значений перечислены ниже. Имена файлов здесь указывают на исходные определения в папке res/values библиотеки, но замены могут быть определены в другом месте вашего проекта. Пример приложения иллюстрирует это, переопределяя цвет текста для системных сообщений в res/values/custom_colors.xml .
colors.xmlspsk_colorTrayBg : Цвет фона, используемый для потока сообщений.spsk_colorIcon : Цвет переднего плана, используемый для значков, которые должны контрастировать с spsk_colorBrand . По умолчанию белую.spsk_colorDragHandle : цвет, используемый для изменения размера лотка.spsk_colorBrand : основной цвет элементов пользовательского интерфейса, таких как кнопка микрофона и значки без фона.spsk_colorListenText : цвет, используемый для текста в пузыре «прослушивание».spsk_colorSystemText : цвет, используемый для текста в пузырьках системного сообщения.spsk_colorUserText : цвет, используемый для текста в пузырьках сообщений пользователя.spsk_colorSystemBg : цвет фона, используемый для пузырьков системного сообщения.spsk_colorUserBg : Цвет фона, используемый для пузырьков сообщений пользователя.spsk_colorGradientOne : начальный цвет, используемый для анимации градиента прослушивания. По умолчанию spsk_colorBrand .spsk_colorGradientEnd : конечный цвет, используемый для анимации градиента прослушивания.spsk_colorTransparent : прозрачный цвет, используемый в качестве фонового оттенка для стрелки «обратно» на подносе.dimens.xmlspsk_micTabWidth : Ширина для кнопки вкладок микрофона. По умолчанию до 60dp .spsk_micTabHeight : Высота для кнопки Microphone. По умолчанию до 80dp spsk_micTabWidthspsk_listenBubbleWidth : ширина для прослушивания пузыря, который появляется во время ASR. По умолчанию до 120dp и должны храниться в соотношении 2: 1 с spsk_listenBubbleHeight .spsk_listenBubbleHeight : высота для прослушивания пузыря, который появляется во время ASR. По умолчанию до 60dp .spsk_messageStreamHeight : Начальная высота для потока сообщений внутри подноса. По умолчанию до 100dp .spsk_messageStreamMinHeight : Минимальная высота, на которую можно изменить лоток с помощью перетаскивания. По умолчанию до 80dp .ints.xmlspsk_trayAnimateMs : количество времени, в миллисекундах, поднос требуется для открытия или закрытия. По умолчанию до 500 .strings.xmlspsk_listening : текст, отображаемый в подносе во время активного прослушивания (ASR). По умолчанию "LISTENING" .styles.xmlspsk_messageFont : семейство шрифтов, используемое для отображения транскриптов ASR и системных сообщений в лотке. По умолчанию sans-serif (Roboto). Copyright 2020 Spokestack, Inc.
Лицензировано по лицензии Apache, версия 2.0 («Лицензия»); Вы не можете использовать этот файл, кроме как в соответствии с лицензией. Вы можете получить копию лицензии на
http://www.apache.org/licenses/LICENSE-2.0
Если не требуется применимый закон или не согласен в письменной форме, программное обеспечение, распространяемое по лицензии, распределяется по основам «как есть», без каких -либо гарантий или условий, явных или подразумеваемых. См. Лицензию для конкретного языка, регулирующих разрешения и ограничения по лицензии.