ESP32-Woorm Deusche Wörter vorlesen

Guten Tag, habe folgendes Problem, Ich bekomme die Richtigen Wörter auf dem Display angezeigt das funzt schon mal ganz gut, nun wollte ich mir die Wörter noch per Sprache aus geben lassen.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <pgmspace.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 128
#define i2c_Address 0x3C
#define BUZZER_PIN 26

Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
Adafruit_SH1107 display = Adafruit_SH1107(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);

float lastTotalMag = 0;
float threshold = 2.5; 
char current_word_buffer[25] = "BEREIT"; 

const char* word_table[] = {
  "ANWESEND", "GEIST", "HILFE", "GEFAHR", "LICHT", 
  "DUNKEL", "KALT", "WARM", "HOERE", "FOLGE",
  "RAUS", "BLEIB", "HIER", "DORT", "KIND",
  "FRAU", "MANN", "ALT", "JUNG", "NAME",
  "ZEIT", "HEUTE", "NACHT", "STIMME", "LACHEN",
  "WEINEN", "ANGST", "BOESE", "GUT", "TOT",
  "LEBEN", "GRAB", "KELLER", "DACH", "TUER",
  "FENSTER", "VERLASSEN", "VERSTECKT", "SUCHE", "GEFUNDEN",
  "ENERGIE", "PORTAL", "SCHMERZ", "LIEBE", "WARTEN",
  "JETZT", "NIEMALS", "KOMME", "GEHE", "FRAGE"
};
usw 
im Loop hab ich 

if (delta > threshold) {
    int index = abs((int)(totalMag * 100)) % word_count;
    snprintf(current_word_buffer, 25, "%s", word_table[index]);
    toneOK();    
  }

display.setTextSize(2);
  int16_t x1, y1; uint16_t w, h;
  display.getTextBounds(current_word_buffer, 0, 0, &x1, &y1, &w, &h);
  display.setCursor((SCREEN_WIDTH - w) / 2, 55); 
  display.print(current_word_buffer);

  int barWidth = map((int)(delta * 10), 0, 100, 0, 124);
  display.drawRect(0, 110, 128, 15, SH110X_WHITE);
  display.fillRect(2, 112, barWidth, 11, SH110X_WHITE);
  display.display(); 

ich finde nix was mir die Wörter die über

display.print(current_word_buffer);

abgezeigt werden auch auf Deutsch ausgibt hat wer von euch eine Idee wie ich das machen könnte?

mfg amsel

Die Adafruit GFX hat keine Umlaute, die U8G2 schon.

Kannst du mir sagen wie die Library heist dazu und wie ich das am besten einbinde.
Ah ok die ist für das Display da, das brauch ich erst mal nicht das display zeigt ja die richtigen Wörter schon an mir gehts ja um die Sprachausgabe über ein PAM8403, so das er mir das Wort das auf dem Display erscheint auch über den Lautsprecher ausgibt.

mfg amsel

Die U8G2 unterstützt auch dein OLED

So wie du die Adafruit gefunden hast, über Bibliotheken Verwalten

dann habe dass falsch verstanden, wie willst das ausgeben, über Sprechenden ESP habe noch nichts gelesen.

Es gibt ja genuch Librarys dafür leider alles nur auf Englisch oder andere Sprachen die Wörter stehn ja oben und sind so auch im Code drin.
Ich suche ja schon eine Ganze weile finde nix was auf Deutsch die Sprache macht.

mfg amsel

Ist ja nur ein Verstärker.

Hast du mal Beispiele?

Hab es mit den Liberys

Talki, TTS-Master, ESP8266Sam und Audio versucht

nur das TTS-Master lässt was hören die können leider alle nur Englisch und keine Deutschen Wörter.

#include <TTS.h>

// Media pins
#define PWM D2

TTS text2speech(PWM);  // default is digital pin 10

void setup() { 
  pinMode(LED_BUILTIN, OUTPUT); 
}

void loop() {
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));

  text2speech.setPitch(6);
  text2speech.sayText("Hello  master! How are you doin?");
  delay(500); 

  text2speech.setPitch(1);
  text2speech.sayText("I am fine, thankyou."); 

  delay(1000);
}

das bsp. hat schon mal soweit gefunzt nur sowie ich das

current_word_buffer

mir ausgeben will kommt zwar was aber nicht verständlich anderst sieht es aus bei englischen wörtern.

Bei der Libery Talkie hab ich zwar gefunden das man das Wörterbuch sich selber anlegen kann das Programm versuch ich zum alufen zubekommen (XP) .

mfg amsel

