Partilhar via


Modificar dinamicamente as listas de frases VCD da Cortana

Aviso

Não há mais suporte para este recurso a partir da atualização de maio de 2020 do Windows 10 (versão 2004, codinome "20H1").

Acesse e atualize a lista de frases com suporte (elementos PhraseList ) em um arquivo VCD (Definição de Comando de Voz) em tempo de execução usando o resultado do reconhecimento de fala.

Observação

Um comando de voz é um único enunciado com uma intenção específica, definido em um arquivo VCD (Definição de Comando de Voz), direcionado a um aplicativo instalado por meio da Cortana.

Um arquivo VCD define um ou mais comandos de voz, cada um com uma intenção exclusiva.

As definições de comando de voz podem variar em complexidade. Eles podem dar suporte a qualquer coisa, desde um único enunciado restrito até uma coleção de enunciados de linguagem natural mais flexíveis, todos denotando a mesma intenção.

A modificação dinâmica de uma lista de frases em tempo de execução será útil se o comando de voz for específico para uma tarefa que envolve algum tipo de dados de aplicativo definidos pelo usuário ou transitórios.

Por exemplo, digamos que você tenha um aplicativo de viagem em que os usuários podem inserir destinos e deseja que os usuários possam iniciar o aplicativo dizendo o nome do aplicativo seguido de "Mostrar viagem ao <destino>". No próprio elemento ListenFor, você especificaria algo como: <ListenFor> Show trip to {destination} </ListenFor>, em que "destination" é o valor do atributo Label para o PhraseList.

Atualizar a lista de frases em tempo de execução elimina a necessidade de criar um elemento ListenFor separado para cada destino possível. Em vez disso, você pode preencher dinamicamente PhraseList com destinos especificados pelo usuário à medida que ele insere seus itinerários.

Para obter mais informações sobre PhraseList e outros elementos VCD, consulte a referência de elementos e atributos VCD v1.2 .

Dica

Pré-requisitos

Se você não estiver familiarizado com o desenvolvimento de aplicativos UWP (Plataforma Universal do Windows), dê uma olhada nestes tópicos para se familiarizar com as tecnologias discutidas aqui.

Diretrizes de experiência do usuário

Consulte as diretrizes de design da Cortana para obter informações sobre como integrar seu aplicativo à Cortana e às interações de fala para obter dicas úteis sobre como criar um aplicativo habilitado para fala útil e envolvente.

Identifique o comando e atualize a lista de frases

Aqui está um exemplo de arquivo VCD que define um comando "showTripToDestination" e uma PhraseList que define três opções de destino em nosso aplicativo de viagem Adventure Works . À medida que o usuário salva e exclui destinos no aplicativo, o aplicativo atualiza as opções na PhraseList.

<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="https://schemas.microsoft.com/voicecommands/1.1">
  <CommandSet xml:lang="en-us" Name="AdventureWorksCommandSet_en-us">
    <AppName> Adventure Works, </AppName>
    <Example> Show trip to London </Example>

    <Command Name="showTripToDestination">
      <Example> show trip to London  </Example>
      <ListenFor> show trip to {destination} </ListenFor>
      <Feedback> Showing trip to {destination} </Feedback>
      <Navigate/>
    </Command>

    <PhraseList Label="destination">
      <Item> London </Item>
      <Item> Dallas </Item>
      <Item> New York </Item>
    </PhraseList>

  </CommandSet>

<!-- Other CommandSets for other languages -->

</VoiceCommands>

Para atualizar um elemento PhraseList no arquivo VCD, obtenha o elemento CommandSet que contém a lista de frases. Use o atributo Name desse elemento CommandSet (Name deve ser exclusivo no arquivo VCD) como uma chave para acessar a propriedade VoiceCommandManager.InstalledCommandSets e obter a referência VoiceCommandSet.

Depois de identificar o conjunto de comandos, obtenha uma referência à lista de frases que você deseja modificar e chame o método SetPhraseListAsync ; use o atributo Label do elemento PhraseList e uma matriz de cadeias de caracteres como o novo conteúdo da lista de frases.

Observação

Se você modificar uma lista de frases, toda a lista de frases será substituída. Se você quiser inserir novos itens em uma lista de frases, deverá especificar os itens existentes e os novos itens na chamada para SetPhraseListAsync.

Neste exemplo, atualizamos a PhraseList mostrada no exemplo anterior com um destino adicional para Phoenix.

Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinition.VoiceCommandSet commandSetEnUs;

if (Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager.
      InstalledCommandSets.TryGetValue(
        "AdventureWorksCommandSet_en-us", out commandSetEnUs))
{
  await commandSetEnUs.SetPhraseListAsync(
    "destination", new string[] {"London", "Dallas", "New York", "Phoenix"});
}

Comentários

Usar um PhraseList para restringir o reconhecimento é apropriado para um conjunto ou palavras relativamente pequenas. Quando o conjunto de palavras for muito grande (centenas de palavras, por exemplo) ou não precisar ser restrito, use o elemento PhraseTopic e um elemento Subject para refinar a relevância dos resultados de reconhecimento de fala para melhorar a escalabilidade.

Em nosso exemplo, temos um PhraseTopic com um Cenário de "Pesquisa", refinado ainda mais por um Assunto de "Cidade\Estado".

<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="https://schemas.microsoft.com/voicecommands/1.1">
  <CommandSet xml:lang="en-us" Name="AdventureWorksCommandSet_en-us">
    <AppName> Adventure Works, </AppName>
    <Example> Show trip to London </Example>

    <Command Name="showTripToDestination">
      <Example> show trip to London  </Example>
      <ListenFor> show trip to {destination} </ListenFor>
      <Feedback> Showing trip to {destination} </Feedback>
      <Navigate/>
    </Command>

    <PhraseList Label="destination">
      <Item> London </Item>
      <Item> Dallas </Item>
      <Item> New York </Item>
    </PhraseList>

    <PhraseTopic Label="destination" Scenario="Search">
      <Subject>City/State</Subject>
    </PhraseTopic>

  </CommandSet>