
Um Fragment para adicionar controle de voz via porta -voz a qualquer aplicativo Android. Você pode encontrar um aplicativo de demonstração simples que mostre a bandeja em ação no diretório example .
Quando você adiciona o fragmento de bandeja da porta -voz ao seu layout, você terá um botão de microfone moldado como uma guia na lateral da tela ( em que lado está depende de você; mais sobre isso mais tarde). Tocar ou arrastar a guia revela o restante da bandeja, que é organizado como um fluxo de mensagens em um aplicativo de bate -papo. A abertura da bandeja ativa o microfone, e qualquer coisa que o usuário diz será enviado através de um serviço automático de reconhecimento de fala (ASR) e exibido como texto. Esse texto é então enviado para um modelo de entendimento de linguagem natural (NLU) para classificação. Os resultados da classificação são enviados para o componente de aplicativo que você estabeleceu para ouvir eventos da bandeja, que podem produzir uma resposta que a bandeja exibirá e lerá para o usuário por meio do serviço de síntese de texto para fala (TTS) da Spokestack. O microfone será reativado se a resposta do aplicativo o direcionar; Caso contrário, a bandeja fechará e desativará o ASR.
E assim, você adicionou voz ao seu aplicativo!

Ah, e após essa interação inicial, a bandeja pode ser aberta com um wakeword em vez de um toque. O Wakeword é "Spokestack" por padrão, mas isso pode ser personalizado.
Se um pouco disso não fazia sentido, não tema! Continue lendo e abordaremos todos os detalhes abaixo.
Nota : A bandeja de porta -voz costumava ser hospedada no JCenter, mas desde o anúncio de sua descontinuação, mudamos a distribuição para o Maven Central. Verifique se o seu arquivo build.gradle no nível da raiz inclui mavenCentral() em seu bloco repositories para acessar versões> = 0.4.1.
Certifique -se de estar usando a versão 0.4.2 ou acima para resolver corretamente a dependência da biblioteca principal da porta -voz depois que o JCenter ficar inacessível.
Por padrão, a bandeja da porta -voz lida com as interações com os usuários de ASR, NLU e TTS para os usuários - que converte sua voz em texto, processando esse texto para produzir uma ação e sintetizando a resposta do aplicativo para ser lido de volta ao usuário. Para obter mais informações sobre esses recursos, consulte os documentos da porta -voz.
Para usar a NLU e o TTS, você precisará de uma conta de porta -voz gratuita. Na página da sua conta, você poderá criar e baixar modelos NLU; e o ID do cliente e a chave secreta são necessários em tempo de execução para solicitações TTS.
Primeiro, porém, adicione a dependência ao seu aplicativo build.gradle (verifique o crachá do JCenter acima da versão mais recente):
implementation ' io.spokestack:tray:0.4.1 ' Como mencionado acima, a bandeja de porta -voz é implementada como um Fragment que se torna sobre sua Activity existente e lida com a interação da voz, então você deve adicioná -lo ao layout da sua atividade:
<!-- nested in the main layout, after other views/sublayouts -->
< include
android : id = " @+id/tray_fragment "
layout = " @layout/spokestack_tray_fragment "
/> NOTA : Dependendo do layout do seu aplicativo, você também pode precisar adicionar android:clipChildren="false" aos layout (s) dos pais do fragmento para evitar que a guia Microfone desapareça à medida que a bandeja se abre.
Em seguida, faça sua atividade estender TrayActivity (uma subclasse do AppCompatActivity ), implemente os métodos necessários e a biblioteca cuidará do restante.
Se você preferir fazer a configuração, aqui está uma amostra que não usa 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()
} Ao baixar os modelos Spokestack Wakeword ou NLU, você terá vários URLs para diferentes arquivos. wakewordModelURL e nluURL acima exigem apenas o caminho para o diretório relevante, não os URLs de arquivo completo. Então, para a demonstração "Spokestack" Wakeword, defina wakewordModelURL como "https://d3dmqd7cy685il.cloudfront.net/model/wake/spokestack/".
A bandeja foi projetada para uso contínuo nas atividades - por exemplo, para permitir que um usuário continue dando um comando de voz enquanto o aplicativo troca de atividades - para que seu estado seja armazenado fora do próprio fragmento e sobrevive à destruição de fragmentos. Se o seu aplicativo precisar liberar recursos mantidos pela bandeja e sua instância Spokestack subjacente, ligue para o método stop() da bandeja. Se você precisar reativar o controle de voz antes que a instância atual do fragmento de bandeja seja destruída, você deverá ligar para start() .
Se você deseja manter intacto o estado da bandeja após a morte do processo, poderá armazená -la nos métodos onSaveInstanceState e onRestoreInstanceState da atividade dos pais usando os métodos getState() e loadState() da bandeja; Veja a documentação deles para obter mais detalhes.
As chances são de que, se você está permitindo que o usuário converse com seu aplicativo, deseja que o aplicativo volte. A bandeja é integrada ao serviço TTS da Spokestack, portanto, sintetizar o áudio é tão fácil quanto transcrever.
Ao estender TrayActivity , um dos métodos que você terá para implementar é getTrayListener() , que cria e retorna um SpokestackTrayListener . Essa interface auxilia seu aplicativo a reagir aos eventos recebidos e produzidos pela bandeja. Como cada caso de uso é único, todos os seus métodos são opcionais; O que estamos interessados aqui é onClassification . Este método é chamado após a transcrição de um usuário por ASR e classificada pela NLU. Ele fornece ao seu aplicativo o resultado da NLU e pede que você retorne uma resposta:
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 )
}
} O segundo parâmetro opcional no construtor VoicePrompt permite que a bandeja saiba se você está esperando uma resposta - se estiver, ele retomará a escuta ativa depois que seu prompt for reproduzido para que o usuário não precise usar o wakeword ou um botão para cada interação.
A amostra acima o levará a funcionar com o mínimo de barulho, mas está longe de todas as que a bandeja de porta -voz oferece. Ao construir uma instância TrayConfig , você pode optar por configurar e fornecer o próprio construtor Spokestack subjacente. Isso permitirá que você faça coisas como alteração de provedores de ASR, configurar os ouvintes personalizados para eventos de sistemas individuais e adicionar componentes de processamento de fala personalizados, se necessário. Você pode ler sobre o construtor de porta -voz aqui.
Há também uma variedade de opções aplicáveis à própria bandeja, acessível via métodos auxiliares na instância TrayConfig.Builder . Descrever cada um aqui faria este ReadMe ... pesado, então confira a documentação para obter mais detalhes. A documentação no TrayConfig.Builder está [aqui] (https://spokestack.github.io/spokestack-tray-android/spokestack-tray/io.spokestack.tray/-tray-config/-builder**.
A maioria dos aspectos da interface do usuário da bandeja pode ser personalizada. Muitas vezes, isso é realizado no XML, substituindo os valores definidos na biblioteca.
Uma exceção a isso é a orientação da bandeja: o botão de microfone padrão aparece como uma guia voltada para a direita no lado esquerdo da tela, com a bandeja deslizando para a esquerda. Ele também suporta uma orientação direta, mas requer duas mudanças para fazê -lo:
.orientation(TrayConfig.Orientation.RIGHT) no construtor TrayConfig antes de criar a configuração.< 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 " /> Precisamos apenas da última restrição aqui; O restante dos atributos é idêntico ao layout da fonte. Como estamos include , porém, substituir um atributo significa substituir todos eles; Veja a nota no final do parágrafo aqui.
As personalizações da interface do valor baseadas em valor estão listadas abaixo. Os nomes de arquivos aqui apontam para as definições originais na pasta res/values da biblioteca, mas as substituições podem ser definidas em outras partes do seu projeto. O aplicativo de exemplo ilustra isso substituindo a cor do texto para mensagens do sistema em res/values/custom_colors.xml .
colors.xmlspsk_colorTrayBg : A cor de fundo usada para o fluxo de mensagens da bandeja.spsk_colorIcon : a cor do primeiro plano usada para ícones que precisam contrastar com spsk_colorBrand . Padrões para o branco.spsk_colorDragHandle : a cor usada para a alça de arrasto redimensionada da bandeja.spsk_colorBrand : a cor principal dos elementos da interface do usuário, como o botão do microfone e os ícones sem fundo.spsk_colorListenText : A cor usada para texto na bolha "auditiva".spsk_colorSystemText : a cor usada para texto em bolhas de mensagens do sistema.spsk_colorUserText : A cor usada para texto em bolhas de mensagens do usuário.spsk_colorSystemBg : a cor de fundo usada para bolhas de mensagens do sistema.spsk_colorUserBg : A cor de fundo usada para bolhas de mensagens do usuário.spsk_colorGradientOne : a cor inicial usada para a animação de gradiente de escuta. Padrão para spsk_colorBrand .spsk_colorGradientEnd : A cor final usada para a animação de gradiente de escuta.spsk_colorTransparent : cor transparente usada como tonalidade de fundo para a seta "traseira" na bandeja.dimens.xmlspsk_micTabWidth : largura para o botão da guia Microfone. Padrões para 60dp .spsk_micTabHeight : Altura para o botão da guia Microfone. Padrões para 80dp e devem ser mantidos em uma proporção de 4: 3 com spsk_micTabWidth .spsk_listenBubbleWidth : largura para a bolha de escuta que aparece durante o ASR. Padrões para 120dp e devem ser mantidos em uma proporção de 2: 1 com spsk_listenBubbleHeight .spsk_listenBubbleHeight : Altura para a bolha de escuta que aparece durante o ASR. Padrões para 60dp .spsk_messageStreamHeight : Altura inicial para o fluxo de mensagens dentro da bandeja. Padrões para 100dp .spsk_messageStreamMinHeight : Altura mínima para a qual a bandeja pode ser redimensionada por arrasto. Padrões para 80dp .ints.xmlspsk_trayAnimateMs : a quantidade de tempo, em milissegundos, a bandeja leva para abrir ou fechar. Padrões para 500 .strings.xmlspsk_listening : O texto exibido na bandeja durante a escuta ativa (ASR). Padrões para "LISTENING" .styles.xmlspsk_messageFont : A família de fontes costumava exibir transcrições ASR e mensagens do sistema na bandeja. Padrões para sans-serif (Roboto). Copyright 2020 Spokestack, Inc.
Licenciado sob a licença Apache, versão 2.0 (a "licença"); Você não pode usar esse arquivo, exceto em conformidade com a licença. Você pode obter uma cópia da licença em
http://www.apache.org/licenses/LICENSE-2.0
A menos que exigido pela lei aplicável ou acordada por escrito, o software distribuído pela licença é distribuído "como está", sem garantias ou condições de qualquer tipo, expressa ou implícita. Consulte a licença para o idioma específico que rege as permissões e limitações sob a licença.