Wenn eine Library nicht für eine bestimmte Sprache vorbereitet ist, wird es u.U. aufwendig, ihr die korrekten Phoneme beizubringen ...

Falls Du nichts Brauchbares findest, bleiben folgende Möglichkeiten für einen bekannten, begrenzten Wortschatz (wie er bei Dir vorliegt):

  • Wenn Du mit einem englisch/amerikanischen Akzent leben kannst:
    • Erstelle eine Tabelle mit zwei Einträgen pro Wort, das deutsche Wort und eine lautsprachliche "Übersetzung" ins Englische. "ANWESEND", "UNWAYSEND" oder "GEIST", "GUYST" etc. :wink: Wie seinerzeit J.F. Kennedy „Ish bin ein Bearleener“. ....
  • Für eine bessere Sprachqualität: Setze einen DFRobot mini player zum Abspielen von Sound-Dateien, die auf einer SD-Karte gespeichert sind, ein. Erzeuge je Wort ein eigenes Sound-File, speichere diese Datei im Verzeichnis MP3 auf die SD-Karte (für z.B. 100 Worte mit der Benennung 0001.mp3 ... 0100.mp3) und spiele die entsprechende Datei ab.

Näheres zum Mini Player siehe z.B. hier https://wolles-elektronikkiste.de/dfplayer-mini-ansteuerung-mit-dem-arduino
Häufig sind die Versandkosten des Mini Players höher als der Hardware-Preis ...

Ich schaue mir bei Gelegenheit mal an, was frei verfügbare Libraries so hergeben ...

Viel Erfolg!
ec2021

P.S.: Beim ESP32 gibt es natürlich noch die Möglichkeit, über ein WLAN die entsprechende Sprachsynthese im Internet abzurufen. Damit kann man quasi beliebige Ausdrücke online per in Sprachausgaben umsetzen lassen ...! Kommt das infrage?

Es sollen am Ende über 1000 Wörter sein mit 50 bin ich gerade am Testen das klapt ja auch auf dem Display ganz gut. Ich hab was gefunden brauche aber erst mal größern ESP32 mit mehr Speicher damit ich den Code mal Testen kann oder ich nehm gleich den Arduino den ich noch habe.

mfg amsel

Siehe den Hinweis auf die online-Sprachumsetzung ... Das ist das flexibelste.

Welchen ESP32 hast Du im Einsatz und welchen Arduino willst Du verwenden? Ein ESP32 verfügt bereits über einen außerordentlich großen Speicher im Vergleich mit den üblichen Arduino Controllern ...

Vielleicht hilft Dir auch dieser Thread (oder der Kontakt mit einem der dortigen Mitglieder) weiter

https://forum.arduino.cc/t/spracherzeugung-mit-dem-arduino/1294358?page=3

Dort werden auch Talkie und connecttospeech() angesprochen!
https://forum.arduino.cc/t/spracherzeugung-mit-dem-arduino/1294358/41

P.S.: Die Worttabelle sollte nur den Flash-Speicher belasten, da sie als const deklariert ist und damit im rodata (Read Only Data) Segment abgelegt wird. Für Daten, die man während des Programmlaufs schreiben, lesen und ändern möchte, gibt es beim ESP32 die Library "Preferences.h", siehe hier https://arduinoblog.de/esp32-preferences-daten-in-den-flash-speicher-schreiben-und-lesen/

Talkie ist dann bestimmt nicht das, was Du suchst ...

Um eigene Wörterbücher anzulegen, musst Du dort

  • das Wort mit z.B. Audacity aufnehmen
  • die Datei in eine spezielles Konverter-Tool laden
  • die sich dann ergebenden Daten in den Sketch aufnehmen

Für das englische Wort "Time" sieht das schon so aus

extern const uint8_t spc_TIME[]      PROGMEM = {0x0E,0x28,0xAC,0x2D,0x01,0x5D,0xB6,0x0D,0x33,0xF3,0x54,0xB3,0x60,0xBA,0x8C,0x54,0x5C,0xCD,0x2D,0xD4,0x32,0x73,0x0F,0x8E,0x34,0x33,0xCB,0x4A,0x25,0xD4,0x25,0x83,0x2C,0x2B,0xD5,0x50,0x97,0x08,0x32,0xEC,0xD4,0xDC,0x4C,0x33,0xC8,0x70,0x73,0x0F,0x33,0xCD,0x20,0xC3,0xCB,0x43,0xDD,0x3C,0xCD,0x8C,0x20,0x77,0x89,0xF4,0x94,0xB2,0xE2,0xE2,0x35,0x22,0x5D,0xD6,0x4A,0x8A,0x96,0xCC,0x36,0x25,0x2D,0xC9,0x9A,0x7B,0xC2,0x18,0x87,0x24,0x4B,0x1C,0xC9,0x50,0x19,0x92,0x2C,0x71,0x34,0x4B,0x45,0x8A,0x8B,0xC4,0x96,0xB6,0x5A,0x29,0x2A,0x92,0x5A,0xCA,0x53,0x96,0x20,0x05,0x09,0xF5,0x92,0x5D,0xBC,0xE8,0x58,0x4A,0xDD,0xAE,0x73,0xBD,0x65,0x4B,0x8D,0x78,0xCA,0x2B,0x4E,0xD8,0xD9,0xED,0x22,0x20,0x06,0x75,0x00,0x00,0x80,0xFF,0x07};

