HoloLens (1ª geração) e Azure 301: tradução de idiomas
Observação
Os tutoriais do Mixed Reality Academy foram projetados com o HoloLens (1ª geração) e os headsets imersivos de realidade misturada em mente. Dessa forma, achamos que é importante continuar disponibilizando esses tutoriais para os desenvolvedores que ainda buscam obter diretrizes para o desenvolvimento visando esses dispositivos. Esses tutoriais não serão atualizados com os conjuntos de ferramentas mais recentes nem com as interações usadas para o HoloLens 2. Eles serão mantidos para continuar funcionando nos dispositivos compatíveis. Haverá uma nova série de tutoriais que serão postados no futuro que demonstrarão como desenvolver para o HoloLens 2. Este aviso será atualizado com um link para esses tutoriais quando eles forem postados.
Neste curso, você aprenderá a adicionar recursos de tradução a um aplicativo de realidade misturada usando os Serviços Cognitivos do Azure, com a API de Tradução de Texto.
A API de tradução de texto é um serviço de tradução que funciona quase em tempo real. O Serviço é baseado em nuvem e, usando uma chamada à API REST, um aplicativo pode usar a tecnologia de tradução automática neural para traduzir texto para outro idioma. Para obter mais informações, visite a página da API de Texto do Azure Translator.
Após a conclusão deste curso, você terá um aplicativo de realidade mista que poderá fazer o seguinte:
- O usuário falará em um microfone conectado a um headset imersivo (VR) (ou ao microfone interno do HoloLens).
- O aplicativo capturará o ditado e o enviará para a API de Texto do Tradutor do Azure.
- O resultado da tradução será exibido em um grupo de interface do usuário simples na Cena do Unity.
Este curso ensinará como obter os resultados do Serviço de Tradutor em um aplicativo de exemplo baseado em Unity. Caberá a você aplicar esses conceitos a um aplicativo personalizado que você possa estar criando.
Suporte a dispositivos
Curso | HoloLens | Headsets imersivos |
---|---|---|
MR e Azure 301: tradução de idiomas | ✔️ | ✔️ |
Observação
Embora este curso se concentre principalmente em headsets imersivos (VR) do Windows Mixed Reality, você também pode aplicar o que aprendeu neste curso ao Microsoft HoloLens. Ao acompanhar o curso, você verá anotações sobre as alterações que talvez precise empregar para dar suporte ao HoloLens. Ao usar o HoloLens, você pode observar algum eco durante a captura de voz.
Pré-requisitos
Observação
Este tutorial foi desenvolvido para desenvolvedores que têm experiência básica com Unity e C#. Esteja ciente também de que os pré-requisitos e as instruções escritas neste documento representam o que foi testado e verificado no momento da redação (maio de 2018). Você é livre para usar o software mais recente, conforme listado no artigo instalar as ferramentas , embora não se deva presumir que as informações neste curso corresponderão perfeitamente ao que você encontrará em softwares mais recentes do que os listados abaixo.
Recomendamos o seguinte hardware e software para este curso:
- Um computador de desenvolvimento, compatível com Windows Mixed Reality para desenvolvimento de headset imersivo (VR)
- Windows 10 Fall Creators Update (ou posterior) com o modo de desenvolvedor habilitado
- O SDK mais recente do Windows 10
- Unidade 2017.4
- Visual Studio 2017
- Um headset imersivo (VR) Windows Mixed Reality ou Microsoft HoloLens com o modo Desenvolvedor habilitado
- Um conjunto de fones de ouvido com microfone embutido (se o fone de ouvido não tiver microfone e alto-falantes embutidos)
- Acesso à Internet para configuração e recuperação de tradução do Azure
Antes de começar
Para evitar problemas ao criar este projeto, é altamente recomendável que você crie o projeto mencionado neste tutorial em uma pasta raiz ou quase raiz (caminhos de pasta longos podem causar problemas no momento da compilação).
O código neste tutorial permitirá que você grave a partir do dispositivo de microfone padrão conectado ao seu PC. Certifique-se de que o dispositivo de microfone padrão esteja definido para o dispositivo que você planeja usar para capturar sua voz.
Para permitir que seu PC habilite o ditado, vá para Configurações Privacidade Fala, escrita à tinta e digitação e selecione o botão Ativar serviços de fala e sugestões de digitação.> >
Se você estiver usando um microfone e fones de ouvido conectados (ou integrados) ao fone de ouvido, verifique se a opção "Quando eu usar meu fone de ouvido, alternar para o microfone do fone de ouvido" está ativada em Configurações > Realidade > misturada Áudio e fala.
Aviso
Lembre-se de que, se você estiver desenvolvendo um headset imersivo para este laboratório, poderá ter problemas com o dispositivo de saída de áudio. Isso ocorre devido a um problema com o Unity, que foi corrigido em versões posteriores do Unity (Unity 2018.2). O problema impede que o Unity altere o dispositivo de saída de áudio padrão em tempo de execução. Como solução alternativa, certifique-se de ter concluído as etapas acima e feche e reabra o Editor quando esse problema se apresentar.
Capítulo 1 – O Portal do Azure
Para usar a API do Azure Translator, você precisará configurar uma instância do Serviço a ser disponibilizada para seu aplicativo.
Faça logon no Portal do Azure.
Observação
Se você ainda não tiver uma conta do Azure, precisará criar uma. Se você estiver seguindo este tutorial em uma sala de aula ou laboratório, peça ajuda ao seu instrutor ou a um dos supervisores para configurar sua nova conta.
Depois de fazer login, clique em Novo no canto superior esquerdo e procure por "Translator Text API". Selecione Enter.
Observação
A palavra Novo pode ter sido substituída por Criar um recurso, em portais mais recentes.
A nova página fornecerá uma descrição do Serviço de API de Tradução de Texto. Na parte inferior esquerda desta página, selecione o botão Criar para criar uma associação com este Serviço.
Depois de clicar em Criar:
Insira o Nome desejado para esta instância de Serviço.
Selecione uma assinatura apropriada.
Selecione o Tipo de Preço apropriado para você, se esta for a primeira vez que cria um Serviço de Tradução de Texto, uma camada gratuita (chamada F0) deverá estar disponível para você.
Escolha um grupo de recursos ou crie um novo. Um grupo de recursos fornece uma maneira de monitorar, controlar o acesso, provisionar e gerenciar a cobrança de uma coleção de ativos do Azure. É recomendável manter todos os Serviços do Azure associados a um único projeto (por exemplo, como esses laboratórios) em um grupo de recursos comum).
Se você quiser ler mais sobre os Grupos de Recursos do Azure, visite o artigo do grupo de recursos.
Determine o Local do seu grupo de recursos (se você estiver criando um novo Grupo de Recursos). O local seria idealmente na região onde o aplicativo seria executado. Alguns ativos do Azure só estão disponíveis em determinadas regiões.
Você também precisará confirmar que entendeu os Termos e Condições aplicados a este Serviço.
Selecione Criar.
Depois de clicar em Criar, você terá que esperar que o Serviço seja criado, isso pode levar um minuto.
Uma notificação será exibida no portal assim que a instância de serviço for criada.
Clique na notificação para explorar sua nova instância de serviço.
Clique no botão Ir para o recurso na notificação para explorar sua nova instância de serviço. Você será levado para sua nova instância do Serviço de API de Tradução de Texto.
Neste tutorial, seu aplicativo precisará fazer chamadas para o Serviço, o que é feito usando a Chave de Assinatura do Serviço.
Na página Início rápido do Serviço de Tradução de Texto , navegue até a primeira etapa, Pegue suas chaves e clique em Chaves (você também pode fazer isso clicando no hiperlink azul Chaves, localizado no menu de navegação Serviços, indicado pelo ícone de chave). Isso revelará suas chaves de serviço.
Faça uma cópia de uma das chaves exibidas, pois você precisará dela mais tarde em seu projeto.
Capítulo 2 – Configurar o projeto Unity
Configure e teste seu headset imersivo de realidade misturada.
Observação
Você não precisará de controladores de movimento para este curso. Se precisar de suporte para configurar um headset imersivo, siga estas etapas.
A seguir está uma configuração típica para desenvolvimento com realidade mista e, como tal, é um bom modelo para outros projetos:
Abra o Unity e clique em Novo.
Agora você precisará fornecer um nome de projeto do Unity. Insira MR_Translation. Certifique-se de que o tipo de projeto esteja definido como 3D. Defina o local para algum lugar apropriado para você (lembre-se, mais perto dos diretórios raiz é melhor). Em seguida, clique em Criar projeto.
Com o Unity aberto, vale a pena verificar se o Editor de Scripts padrão está definido como Visual Studio. Vá para Editar > preferências e, na nova janela, navegue até Ferramentas externas. Altere o Editor de Script Externo para Visual Studio 2017. Feche a janela Preferências.
Em seguida, vá para Configurações de Build de Arquivo > e alterne a plataforma para Plataforma Universal do Windows, clicando no botão Alternar Plataforma.
Vá para Configurações de Build de Arquivo > e certifique-se de que:
O dispositivo de destino está definido como Qualquer dispositivo.
Para Microsoft HoloLens, defina Dispositivo de Destino como HoloLens.
O Tipo de Construção está definido como D3D
O SDK está definido como Instalado mais recente
A versão do Visual Studio está definida como Mais recente instalado
Build and Run está definido como Computador Local
Salve a cena e adicione-a à compilação.
Faça isso selecionando Adicionar cenas abertas. Uma janela de salvamento aparecerá.
Crie uma nova pasta para esta e qualquer cena futura e, em seguida, selecione o botão Nova pasta , para criar uma nova pasta, nomeie-a como Cenas.
Abra a pasta Cenas recém-criada e, no campo de texto Nome do arquivo:, digite MR_TranslationScene e pressione Salvar.
Lembre-se de que você deve salvar suas cenas do Unity na pasta Ativos , pois elas devem estar associadas ao Projeto do Unity. Criar a pasta scenes (e outras pastas semelhantes) é uma maneira típica de estruturar um projeto do Unity.
As configurações restantes, em Configurações de Build, devem ser deixadas como padrão por enquanto.
Na janela Configurações de construção, clique no botão Configurações do player, isso abrirá o painel relacionado no espaço onde o Inspetor está localizado.
Neste painel, algumas configurações precisam ser verificadas:
Na guia Outras configurações:
A versão do tempo de execução de script deve ser estável (equivalente ao .NET 3.5).
O back-end de script deve ser .NET
O nível de compatibilidade da API deve ser .NET 4.6
Na guia Configurações de Publicação, em Recursos, marque:
InternetClient
Microfone
Mais abaixo no painel, em Configurações XR (encontradas abaixo de Configurações de Publicação), marque Realidade Virtual com Suporte, verifique se o SDK do Windows Mixed Reality foi adicionado.
De volta às Configurações de Build, os Projetos C# do Unity não estão mais esmaecidos; marque a caixa de seleção ao lado dela.
Feche a janela Configurações de Build.
Salve sua cena e projeto (FILE > SAVE SCENE / FILE > SAVE PROJECT).
Capítulo 3 - Configuração da câmera principal
Importante
Se você quiser ignorar o componente de configuração do Unity deste curso e continuar direto para o código, sinta-se à vontade para baixar este .unitypackage, importá-lo para o seu projeto como um pacote personalizado e continuar a partir do Capítulo 5. Você ainda precisará criar um projeto do Unity.
No Painel de Hierarquia, você encontrará um objeto chamado Câmera Principal, este objeto representa o ponto de vista da sua "cabeça" quando você estiver "dentro" da sua aplicação.
Com o Painel do Unity à sua frente, selecione o GameObject da Câmera Principal. Você notará que o Painel do Inspetor (geralmente encontrado à direita, dentro do Painel) mostrará os vários componentes desse GameObject, com Transform na parte superior, seguido por Camera e alguns outros componentes. Você precisará redefinir a transformação da câmera principal, para que ela seja posicionada corretamente.
Para fazer isso, selecione o ícone de engrenagem ao lado do componente Transformação da câmera e selecione Redefinir.
O componente Transform deve ter a seguinte aparência:
A posição é definida como 0, 0, 0
A rotação é definida como 0, 0, 0
E a escala é definida como 1, 1, 1
Em seguida, com o objeto Câmera principal selecionado, consulte o botão Adicionar componente localizado na parte inferior do painel Inspetor.
Selecione esse botão e pesquise (digitando Audio Source no campo de pesquisa ou navegando pelas seções) o componente chamado Audio Source , conforme mostrado abaixo, e selecione-o (pressionar Enter também funciona).
Um componente de fonte de áudio será adicionado à câmera principal, conforme demonstrado abaixo.
Observação
Para o Microsoft HoloLens, você também precisará alterar o seguinte, que faz parte do componente Câmera em sua Câmera Principal:
- Bandeiras Claras: Cor Sólida.
- Plano de fundo 'Preto, Alfa 0' – Cor hexadecimal: #00000000.
Capítulo 4 - Configurar a tela de depuração
Para mostrar a entrada e a saída da tradução, uma interface do usuário básica precisa ser criada. Para este curso, você criará um objeto de interface do usuário do Canvas, com vários objetos 'Text' para mostrar os dados.
Clique com o botão direito do mouse em uma área vazia do Painel de Hierarquia, em UI, adicione uma Tela.
Com o objeto Canvas selecionado, no Painel Inspetor (dentro do componente 'Canvas'), altere o Modo de renderização para Espaço do mundo.
Em seguida, altere os seguintes parâmetros na Transformação Retângulo do Painel Inspetor:
POS - X 0 Y 0 Z 40
Largura - 500
Altura - 300
Escala - X 0,13 Y 0,13 Z 0,13
Clique com o botão direito do mouse na tela no painel de hierarquia, em interface do usuário e adicione um painel. Este painel fornecerá um plano de fundo para o texto que você exibirá na cena.
Clique com o botão direito do mouse no Painel no Painel de Hierarquia, em UI, e adicione um objeto Text. Repita o mesmo processo até criar quatro objetos de texto da interface do usuário no total (Dica: se você tiver o primeiro objeto 'Texto' selecionado, basta pressionar 'Ctrl' + 'D' para duplicá-lo, até ter quatro no total).
Para cada objeto de texto, selecione-o e use as tabelas abaixo para definir os parâmetros no painel Inspetor.
Para o componente Rect Transform:
Nome Transformar - Posição Width Height Rótulo de status do microfone X -80 Y 90 Z 0 300 30 AzureResponseLabel X -80 Y 30 Z 0 300 30 Ditado Rótulo X -80 Y -30 Z 0 300 30 TranslationResultLabel X -80 Y -90 Z 0 300 30 Para o componente Texto (Script):
Nome Texto Tamanho da Fonte Rótulo de status do microfone Status do microfone: 20 AzureResponseLabel Resposta Web do Azure 20 Ditado Rótulo Você acabou de dizer: 20 TranslationResultLabel Translação: 20 Além disso, coloque o estilo da fonte em negrito. Isso tornará o texto mais fácil de ler.
Para cada objeto de texto da interface do usuário criado no Capítulo 5, crie um novo objeto de texto da interface do usuário filho. Esses filhos exibirão a saída do aplicativo. Crie objetos filho clicando com o botão direito do mouse no pai pretendido (por exemplo, MicrophoneStatusLabel) e, em seguida, selecione Interface do usuário e, em seguida, selecione Texto.
Para cada um desses filhos, selecione-o e use as tabelas abaixo para definir os parâmetros no Painel Inspetor.
Para o componente Rect Transform:
Nome Transformar - Posição Width Height MicrophoneStatusText X 0 Y -30 Z 0 300 30 AzureResponseText X 0 Y -30 Z 0 300 30 Texto do ditado X 0 Y -30 Z 0 300 30 TranslationResultText X 0 Y -30 Z 0 300 30 Para o componente Texto (Script):
Nome Texto Tamanho da Fonte MicrophoneStatusText ?? 20 AzureResponseText ?? 20 Texto do ditado ?? 20 TranslationResultText ?? 20
Em seguida, selecione a opção de alinhamento 'central' para cada componente de texto:
Para garantir que os objetos de texto da interface do usuário filho sejam facilmente legíveis, altere sua cor. Faça isso clicando na barra (atualmente 'Preto') ao lado de Cor.
Em seguida, na nova e pequena janela Cor , altere a Cor Hexadecimal para: 0032EAFF
Abaixo está como a interface do usuário deve ficar.
No painel Hierarquia:
Nas visualizações de cena e jogo:
Capítulo 5 – Criar a classe Resultados
O primeiro script que você precisa criar é a classe Results , que é responsável por fornecer uma maneira de ver os resultados da tradução. A classe armazena e exibe o seguinte:
- O resultado da resposta do Azure.
- O status do microfone.
- O resultado do ditado (voz para texto).
- O resultado da tradução.
Para criar essa classe:
Clique com o botão direito do mouse no painel Projeto e, em seguida, em Criar > pasta. Nomeie a pasta Scripts.
Com a pasta Scripts create, clique duas vezes nela para abri-la. Em seguida, dentro dessa pasta, clique com o botão direito do mouse e selecione Criar >e, em seguida, Script C#. Nomeie o script como Resultados.
Clique duas vezes no novo script de Resultados para abri-lo com o Visual Studio.
Insira os seguintes namespaces:
using UnityEngine; using UnityEngine.UI;
Dentro da Classe insira as seguintes variáveis:
public static Results instance; [HideInInspector] public string azureResponseCode; [HideInInspector] public string translationResult; [HideInInspector] public string dictationResult; [HideInInspector] public string micStatus; public Text microphoneStatusText; public Text azureResponseText; public Text dictationText; public Text translationResultText;
Em seguida, adicione o método Awake(), que será chamado quando a classe for inicializada.
private void Awake() { // Set this class to behave similar to singleton instance = this; }
Por fim, adicione os métodos responsáveis por gerar as várias informações de resultados para a interface do usuário.
/// <summary> /// Stores the Azure response value in the static instance of Result class. /// </summary> public void SetAzureResponse(string result) { azureResponseCode = result; azureResponseText.text = azureResponseCode; } /// <summary> /// Stores the translated result from dictation in the static instance of Result class. /// </summary> public void SetDictationResult(string result) { dictationResult = result; dictationText.text = dictationResult; } /// <summary> /// Stores the translated result from Azure Service in the static instance of Result class. /// </summary> public void SetTranslatedResult(string result) { translationResult = result; translationResultText.text = translationResult; } /// <summary> /// Stores the status of the Microphone in the static instance of Result class. /// </summary> public void SetMicrophoneStatus(string result) { micStatus = result; microphoneStatusText.text = micStatus; }
Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.
Capítulo 6 – Criar a classe MicrophoneManager
A segunda classe que você vai criar é o MicrophoneManager.
Esta classe é responsável por:
- Detectando o dispositivo de gravação conectado ao fone de ouvido ou máquina (o que for o padrão).
- Capture o áudio (voz) e use o ditado para armazená-lo como uma string.
- Depois que a voz for pausada, envie o ditado para a classe Translator.
- Hospede um método que possa interromper a captura de voz, se desejado.
Para criar essa classe:
Clique duas vezes na pasta Scripts para abri-la.
Clique com o botão direito do mouse dentro da pasta Scripts , clique em Criar > Script C#. Nomeie o script como MicrophoneManager.
Clique duas vezes no novo script para abri-lo com o Visual Studio.
Atualize os namespaces para serem iguais aos seguintes, na parte superior da classe MicrophoneManager :
using UnityEngine; using UnityEngine.Windows.Speech;
Em seguida, adicione as seguintes variáveis dentro da classe MicrophoneManager :
// Help to access instance of this object public static MicrophoneManager instance; // AudioSource component, provides access to mic private AudioSource audioSource; // Flag indicating mic detection private bool microphoneDetected; // Component converting speech to text private DictationRecognizer dictationRecognizer;
O código para os métodos Awake() e Start() agora precisa ser adicionado. Eles serão chamados quando a classe for inicializada:
private void Awake() { // Set this class to behave similar to singleton instance = this; } void Start() { //Use Unity Microphone class to detect devices and setup AudioSource if(Microphone.devices.Length > 0) { Results.instance.SetMicrophoneStatus("Initialising..."); audioSource = GetComponent<AudioSource>(); microphoneDetected = true; } else { Results.instance.SetMicrophoneStatus("No Microphone detected"); } }
Você pode excluir o método Update(), pois essa classe não o usará.
Agora você precisa dos métodos que o aplicativo usa para iniciar e parar a captura de voz e passá-la para a classe Translator , que você criará em breve. Copie o código a seguir e cole-o abaixo do método Start().
/// <summary> /// Start microphone capture. Debugging message is delivered to the Results class. /// </summary> public void StartCapturingAudio() { if(microphoneDetected) { // Start dictation dictationRecognizer = new DictationRecognizer(); dictationRecognizer.DictationResult += DictationRecognizer_DictationResult; dictationRecognizer.Start(); // Update UI with mic status Results.instance.SetMicrophoneStatus("Capturing..."); } } /// <summary> /// Stop microphone capture. Debugging message is delivered to the Results class. /// </summary> public void StopCapturingAudio() { Results.instance.SetMicrophoneStatus("Mic sleeping"); Microphone.End(null); dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult; dictationRecognizer.Dispose(); }
Dica
Embora este aplicativo não faça uso dele, o método StopCapturingAudio() também foi fornecido aqui, caso você queira implementar a capacidade de interromper a captura de áudio em seu aplicativo.
Agora você precisa adicionar um manipulador de ditado que será invocado quando a voz parar. Esse método passará o texto ditado para a classe Translator .
/// <summary> /// This handler is called every time the Dictation detects a pause in the speech. /// Debugging message is delivered to the Results class. /// </summary> private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence) { // Update UI with dictation captured Results.instance.SetDictationResult(text); // Start the coroutine that process the dictation through Azure StartCoroutine(Translator.instance.TranslateWithUnityNetworking(text)); }
Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.
Aviso
Neste ponto, você notará um erro aparecendo no Painel do Console do Editor do Unity ("O nome 'Tradutor' não existe..."). Isso ocorre porque o código faz referência à classe Translator , que você criará no próximo capítulo.
Capítulo 7 – Chamada para o Azure e o serviço de tradutor
O último script que você precisa criar é a classe Translator .
Esta classe é responsável por:
- Autenticar o aplicativo com o Azure, em troca de um token de autenticação.
- Use o Token de Autenticação para enviar texto (recebido da Classe MicrophoneManager ) para ser traduzido.
- Receba o resultado traduzido e passe-o para a Classe de Resultados para ser visualizado na interface do usuário.
Para criar esta classe:
Vá para a pasta Scripts que você criou anteriormente.
Clique com o botão direito do mouse no painel Projeto, Criar > Script C#. Chame o script de Translator.
Clique duas vezes no novo script do Tradutor para abri-lo com o Visual Studio.
Adicione os seguintes namespaces à parte superior do arquivo:
using System; using System.Collections; using System.Xml.Linq; using UnityEngine; using UnityEngine.Networking;
Em seguida, adicione as seguintes variáveis dentro da classe Translator :
public static Translator instance; private string translationTokenEndpoint = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; private string translationTextEndpoint = "https://api.microsofttranslator.com/v2/http.svc/Translate?"; private const string ocpApimSubscriptionKeyHeader = "Ocp-Apim-Subscription-Key"; //Substitute the value of authorizationKey with your own Key private const string authorizationKey = "-InsertYourAuthKeyHere-"; private string authorizationToken; // languages set below are: // English // French // Italian // Japanese // Korean public enum Languages { en, fr, it, ja, ko }; public Languages from = Languages.en; public Languages to = Languages.it;
Observação
- Os idiomas inseridos no enum de idiomas são apenas exemplos. Sinta-se à vontade para adicionar mais, se desejar; a API suporta mais de 60 idiomas (incluindo Klingon)!
- Há uma página mais interativa que cobre os idiomas disponíveis, embora esteja ciente de que a página só parece funcionar quando o idioma do site está definido como '' (e o site da Microsoft provavelmente redirecionará para seu idioma nativo). Você pode alterar o idioma do site na parte inferior da página ou alterando o URL.
- O valor authorizationKey, no snippet de código acima, deve ser a chave que você recebeu quando se inscreveu na API de Texto do Azure Translator. Isso foi abordado no Capítulo 1.
O código para os métodos Awake() e Start() agora precisa ser adicionado.
Nesse caso, o código fará uma chamada para o Azure usando a chave de autorização, para obter um token.
private void Awake() { // Set this class to behave similar to singleton instance = this; } // Use this for initialization void Start() { // When the application starts, request an auth token StartCoroutine("GetTokenCoroutine", authorizationKey); }
Observação
O token expirará após 10 minutos. Dependendo do cenário do seu app, talvez seja necessário fazer a mesma chamada de corrotina várias vezes.
A corrotina para obter o Token é a seguinte:
/// <summary> /// Request a Token from Azure Translation Service by providing the access key. /// Debugging result is delivered to the Results class. /// </summary> private IEnumerator GetTokenCoroutine(string key) { if (string.IsNullOrEmpty(key)) { throw new InvalidOperationException("Authorization key not set."); } using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(translationTokenEndpoint, string.Empty)) { unityWebRequest.SetRequestHeader("Ocp-Apim-Subscription-Key", key); yield return unityWebRequest.SendWebRequest(); long responseCode = unityWebRequest.responseCode; // Update the UI with the response code Results.instance.SetAzureResponse(responseCode.ToString()); if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) { Results.instance.azureResponseText.text = unityWebRequest.error; yield return null; } else { authorizationToken = unityWebRequest.downloadHandler.text; } } // After receiving the token, begin capturing Audio with the MicrophoneManager Class MicrophoneManager.instance.StartCapturingAudio(); }
Aviso
Se você editar o nome do método IEnumerator GetTokenCoroutine(), precisará atualizar os valores de cadeia de caracteres de chamada StartCoroutine e StopCoroutine no código acima. De acordo com a documentação do Unity, para interromper uma corrotina específica, você precisa usar o método de valor de string.
Em seguida, adicione a corrotina (com um método de fluxo "support" logo abaixo dela) para obter a tradução do texto recebido pela classe MicrophoneManager . Esse código cria uma cadeia de caracteres de consulta a ser enviada para a API de Tradução de Texto do Azure e, em seguida, usa a classe interna UnityWebRequest do Unity para fazer uma chamada 'Get' para o ponto de extremidade com a cadeia de caracteres de consulta. O resultado é usado para definir a conversão em seu objeto Results. O código abaixo mostra a implementação:
/// <summary> /// Request a translation from Azure Translation Service by providing a string. /// Debugging result is delivered to the Results class. /// </summary> public IEnumerator TranslateWithUnityNetworking(string text) { // This query string will contain the parameters for the translation string queryString = string.Concat("text=", Uri.EscapeDataString(text), "&from=", from, "&to=", to); using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(translationTextEndpoint + queryString)) { unityWebRequest.SetRequestHeader("Authorization", "Bearer " + authorizationToken); unityWebRequest.SetRequestHeader("Accept", "application/xml"); yield return unityWebRequest.SendWebRequest(); if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) { Debug.Log(unityWebRequest.error); yield return null; } // Parse out the response text from the returned Xml string result = XElement.Parse(unityWebRequest.downloadHandler.text).Value; Results.instance.SetTranslatedResult(result); } }
Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.
Capítulo 8 – Configurar a cena do Unity
De volta ao Editor do Unity, clique e arraste a classe Results da pasta Scripts para o objeto Main Camera no Painel de Hierarquia.
Clique na Câmera Principal e olhe para o Painel do Inspetor. Você notará que, no componente Script recém-adicionado, há quatro campos com valores vazios. Essas são as referências de saída para as propriedades no código.
Arraste os objetos de texto apropriados do painel de hierarquia para esses quatro slots, conforme mostrado na imagem abaixo.
Em seguida, clique e arraste a classe Translator da pasta Scripts para o objeto Main Camera no Painel de Hierarquia.
Em seguida, clique e arraste a classe MicrophoneManager da pasta Scripts para o objeto Câmera Principal no Painel de Hierarquia.
Por fim, clique na Câmera Principal e olhe para o Painel do Inspetor. Você notará que no script que você arrastou, existem duas caixas suspensas que permitirão definir os idiomas.
Capítulo 9 – Teste em realidade mista
Neste ponto, você precisa testar se a cena foi implementada corretamente.
Verifique se:
- Todas as configurações mencionadas no Capítulo 1 estão definidas corretamente.
- Os scripts Results, Translator e MicrophoneManager são anexados ao objeto Main Camera .
- Você colocou sua Chave de Serviço da API de Tradução de Texto do Azure na variável authorizationKey dentro do Script de Tradução.
- Todos os campos no Painel Inspetor de Câmera Principal são atribuídos corretamente.
- Seu microfone está funcionando ao executar sua cena (caso contrário, verifique se o microfone conectado é o dispositivo padrão e se você o configurou corretamente no Windows).
Você pode testar o headset imersivo pressionando o botão Reproduzir no Editor do Unity. O aplicativo deve estar funcionando por meio do fone de ouvido imersivo conectado.
Aviso
Se você vir um erro no console do Unity sobre a alteração do dispositivo de áudio padrão, a cena pode não funcionar conforme o esperado. Isso se deve à maneira como o portal de realidade misturada lida com microfones internos para fones de ouvido que os possuem. Se você vir esse erro, simplesmente pare a cena e reinicie-a e as coisas devem funcionar conforme o esperado.
Capítulo 10 – Criar a solução UWP e fazer sideload no computador local
Tudo o que é necessário para a seção Unity deste projeto foi concluído, então é hora de construí-lo a partir do Unity.
Navegue até Configurações de compilação: Configurações de compilação de arquivo > ...
Na janela Configurações de Compilação, clique em Compilar.
Se ainda não estiver, marque Projetos C# do Unity.
Clique em Compilar. O Unity abrirá uma janela do Explorador de Arquivos, onde você precisa criar e selecionar uma pasta para criar o aplicativo. Crie essa pasta agora e nomeie-a como App. Em seguida, com a pasta App selecionada, pressione Select Folder (Selecionar pasta).
O Unity começará a criar seu projeto na pasta App .
Depois que o Unity terminar de compilar (pode levar algum tempo), ele abrirá uma janela do Explorador de Arquivos no local da compilação (verifique a barra de tarefas, pois nem sempre ela aparece acima das janelas, mas notificará você sobre a adição de uma nova janela).
Capítulo 11 – Implantar seu aplicativo
Para implantar seu aplicativo:
Navegue até o novo build do Unity (a pasta App ) e abra o arquivo de solução com o Visual Studio.
Na Configuração da Solução, selecione Depurar.
Na Plataforma de Solução, selecione x86, Computador Local.
Para o Microsoft HoloLens, talvez seja mais fácil definir isso como Computador Remoto, para que você não fique preso ao computador. No entanto, você também precisará fazer o seguinte:
- Conheça o endereço IP do HoloLens, que pode ser encontrado nas Configurações > Opções avançadas de Wi-Fi > de rede e Internet>; o IPv4 é o endereço que você deve usar.
- Certifique-se de que o Modo de desenvolvedor esteja ativado; encontrado em Atualização de configurações > e segurança > Para desenvolvedores.
Vá para o menu Compilar e clique em Implantar Solução para carregar o aplicativo em seu PC.
Seu aplicativo agora deve aparecer na lista de aplicativos instalados, pronto para ser iniciado.
Uma vez iniciado, o aplicativo solicitará que você autorize o acesso ao microfone. Certifique-se de clicar no botão SIM .
Agora você está pronto para começar a traduzir!
Seu aplicativo da API de tradução de texto finalizado
Parabéns, você criou um aplicativo de realidade misturada que aproveita a API de Tradução de Texto do Azure para converter fala em texto traduzido.
Exercícios de bônus
Exercício 1
Você pode adicionar a funcionalidade de conversão de texto em fala ao aplicativo, para que o texto retornado seja falado?
Exercício 2
Possibilite que o usuário altere os idiomas de origem e saída ('de' e 'para') dentro do próprio aplicativo, para que o aplicativo não precise ser recriado toda vez que você quiser alterar os idiomas.