Arduino – synteza mowy

Biblioteka “Talkie” została napisana w 2011 roku przez Petera Knighta dla Arduino UNO,  Duemilanove oraz Diecimila (nie działa na Arduino Mega i Leonardo). Kod jest implementacją architektury syntezy mowy (Linear Predictive Coding) wykonanej przez firmę Texas Instruments. Rozwiązanie to pochodzi z późnych lat 70 i było rozwijane w latach 80 XX wieku. Stosowała je między innymi firma Texas Instruments w układach przeznaczonych do generowania mowy np. w zabawkach.  Technologie używała też firma Atari w grach Atari Arcade (np. seria Star Wars, Indiana Jones, Gauntlet). Również adapter mowy IBM PS/2 i Apple Echo 2 używał tego sposobu syntezy dźwięku.

Dostarczona biblioteka zawiera ponad tysiąc gotowych słów, które zawierają bardzo mało miejsca w pamięci układu i z łatwością mogą zostać wykorzystane w realizowanym projekcie. Dostarczone sample są w języku angielskim i zostały pogrupowane w następujących plikach:

  • Vocab_UK_Acorn – głos męski (znanego dziennikarza Kennetha Kendalla), pełna biblioteka zajmuje 16 kilobajtów i zawiera 165 słów związanych z technologią informacyjną.
  • Vocab_US_Clock – głos kobiecy (pochodzi z układu VM71003A), biblioteka zajmuje 8 kilobajtów i zawiera 35 słów związanych z porami dnia.
  • Vocab_US_TI99 – głos męski (z układu syntezy mowy TI-99/4A), biblioteka zajmuje 32 kilobajty i zawiera 360 słów.
  • Vocab_US_Male – głos męski (zaczerpnięty z VM61002), biblioteka zajmuje 16 kilobajtów i zawiera 206 słów związanych z lotnictwem.
  • Vocab_US_Male_Large – głos męski (z układu VM61003/4/5), biblioteka zajmuje 48 kilobajtów i zawiera 402 słowa związane z lotnictwem.

Schemat połączeń

Program używa pinu numer 3 na płytce Arduino Uno i nie wymaga stosowania dodatkowych filtrów (zastosowano PWM o wysokiej częstotliwości), używane są również timery 1 i 2, dlatego nie można ich używać ponieważ zarezerwowane są do syntezy dźwięku.

Arduino Talkie

Schemat podłączenia głośnika z wbudowanym wzmacniaczem do Arduino Uno

Kod programu

Przykładowy program dostępny w repozytorium składa się z dwóch plików (talkie.h i talkie.cpp) będących biblioteką “Talkie” podłączoną w trzecim pliku – projekcie (talkie.ino).
Kod programu zawiera dane sampla w tablicy “_ne” (która na poniższym przykładzie została przedstawiona w skróconej formie) oraz metodę “say()”, która jako parametr przyjmuje ową tablicę.

#include “talkie.h”
Talkie voice;
const unsigned char _ne[] PROGMEM = {0x89,0x8A,0x56, itd.}
void loop() {  
delay(2000);  
voice.say(_ne);
}

Przygotowanie sampli

By przygotować własne sample z plików dźwiękowych w formacie Wav biblioteka Talkie dostarcza gotowych skryptów dla programu Matlab. Autor nie sprawdził ich działania, gdyż w systemie Linux Debian prostszym rozwiązaniem było uruchomienie skryptu w języku Python dostarczonego przez jednego z użytkowników GitHuba o nicku ptwz. Przeportował on do Pythona skrypt uprzednio napisany przez patrick99e99 dla systemu macOS.

Pierwszym etapem jest przygotowanie pliku dzwiękowego, musi on być w wersji mono. Konwersji stereo do mono można dokonać w systemie Linux Debian poleceniem:

ffmpeg -i input.wav -map_channel 0.0.0 mono_output.wav

Następnie generowanie tablicy zawierającej dane dla Arduino odbywa się po wejściu do katalogu ze skryptem i wydaniu polecenia

./python_wizard -f arduino mono_output.wav

Do prawidłowego działania skryptu potrzebna jest biblioteka scipy instalowana poleceniem:

apt-get install python-scipy

 

Odnośniki

  • py_talkie.zip – biblioteka generująca tablicę zawierającą dane z pliku wav
  • talkie.zip – przykładowy kod wraz z biblioteką
  • talkie.hex – wsad zawierający działający przykład