Bosch XDK e IBM Cloud, comande um sensor por voz!

Felipe Neves
Venturus
Published in
8 min readMar 2, 2018

Olá caro leitor! Nesse meu segundo post aqui no Medium continuo com a minha saga explorando o Bosch XDK, que se à primeira vista pode parecer caro, ele entrega valor onde precisa no momento de implementar soluções completas para coleta de dados distribuída ou atuação remota. Neste artigo vamos continuar na linha de integração entre Bosch e IBM Cloud, onde vamos apresentar um projeto mostrado no último Meetup na IBM Hortolândia 2017. Nele comandamos o XDK por voz!

Comandando um sensor node por voz?

Isso, você não leu errado, com o uso do serviço Speech to Text da IBM podemos capturar o áudio de uma fonte como, por exemplo, a placa de áudio de um computador, enviar esses dados para o serviço de transcrição, que nos devolve o texto equivalente onde poderemos mapear os caracteres e verificar se a sentença falada é ou contém um comando. A arquitetura dessa ideia de projeto é apresentada abaixo:

Sobre o XDK não temos muito o que adicionar, mas se por um acaso o leitor quiser conhecer mais sobre esse poderoso sensor node, pode verificar neste meu artigo onde foi dada uma introdução e falamos um pouco sobre as características chave desse dispositivo (e não esqueça de voltar aqui depois hein).

Uma coisa interessante é que integraremos duas ferramentas do IBM Bluemix, o Watson IoT Platform, e o já citado Speech to Text. Sobre o primeiro, temos um guia completo para integrar o XDK no gerenciador de dispositivos IoT da IBM, então antes de continuar, dê uma passadinha neste artigo aqui.

Para esse projeto, desenvolveremos duas aplicações, uma no firmware do XDK, e outra aplicação Desktop em Java. Mas não se engane, a aplicação desenvolvida poderia ser voltada para um dispositivo móvel baseado em Android.

Mas então o que essa demonstração vai fazer? Bom, no artigo guia de integração do XDK com o Watson IoT nosso firmware iniciava e parava de fazer uma coleta de dados dos sensores da placa ao pressionar um dos botões, certo? Pois bem, o XDK agora vai receber comandos vindos da plataforma IoT da IBM utilizando o protocolo de mensagem padrão MQTT, que vai substituir o pressionamento dos botões e iniciar ou pausar a aquisição de dados.

Ok, mas quem é que envia esses comandos ao XDK? Sim, a aplicação em Java que, pasmem, pode estar rodando num computador em qualquer lugar do mundo! Bastando ter as credenciais do serviço Speech to Text e o Device-id do dispositivo XDK integrado previamente no Watson IoT.

Para disparar o envio do comando via MQTT, a aplicação fica constantemente observando o áudio que chega à placa de som do computador, e envia para o Speech to Text fazer a transcrição. Quando o texto contém o comando desejado, ele então dispara um comando pelo MQTT para o Device-id apontado, que é o XDK, e reinicia o ciclo.

Gostei, o que preciso para rodar esse projeto?

Vamos preparar o ambiente para rodar essa demonstração. Para isso vamos listar os requisitos necessários:

  • Bosch XDK Cross Domain kit;
  • Bosch XDK Workbench versão 2.x;
  • Notebook com conexão à internet;
  • SO Windows ou Linux (utilizaremos o Ubuntu nesse exemplo);
  • Apache Maven, para build da aplicação Java;
  • Conta IBM Bluemix com Watson IoT e Speech to Text configurados;
  • Repositório com o código fonte para XDK e Aplicação Java, aqui.

Com essa listinha em mãos podemos preparar todo ambiente para rodar nosso projeto. Para o XDK Workbench, citamos a versão 2.x pois a atual 3.x sofreu grandes modificações no SDK e o projeto ainda não foi testado nela.

Na sua máquina de desenvolvimento importe o projeto de firmware encontrado no repositório (não mexa em nada ainda, falaremos sobre o código mais adiante). Ainda na sua máquina de desenvolvimento, instale o Maven build system, utilize as instruções do fornecedor aqui, essa ferramenta é necessária para resolver as dependências da aplicação Java, em especial, as existentes da API do IBM Bluemix.

Não se preocupe com as URLs dos repositórios, o arquivo utilizado pelo Maven da nossa demonstração já está devidamente populado. Extraia o projeto da aplicação Java em um local conhecido, e também não mexa na aplicação ainda. Com esse passo feito teremos todo o necessário para construir nossa aplicação.

Credenciais: Preparando o Speech to Text da IBM

Esse passo ja é conhecido para quem leu o guia de integração do XDK ao Watson. Teremos que refazer esse passo, mas dessa vez para o Speech to Text. A vantagem aqui é que a burocracia é menor, para ter acesso ao serviço pela aplicação Java, primeiramente logue em sua conta IBM Bluemix e selecione um novo serviço, em seguida Speech to Text.

Ao criar o serviço, agora precisamos gerar as credenciais, para isso observe as imagens abaixo, e ao final do processo guarde a autenticação com você, iremos inserir esses dados em um local conveniente da aplicação Java:

Pondo as mãos no código fonte!

