Przeszukaj forum
Pokazywanie wyników dla tagów 'TTS'.
Znaleziono 3 wyniki
-
Kolejny gadający sprzęt... ale może od początku. Zaczęło się od tego, że moje (dość prowizoryczne) konstrukcje odmówiły wreszcie współpracy i trzeba to zrobić porządnie. A konkretniej - suwmiarka (chyba trzeci kolejny eksperymentalny model) i metrówka (to była straszna prowizora). Niestety - te "porządne" egzemplarze poszły w ludzi i trzeba usiąść i zrobić to od początku. Postanowiłem zacząć od suwmiarki. Przede wszystkim - zgubiłem gdzieś klapkę od baterii, dodrukowana potrzebuje podkładania jakichś papierków żeby bateria chciała stykać - stwierdziłem więc, że będę suwmiarkę zasilać z akumulatora przystawki. W razie czego zawsze szybciej podładować akumulator niż zamawiać baterie w necie Druga sprawa to synteza mowy. O ile stary dobry syntezator Klatta działa, jednak warto to trochę uwspółcześnić. Początkowo chciałem zastosować microlenę, ale zastosowanie pełnego systemu TTS to czytania paru cyferek uznałem za overkill. Zrobiłem parę prób z nagraniem słów za pomocą RHVoice. Wyniki opiszę następnym razem razem z jakimś plikiemk dźwiękowym, ale próbna wersja gada całkiem nieźle. Jednocześnie chcę umożliwić użycie smartfona do syntezy mowy. Co prawda Android 14 rządzi się jakimiś swoimi dziwnymi prawami jeśli chodzi o wybór silnika TTS przez aplikację, ale użycie nawet syntezy Samsunga może dla osoby widzącej być wygodniejsze niż wsłuchiwanie się w rachityczny głośniczek przystawki. Postanowiłem zastosować XIAO S3 z uwagi na wielkość płytki (i wbudowaną ładowarkę). Kilka problemów jeszcze muszę rozwiązać, ale na początek zasilanie. Chcę to zrobić w ten sposób jak na schemacie poniżej. Diody D1 i D2 (akurat wyciągnięte z szuflady małe diody Zenera, ale mogą być normalne prostownicze) służą do obniżenia napięcia zasilania suwmiarki do ok. 1.5V. Diody D3 i D4 to powinny być Schottky z uwagi na niski spadek napięcia - akurat mam takie jednoamperowe, powinny wystarczyć. Układ służy do zasilania wzmacniacza MAX98357 albo z akumulatora, albo (jeśli podłączony jest kabel USB) z napięcia wejściowego. MAX ma dość szeroki zakres napięcia zasilania, działa zarówno z 3V (np. z dwóch ogniw AA) jak i za 5V z USB. Tyle wstępu - na razie prośba: jeśli ktoś mógłby sprawdzić czy ten pomysł z zasilaniem nie ma jakichś błędów będę wdzięczny. A dalej spróbuję opisać moje boje z syntezą mowy - może komuś się przyda? Na razie!
-
Cóż... jak się jakiś projekt skończyło to warto opisać Dziś na tapecie coś, co jest rozwinięciem jednego z poprzednich projektów - suwmiarki. Od razu na wstępie: ponieważ dokładniejszy opis jest na githubie TalkingCaliper - nie chcę duplikować treści, ale raczej ogólnie powiedzieć coś o tym projekcie. Urządzenie stanowi przystawkę do popularnej suwmiarki Vorel 15240. Jako jedyna chyba w tej klasie cenowej posiada wyjście danych, a jej dokładność jest wystarczająca do typowych zastosowań (pomijając oczywiście zegarmistrzostwo). Ponieważ niespecjalnie mi się chciało bawić się w projektowanie nowej obudowy - użyłem lekko zmodyfikowanego starego projektu.Dlatego też wygląd urządzenia praktycznie się nie zmienił - poza oczywiście zmienionym mocowaniem głośnika i dostosowaniem do płytki XIAO S3. Poprzednio użyłem syntezatora Klatta do generowania mowy. Co prawda to działało, nawet coś można było zmierzyć - ale nie byłem zadowolony z wyników. O ile osobie przyzwyczajonej do tego typu syntezatorów (np. eSpeaka) nie sprawia trudności zrozumienie tego co urządzenie tam marmoli pod nosem - o tyle ktoś kto nie używa tego typu syntezatorów może mieć pewne problemy. Dodatkowo - mały głośniczek i uproszczony wzmacniacz nie były super rozwiązaniem. Najpierw postanowiłem użyć Gadacza - projekt w sumie sprawdzony, a przede wszystkim przeznaczony do tego typu urządzeń. Tym razem mowa była dużo bardziej czytelna - ale miało to jedną wadę: program działałby wyłącznie dla języka polskiego, który raczej nie jest najpopularniejszym językiem na świecie. Trzeba było zupełnie innego podejścia. I tu pojawia się coś, co określane jest "syntezą korpusową" w najprostszej postaci. Po prostu program odtwarza nagrane uprzednio fragmenty wypowiedzi odpowiednio je łącząc. Co prawda nie zawsze takie połączenie brzmi naturalnie - no ale to jest suwmiarka a nie czytnik książek! Ponieważ założenia jako takie już miałem, trzeba było wybrać potrzebne podzespoły. Jako że ceny w porównaniu z okresem, kiedy robiłem pierwszą wersję mocno spadły, a poza tym pojawiły się nowe możliwości - postanowiłem zamiast ESP32 Lite użyć XIAO ESP32-S3. Oba moduły mają możliwość współpracy z akumulatorem, przy czym dzisiejsza cena XIAO jest w praktyce taka sama, jak wtedy Lite. Dodatkowo układ MAX98357A - wtedy niespecjalnie dostępny i kosztujący jakieś dziwne pieniądze - pojawił się w wersji chińskiej za mniej więcej 30% tej ceny. Tak więc główne podzespoły to: XIAO ESP32-S3 jako "mózg" urządzenia Płytka MAX98357A (czyli dekoder I2S z wyjściem bezpośrednio na głośnik) Głośnik miniaturowy 15x24x4 1W Akumulator (na razie wyjęty ze starego urządzenia). Niestety - wycofany z oferty a szkoda, bo wymiarami bardzo ładnie pasował do tego typu urządzeń. Początkowo chciałem zrobić piękną płytkę drukowaną, ale okazało się, że nie mam wszystkich potrzebnych elementów w wersji SMD. Tak więc na kawałku płytki uniwersalnej wylądowały dwie diody Schottky w wersji THT, a zamiast diod prostowniczych użytych do stabilizacji napięcia 1.5V zastosowałem małe diody Zenera, zalegające mi w szufladzie. Do tego użyłem jakiegoś nietypowego gniazda do podłączenia wzmacniacza - tak, że projektowanie czegokolwiek nadającego się do publikacji mijałoby się z celem. Układ jest dość prosty: a wygląda to tak: I tu drobna uwaga: zdjęcia pochodzą z roboczej wersji, docelowa różni się jedynie położeniem wyłącznika. Jeśli chodzi o program - użyłem jak poprzednio kodu do odczytu suwmiarki z projektu EspDRO. Do regulacji prędkości mowy zastosowałem bibliotekę Sonic, a konkretniej wersję lite dostosowaną do mikrokontrolerów. Możliwości programu: przełączanie między odczytem ciągłym (co sekundę), odczytem zmian i odczytem na żądanie (czyli po wciśnięciu przycisku); sygnalizacja braku sygnału z suwmiarki; w trybach "zmiany" i "na żądanie" jeśli przez dłuższy czas nie używamy suwmiarki prośba o wyłączenie urządzenia; automatyczne włączenie trybu ładowania po podłączeniu USB (program nic nie mówi i nic nie przypomina); odczyt stanu akumulatora; połączenie z dedykowaną aplikacją na Androidzie Preferencje programu (ustawiane przyciskiem) obejmują: zmianę prędkości (siedem możliwości) zmianę głośności (trzy możliwości) zmianę głosu (o ile jest więcej niż jeden) tryb rozdzielenia cyfr (brzmi mniej naturalnie ale może być czytelniejszy) tryb czytania małych wartości calowych (możliwość odczytu w mils dla wartości poniżej cala) Dodatkowo używając terminala serial można ustawić: kalibrację odczytu napięcia akumulatora; stałe czasowe dla przytrzymania i podwójnego kliknięcia; włączenie filtra dolnoprzepustowego (raczej rzadko potrzebne ale może się przydać w przypadku głośnika za mocno uwypuklającego wysokie tony); nazwę pod którą widziane będzie urządzenie przez BlueTooth (o ile jest to włączone w czasie kompilacji); tryb załączania BlueTooth (zawsze albo jeśli w czasie włączania zasilania przytrzymywany jest przycisk). W przypadku Androida kod języka TTS przesyłany jest przez program suwmiarki i nie musi on być taki sam, jak język interfejsu telefonu. W trakcie działania aplikacji wewnętrzny syntezator suwmiarki jest wyłączony poza trybem ustawień. A oto krótki filmik z działania suwmiarki. I to już chyba wszystko. Jeśli ktoś pokusiłby się o wykonanie takiego urządzenia proszę o kontakt - co prawda starałem się aby opis był w miarę kompletny, ale mogłem zapomnieć o jakimś ważnym szczególe. A... nie, to nie wszystko. Ponieważ ostatnio pojawiły się dodatkowe wymagania gdyby ktoś chciał skorzystać z promocji w Botlandzie niniejsze zdjęcie dowodzi że nie jestem wielbłądem!
-
- poniżej program w którym nie potrafię zmienić wyjścia espeak z i2s na głośność! - jak ściągamy mp3 z Url to schemat jest taki UrlStream -> copy-> EncodedAudioStream -> Volume -> I2S. - proszę o pomoc bo po powodzi klepki uciekły. /** * @file espeak-arduino-pl.ino * @author Phil Schatzmann * @brief Arduino C++ API - minimum example. The espeak-ng-data is stored on in * progmem with the arduino-posix-fs library and we output audio to I2S with the * help of the AudioTools library. * We use Polish instead of English! * @version 0.1 * @date 2022-10-27 * * @copyright Copyright (c) 2022 */ // UrlStream -copy-> EncodedAudioStream -> Volume -> I2S #include "AudioTools.h" // v 2.0.0 https://github.com/pschatzmann/arduino-audio-tools //#include "AudioLibs/AudioKit.h" // https://github.com/pschatzmann/arduino-audiokit #include "FileSystems.h" // https://github.com/pschatzmann/arduino-posix-fs #include "espeak.h" I2SStream i2s; // or replace with AudioKitStream for AudioKit VolumeStream volume(i2s); //VolumeMeter out; // 2 const bool load_english = false; ESpeak espeak(i2s, load_english); StreamCopy copier(volume, i2s); // StreamCopy copier(out, i2s); // 2 // -------------------------------------------------- setup --------------------------------- void setup() { Serial.begin(115200); file_systems::FSLogger.begin(file_systems::FSInfo, Serial); // ----------------------- tylko dla LilyGo T-embed ----------------------- pinMode(46, OUTPUT); digitalWrite(46, HIGH); // add foreign language configuration files espeak.add("/mem/data/pl_dict", espeak_ng_data_pl_dict,espeak_ng_data_pl_dict_len); espeak.add("/mem/data/lang/pl", espeak_ng_data_lang_zlw_pl, espeak_ng_data_lang_zlw_pl_len); // setup espeak espeak.begin(); espeak.setVoice("pl"); // setup output auto espeak_info = espeak.audioInfo(); // audio_info espeak_info = espeak_get_audio_info(); auto cfg = i2s.defaultConfig(); cfg.channels = espeak_info.channels; // 1 cfg.sample_rate = espeak_info.sample_rate; // 22050 cfg.bits_per_sample = espeak_info.bits_per_sample; // 16 i2s.begin(cfg); //espeak_set_audio_output(&i2s); // 3 // set initial volume volume.begin(cfg); // we need to provide the bits_per_sample and channels volume.setVolume(0.0); // } // --------------------------------------------------- loop ------------------------------- void loop() { espeak.say("Dzień dobry !"); delay(1000); espeak.say("Pogoda wspaniała "); delay(5000); copier.copy(); }