Chatbot, Wit.ai – tworzenie chatbota – Speech API

Artificial Intelligence

Rozpoznawanie głosu to temat trudny, nawet dla największych wyjadaczy. Z pomocą przychodzi jednak Wit.ai, wraz ze swoim Speech API. Dzięki dedykowanej aplikacji oraz wykorzystaniu WebRTCWebSockets możemy w prosty sposób przekonwertować mowę na tekst oraz skomunikować się z naszym chatbotem.

Trochę teorii

Wit.ai Speech API powstało w lutym 2014 roku jako rozwinięcie projektu Wit.ai. Zasada działania jest prosta, przesyłamy na backend (w tym wypadku na zewnętrzny serwer Wit.ai) plik audio. Dźwięk jest przetwarzany i konwertowany. Dostajemy w zwrotce JSON z intencją oraz wartościami, które zostaną wychwycone.

speech2json

Wit.ai Speech API łączy w sobie różne techniki przetwarzania języka naturalnego oraz silniki rozpoznawania mowy. Potrafi odseparować szumy z otoczenia, dostosować poziom głośności i wydobyć właściwe dźwięki.

Microphone

W ramach tego wpisu zapoznamy się z nakładką wit-ai/microphone. Biblioteka jest dewelopowana przez zespół zajmujący się  Wit.ai. Została napisana w CoffeeScript, wykorzystuje WebRTC i WebSockets, dzięki czemu nie musimy zapisywać plików audio lokalnie. Cały kod jest jawny, a jego rdzeń możemy znaleźć tutaj.

Implementacja Speech API

Po wpięciu biblioteki obsługującej mikrofon i komunikującej się z Wit.ai API, pozostało obsłużyć mikrofon na stronie internetowej.

Zaczynamy od stworzenia instancji Microphone:

const microphone = new Wit.Microphone(document.getElementById('microphone'));

Jak widać, odwołujemy się do elementu posiadającego id microphone. W ten sam sposób dodajemy info oraz error:

const info = message => {
  document.getElementById('info').innerHTML = message;
};
const error = message => {
  document.getElementById('error').innerHTML = message;
};

Teraz, korzystając z dokumentacji, stwórzmy kilka metod obsługujących naszą aplikację. Poinformujmy użytkownika, że można rozpocząć nagrywanie:

microphone.onready = () => {
  info('Mikrofon gotowy do nagrywania');
}

Po starcie, zmiana statusu z informacją:

microphone.onaudiostart = () => {
  info('Nagrywanie rozpoczęte');
};

Oraz po zakończeniu nagrywania:

microphone.onaudioend = () => {
  info('Nagrywanie zakończone, trwa konwertowanie');
};

Pamiętajmy, że w razie niepowodzenia, warto o tym poinformować użytkownika. Wykorzystujemy więc metodę onerror:

microphone.onerror = errorMessage => {
  error('Błąd: ' + errorMessage);
};

W momencie nawiązywania oraz zamykania połączenia mamy dwa dodatkowe callbacki: onconnectingondisconnected. Wykorzystujemy je do stworzenia dodatkowych statusów informujących:

microphone.onconnecting = () => {
  info('Trwa weryfikowanie mikrofonu');
};
microphone.ondisconnected = () => {
  info('Mikrofon nie jest podłączony');
};

Została nam jeszcze obsługa onresult. Analogicznie jak w wersji node’owej, tutaj też po zidentyfikowaniu osoby, spróbujemy wyszukać o niej informacji na wikipedii:

microphone.onresult = (intent, entities) => {
  if (entities.fullName === undefined) {
    document.getElementById('result').innerHTML = 'Nie zrozumiałem, spróbuj jeszcze raz!';
  } else {
    let fullName = entities.fullName.value;
    document.getElementById('result').innerHTML = fullName + '? Szukam na wikipedii...';
    window.open('https://pl.wikipedia.org/wiki/' + fullName.replace(' ', '_'));
  }
};

W metodzie connect przekazujemy token, który możemy wygenerować w ustawieniach aplikacji.

Speech API token

Podsumowanie

Po implementacji i deployu na Heroku, możemy sprawdzić jak się zachowuje aplikacja. Przykładowy screen z testu zamieszczam poniżej. Cały kod dostępny jest na moim githubie, zachęcam też do przetestowania aplikacji samodzielnie.

Spy chatbot - Speech API

Przydatne linki

Chatbot, Wit.ai – tworzenie chatbota – Wit Node.js SDK

Artificial Intelligence

Dzisiaj już trzeci wpis z serii Wit.ai. Tym razem zajmiemy się tworzeniem chatbota w node.js. Przy tej okazji zapoznamy się z Wit Node.js SDK i zbudujemy aplikację, która wyświetli artykuł o szukanej osobie w wikipedii.