Agora, efetivamente, vamos mexer nas coisas, o lado do firmware do XDK não precisa de grandes modificações, mas um item que constantemente me é perguntado é onde inserir os dados de WiFi e credenciais para acessar o IoT Watson. Para isso abra o arquivo mqttConfig.h localizado na pasta source,

Vá direto à linha 48, as constantes definidas nessa linha basicamente representam o ID e Senha da sua WiFi, basta adicionar a string correspondente a esses valores. Com isso o XDK conseguirá se conectar à rede.

Para conectar o XDK no Watson IoT, você deve fornecer seu MQTT_ID, que é a string padrão pro serviço da IBM. A estrutura dessa string pode ser encontrada no guia de integração XDK e Watson IoT. E por último, você precisa passar a URL do broker MQTT desejado, no caso o da IBM, para isso edite a variável MQTT_BROKER_NAME. Feita essas alterações, compile o projeto e clique na opção Flash e pronto, seu XDK em alguns segundos estará conectado ao Watson IoT Platform aguardando comandos.

O passo mais chatinho nesse projeto reside na aplicação Java, para isso, agora volte ao projeto que você extraiu. Primeiramente precisamos configurar as credenciais e o Device-id que a aplicação deverá acessar, para isso dentro do diretório xdk_commander navegue para src/main/resources, você verá um arquivo chamado de application.properties, abra-o em um editor de texto e popule todos os campos de acordo com o valor gerado. Em Organization-ID, por exemplo, você precisa do org-id da sua conta Bluemix; API-Key e Authentication token são obtidos ao criar um dispositivo no Watson IoT, e caso você não tenha anotado, volte no IoT Platform e gere o dispositivo novamente. Device-Type e ID basicamente são os mesmos valores passados no firmware do XDK.

Por fim, pegue as credenciais do Speech to Text que você gerou anteriormente e adicione em stt-username e password, respectivamente. Pronto, todas as credenciais estão populadas, agora a aplicação Java vai poder acessar o Bluemix para transcrever áudio e enviar comandos pelo MQTT.

Estamos prontos para fazer o build, sigam os passos, primeiro retorne à pasta xdk_commander e abra um terminal. Iremos resolver as dependências usando o Maven previamente instalado, para isso:

mvn clean package1mvn clean package

Esse passo pode demorar alguns minutos pois basicamente o Maven vai fazer fetch de todos os fontes necessários para build da aplicação. Terminado esse passo, finalmente, faça o build da aplicação com:

mvn exec:java -Dexec.mainClass=”com.ibm.watsoniot.xdkVoiceController”1mvn exec:java -Dexec.mainClass=”com.ibm.watsoniot.xdkVoiceController”

Lembrando que esse mesmo comando também irá rodar a aplicação. Se a conexão com internet estiver disponível, imediatamente ele irá conectar aos serviços do Bluemix e transmitir comandos que batam com as sentenças esperadas.

Fiquei curioso, como isso funciona?

Utilizei um exemplo fornecido pela IBM de como acessar o Speech to Text e fiz minhas modificações. A primeira é escanear a fonte de áudio a cada segundo, assim o método Main roda infinitamente e utiliza o método CreateApplication(), onde ele basicamente conecta-se aos serviços do Bluemix. Em seguida ele chama o método StreamVoice(), onde ele captura o áudio corrente, abre um WebSocket e envia a requisição ao serviço Speech to Text e instrui a chamada da callback onTranscription().

Essa chamada vai procurar na string recebida se existe um dos comandos válidos (Start ou Stop), caso positivo um Publish é enviado ao Device-ID (no caso o XDK), contendo o comando a ser processado e ciclo de scan se inicia.

No firmware o processo é baixo nível, athread ClientTask() basicamente cuida do processo de transmissão e recepção de dados, ela fica em repouso até que a variável clientDataGetFlag sejá colocada em true. Isso ocorre quando um comando é publicado pela aplicação Java, o payload vem por MQTT em formato JSON e invoca a callback ClientRecv(). Essa função pesquisa no JSON se é o comando Start ou Stop, baseado nesses comandos clientDataGetFlag é colocado em true e o XDK passa a fazer a aquisição de dados dos sensores on board. Os dados são formatados em JSON e enviados ao IoT Platform onde o usuário do Bluemix poderá ver os dados que chegam, ou criar gráficos para ver sua evolução ao longo do tempo.

Lembrando que é possível adicionar comandos em português e disparar o sensor com frases inteiras se desejado. Legal não?

Conclusão

O objetivo desse artigo foi demonstrar mais um caso de aplicação de Internet das coisas na sua forma mais real, para isso contamos com um dispositivo de borda conectado, o Bosch XDK, seu arsenal de sensores, um serviço de nuvem poderoso como IBM Bluemix fornecendo ferramentas fantásticas como gerenciador de dispositivos IoT e Speech to text. Com essas ferramentas e em algumas horas de código pudemos escrever um caso de comando remoto envolvendo voz. E você leitor, acha que esse projeto clareou tanto para uso do XDK quanto do IBM Watson? Postem seus comentários e fiquem ligados, que postaremos mais projetos legais com a dobradinha XDK e IBM Watson, até a próxima!

Referências

--

--

Felipe Neves
Venturus

Passionate Embedded Systems Developer, open source embedded systems tools contributor and user. Lead Firmware Engineer at Venturus