Der Vorgang wird für eigenes Vokabular in diesem YouTube Video erläutert https://www.youtube.com/watch?v=O_yl5kcRO5w
das bei github verlinkt wird: https://github.com/ArminJo/Talkie

Talkie ist also kein online "Text" zu "Sprache" sondern die Daten für die Sprachausgabe werden offline vorbereitet und dann abgerufen. Mit dem MP3-Player spart man sich diesen Schritt und den zusätzlich erforderlichen Speicherverbrauch (da der Sound von SD-Karte kommt). Außerdem ist die Sprachqualität (je nach Sprecher/Sprecherin :wink: ) deutlich besser.

Kannst Du mal hier drauf schauen:

Wenn ich das richtig sehe, gibt es da ein deutsches Sprachmodell....

So noch ein (vorläufig) letzter Tipp:

Spricht etwas gegen den Einsatz eines Raspberry Pi Zero?

Damit hast Du ein "richtiges" Betriebssystem (Linux), ausreichend Speicherplatz und kannst dort ziemlich einfach mittels Python Ausgaben auf ein Display geben und eine deutsche Sprachausgabe mittels der Python Library pyttsx3 erzeugen ...

Python ist nicht schwerer handzuhaben als C++, eher einfacher ...

Klingt interessant, besonders weil es wohl auf Textanalyse und Sound-Synthese basiert, also quasi jeden beliebigen Text umsetzt (was allerdings eine Mischung aus deutsch und englischen Begriffen einschränkt), die Anwendung selbst erscheint mir jedoch eher etwas für erfahrene Anwender zu sein ...

This component does not provide any board-specific audio support. The TTS engine generates 16bit/16KHz samples, and leaves it to the user to direct those to the correct audio device.

There are two options on how to bundle the resource files onto flash. The default, and arguably the easiest, is to embed the resource files directly into the application binary. The one downside to this approach is that application size grows significantly, and may present an issue with firmware upgrades. You will definitely use a much larger application partition than usual. Alternatively, the resource files can be placed in dedicated flash partitions and accessed from there instead. The advantage with this approach is that the language resources are no longer directly coupled to the application binary. Which approach is best will depend on the specific project circumstances.

Aber warum nicht ... No challenge, no fun :wink: ...

Gruß
ec2021

P.S.: Siehe hier
https://forum.arduino.cc/t/spracherzeugung-mit-dem-arduino/1294358/41
Das erscheint mir deutlich einfacher, setzt aber anscheinend eine ständige Internet-Verbindung voraus...

Vielleicht kann @agmue hier seine Erfahrungen mit connecttospeech() einbringen?

Das ist das, was die ESP-IDF als Bestandteil hat.
Ich bin über das Chinesische Modell, was als Referenz herhält, drüber gestolpert.

Ist eben vieles einfacher, wenn man Englisch oder Chinesisch spricht ... :winking_face_with_tongue:

DFRobot Gravity TTS-Modul, Text zu Sprachausgabe, I2C/UART, integrierter Lautspr... - kaufen bei BerryBase

Danke für eure Antworten. Ich will das Gerät OHNE Internet usw nutzen weil unterwegs gibts kein Wlan und Handy ist im Flugmodus. Ich werde mal schaun wie ich das umgesetzt bekomme.

THX

mfg amsel

Falls Du Dich für die (einfachste) Variante mit dem MP3-Player entscheiden solltest, schau Dir mal diese Seite an

https://www.thorsten-voice.de/ausprobieren/

Dort kannst Du die einzelnen Texte eingeben, die Sprachausgabe anhören und die Datei als wav-Datei herunterladen. So brauchst Du sie nicht einmal selbst zu sprechen ... Aufwendiger als Sprachsynthese, aber eine sichere Lösung ... Alles ohne Registrierung oder Kosten ...

Viel Erfolg!
ec2021