Wit Node.js SDK – przygotowanie środowiska

Instalacja

Instalacja Wit Node.js SDK przebiega w standardowy sposób.  Do instalacji używamy npm:

npm install --save node-wit

Jeżeli wszystko przebiegnie pomyślnie, zostanie stworzony folder node_modules, a w nim znajdować się będzie zainstalowana paczka.

Require

Możemy teraz, w głównym katalogu, stworzyć plik index.js. Tam z kolei dodajemy potrzebne zależności:

const Wit = require('node-wit').Wit;
const interactive = require('node-wit').interactive;

W tym tutorialu skorzystamy z Wit oraz interactive, więc dodajemy tylko te zależności.

Połączenie z Wit.ai API

Access token

Na początku musimy pobrać access token. Będziemy przekazywać go jako parametr, przy uruchamianiu aplikacji. Unikniemy w ten sposób zaszycia naszego tokenu w kodzie. Do wydobycia tokenu użyjemy node’owego proccess.

const accessToken = (() => {
  if (process.argv.length !== 3) {
    process.exit(1);
  }

  return process.argv[2];
})();

Tworzenie instancji Wit

Teraz możemy stworzyć nową instancję Wit. W tym celu dodajemy do naszego kodu następujące dwie linijki:

const client = new Wit({ accessToken, actions });
interactive(client);

Jak widzimy powyżej, tworząc instancję Wit, przekazujemy wcześniej utworzony accessToken. Dopisujemy od razu actions, które utworzymy za chwilę.

Akcje

Nasz chatbot do poprawnego działania potrzebuje jeszcze akcji. Do zapewnienia podstawowej komunikacji z Wit.ai API potrzebujemy w naszym przypadku dwóch akcji:

  • send – wbudowana akcja Wit.ai, przyjmuje dwa parametry: request i response
  • findPerson – zdefiniowana przez nas akcja

Zadeklarujmy więc akcje w naszym programie:

const actions = {
  send(request, response) {
    console.log('request', request);
    console.log('response', response);
  },
  findPerson({ context, entities }) {
    console.log('context', context);
    console.log('entities', entities);
  }
};

Testując naszą aplikację możemy zobaczyć od podszewki w jaki sposób działa Wit.ai.

Przykładowe wykorzystanie

Aby na tym poziomie nasz chatbot miał już jakąś funkcjonalność, sparsujemy wyodrębnione dane i sprawdzimy czy na temat danej osoby znajduje się artykuł w wikipedii.

Do tego celu wykorzystamy opn. Instalujemy paczkę przez npm.

npm install --save opn

Dodajemy opn do projektu:

const opn = require('opn');

Na koniec pozostało jeszcze zmodyfikowanie metody findPerson:

findPerson({ context, entities }) {
  const fullName = entities.fullName[0].value;
  const url = 'https://pl.wikipedia.org/wiki/' + fullName.replace(' ', '_');

  if (fullName) {
    context.fullName = fullName;
    opn(url, { wait: false });
  } else {
    console.error('Nie zrozumiałem.');
  }

  return context;
}

Test

Pozostało nam przetestować działanie aplikacji node.js. W tym celu wykorzystamy terminal:

Wit Node.js SDK

W terminalu otrzymaliśmy informację (zadeklarowaną w poprzednim wpisie o Wit.ai). Dodatkowo w prosty sposób sprawdzimy czy na temat danej osoby znajduje się artykuł na wikipedii.

Adam Małysz wiki

Dawid Ryłko wiki

Podsumowanie

W tym wpisie zapoznaliśmy się z Wit Node.js SDK i zbudowaliśmy prostą aplikację w Node.js. Kolejny wpis tej serii poświęcimy na rozbudowanie naszego chatbota.

Dodatkowo cały kod, z tego tutorialu do tworzenia chatbota, można pobrać z mojego repozytorium na githubie:
https://github.com/dawidrylko/spy/tree/1.0

Chatbot, Wit.ai – środowisko graficzne

AI Robot

W poprzednim wpisie dowiedzieliśmy się czym są chatboty, do czego mogą służyć oraz było kilka słów o jednym z systemów do ich tworzenia. Dzisiaj przyjrzymy się nieco bardziej środowisku graficznemu Wit.ai oraz zaczniemy projektować prostego chatbota.

Tworzenie aplikacji Wit.ai

Tworzenie aplikacji w Wit.ai jest bardzo proste i intuicyjne. W górnej belce należy kliknąć znak +. Zostaniemy przekierowani na stronę http://wit.ai/apps/new.

Możliwość tworzenia aplikacji, dostępna jest tylko dla zalogowanych użytkowników.

Po wypełnieniu prostego formularza, klikamy na przycisk Create App.

Wit.ai - creating app

