Aktualizacja: 2018-05-10

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:

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 - syntezator mowy

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

Wyślij komentarz