Jeżeli wszystko przebiegnie pomyślnie, stworzona dla nas zostanie nowa instancja wit. Zostaniemy przekierowani do nowej aplikacji na zakładkę Understanding, gdzie zostaniemy przywitani przez kota.

Wit.ai - welcome

Entity

Cała magia w tworzeniu aplikacji za pomocą Wit.ai polega na właściwym wytrenowaniu sieci. W input User says... wpisujemy zatem sentencję, jaką mógłby wypowiedzieć użytkownik aplikacji. Następnie oznaczamy poszczególne elementy składowe.

Wit.ai - test sentence

Jak widać na obrazku załączonym powyżej, sentencja brzmi Kim jest Johnny Depp?. Zidentyfikowałem sobie intencję jako find-person oraz stworzyłem encję fullName, do której zostało przyporządkowane imię i nazwisko znanego aktora.

Po kliknięciu validate mamy możliwość wpisania kolejnej sentencji testowej. Spójrzmy jednak poniżej. Lista używanych encji zmieniła się. Nasza aplikacja wykorzystuje teraz dwie encje: fullName oraz intent. Obie zostały utworzone przez nas, a na skrajnie prawej kolumnie widać jakie wartości kryją się za daną encją.

Wit.ai - entity

Wbudowane encje (Built-in entities)

Warto przy tej okazji nadmienić, że Wit.ai posiada szereg wbudowanych encji, które możemy wykorzystać w swojej aplikacji. Built-in entities mają przede wszystkim ułatwić pracę deweloperom, tak by nie musieli tworzyć najczęściej używanych encji.

You’ll often need to extract temporal expressions, numbers, locations, temperatures, etc. To make your developer life easier, we have predefined these entities. They are trained across all our dataset, so they are supposed to perform very well.

Strategia wyszukiwania (Search Strategy)

Jeżeli nie używamy wbudowanych encji, musimy określić Search Strategy. Wit.ai rozróżnia następujące strategie wyszukiwania:

  • trait – należy wybrać tę strategię, gdy wartość encji nie wywodzi się ze słowa kluczowego lub nie jest bezpośrednią częścią składową w danej sentencji. Wykorzystujemy ten sposób wyszukiwania do określania ogólnego kontekstu lub wyczuwania intencji użytkownika.
  • free-text – należy wybrać tę strategię, gdy chcemy wyodrębnić tekst z danej sentencji.
  • keywords – słowa kluczowe. Wykorzystujemy dla zdefiniowanych wartości np. kraje, waluty itp.

Trenowanie

Nasza aplikacja zaczyna lepiej rozumieć nasze wypowiedzi, jeśli ją dobrze wytrenujemy. Zadbajmy o to, żeby wpisywane dane były różnorodne. Zmieniajmy szyk zdania oraz popełniajmy częste literówki. Pomoże to w przypadku chatbota z którym chcemy się komunikować za pomocą tekstu.

Trenowanie w Wit.ai to żmudny proces, który niestety wymaga naszej atencji. W minimalnym stopniu, ale jednak. Gdy wprowadzimy odpowiednią ilość sentencji treningowych, możemy przejść dalej.

Stories

Stories są na razie w fazie beta. Nic nie stoi jednak na przeszkodzie, by wykorzystać je do prostej implementacji chatbota. To swoiste dialogi pomiędzy użytkownikiem, a naszą aplikacją.

Stwórzmy zatem przykładową historię klikając Create a story.

Wit.ai - story

Zaczynamy od wpisania sentencji użytkownika: Kim jest Adam Małysz? Sprawdzamy jednocześnie czy tekst został poprawnie zinterpretowany. Następnie klikamy Bot executes, gdzie wpisujemy nazwę metody. W naszym przypadku ma się uruchomić metoda findPerson(). Jak widzimy na screenie, w metodzie są przekazywane parametry: context i entities. Następnie możemy uzupełnić context-key, który nie jest wymagany. Na koniec dodajemy standardową odpowiedź naszego bota do zaistniałej sytuacji.

Test

Wit.ai - chat buttonŚrodowisko graficzne pozwala nam także szybko przetestować naszą aplikację. W prawym dolnym rogu jest przycisk rozpoczynający dialog z chatbotem.

W okienku, które wyskoczyło, możemy teraz wpisać dowolną sentencję i zaobserwować jak do tego ustosunkuje się stworzony chatbot.

Co dalej?

Wit.ai - responseTo pierwszy krok do stworzenia własnego chatbota. W tym wpisie było dużo klikania, a mało kodowania. Poprawimy to w kolejnej części serii, gdzie stworzymy od podstaw aplikację w node.js. Skomunikujemy się z naszą instancją Wit.ai. Wyślemy sentencję użytkownika do API, zobaczymy co nam chatbot odpowie i spróbujemy coś zrobić z danymi, które zostały wydobyte z zadanej sentencji.