Forum: Digitale Signalverarbeitung / DSP Simple Spracherkennung selber programmieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tay F. (tayfe)


Bewertung
-2 lesenswert
nicht lesenswert
Da ich mich durch mein Studium aktuell viel mit digitaler Bild- und 
Signalverarbeitung beschäftige, habe ich mich gefragt, ob ich mit meinem 
Wissen wohl eine ganz simple Spracherkennung programmieren könnte. Bzw 
genauer gesagt wohl eher eine "Worterkennung". Dabei habe ich an 
folgendes gedacht:

Vielleicht kennt ja der ein oder andere hier noch das Spiel "Nintendogs" 
für den Nintendo DS. Bei diesem Spiel gibt es eine Spracherkennung die 
dafür sorgt, dass die Hunde auf den Spieler "hören". Dazu muss man 
diesen zuerst das Wort beibringen, indem man es immer und immer wieder 
ins Mikrofon hinein spricht. Mit der Zeit werden dann auch irgendwann 
die einzelnen Wörter erkannt und der Hund reagiert entsprechend.

Heutige Spracherkennung ist natürlich viel weiter, wenn man einen Blick 
auf Alexa, OK Google und so wirft. Aber mich würde viel mehr 
interessieren, ob ich eine "Worterkennung" programmieren könnte bzw. wie 
das gehen würde. Schließlich wird ja hinter dem DS-Spiel, bei dem das 
ganze ja zB auch noch offline funktionierte, kein neuronales Netz 
stecken wie es heute bei Amazon und Co der Fall ist.

Nun habe ich wie gesagt darüber selbst ein wenig nachgedacht mit meinem 
Vorlesungswissen und wollte mal ein paar erfahrenere Meinungen zu meiner 
Idee hören:

Ich stelle mir das grob so vor, dass ich ein Wort ganz oft immer und 
immer wieder in ein Mikrofon spreche und aufnehme, sodass ich mehrere 
Beispiele habe, wie dieses Wort klingen könnte.
Wenn ich nun ein Wort ins Mikrofon spreche, dann muss zuerst ja erst 
einmal der Teil gefunden werden, in dem ich wirklich spreche. Das sollte 
ja aber einfach automatisch (Schwellwert) zurecht zu schneiden sein. 
Dann korreliere ich dieses Signal mit allen zuvor aufgenommenen 
Signalen. Wenn dabei irgendwo eine Ähnlichkeit größer als ein bestimmter 
Schwellwert entsteht, gehe ich davon aus, dass ich eben dieses Wort 
ausgesprochen habe.

Hier frage ich mich nun, ob dieser Ansatz ausreichen würde, um ein Wort 
zu erkennen. Oder vllt gar, um verschiedene Wörter auseinander zu 
halten? Ich möchte keine Sätze sprechen, einfach immer nur ein einzelnes 
Wort wie eben bei "Nintendogs".
Oder müssen die Audiosignale zuvor gefiltert werden, um rauschen zu 
entfernen? Oder müssen vllt noch andere Kriterien zur Bestimmung 
herangezogen werden als nur eine Korrelation? Irgendwas auf der Ebene 
der Fouriertransformierten?

Über ein paar Anregungen würde ich mich freuen :)

von Nogoogleamazon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal SOPARE an:
https://github.com/bishoph/sopare

Damit hast du ein gutes Gerüst.

von Egon D. (egon_d)


Bewertung
2 lesenswert
nicht lesenswert
Tay F. schrieb:

> Hier frage ich mich nun, ob dieser Ansatz ausreichen
> würde, um ein Wort zu erkennen. Oder vllt gar, um
> verschiedene Wörter auseinander zu halten?

Vermutlich nicht.


> Oder müssen die Audiosignale zuvor gefiltert werden,
> um rauschen zu entfernen?

Echtes Rauschen lässt sich nicht filtern :)


> Oder müssen vllt noch andere Kriterien zur Bestimmung
> herangezogen werden als nur eine Korrelation? Irgendwas
> auf der Ebene der Fouriertransformierten?

Es wird wärmer.
Belies Dich mal über "Formanten". Auch der Wikipädie-
Artikel über Spracherkennung schien mir beim Überfliegen
recht brauchbar.

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Ich würde evtl. versuchen, Strategien aus dem OCR (Zeichenerkennung) zu 
verwenden: Segmentierung, Normalisierung, Kategorisierung ...

Diese Methoden quasi auf die optische Darstellung von 
Amplituden-Verläufen und/oder Spekten anwenden

: Bearbeitet durch User
von Hotte (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Die Methoden zur Spracherkennung sind eigentlich längst Gegenstand 
solcher Vorlesungen in Signalverarbeitung. Hattet ihr dazu nichts?

von Clemens N. (cleemens)


Bewertung
1 lesenswert
nicht lesenswert
Schau dir z.B. mal diese Vorlesung an (also das Skript das es auf der 
Website gibt):
https://www.ei.ruhr-uni-bochum.de/studium/lehrveranstaltungen/581/

Die Leute in der Vorlesung haben selber auch eine einfache 
Spracherkennung als Projekt entwickelt, geht also durchaus nebenher. 
Einfach ist aber natürlich anders.

von rbx (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also die Links hier habe ich jetzt nicht gesucht (wollte nach 
brauchbaren Haskell-Bibs schauen)..
Trotzdem interessant:

https://hacks.mozilla.org/2018/09/speech-recognition-deepspeech/
https://www.linux-magazin.de/news/deep-speech-0-2-0-transkribiert-sprache-in-echtzeit/

Youtube-Video "09: One Stage DP, Gaußverteilung, Voronoiregionen, K-Nächste Nachbar" (dauert 1 Stunde 21)

Anregung:
(nur so zum Spaß/Übung/Ergänzung)

- Sampleerkennungsspiel programmieren. Wer erkennt ist egal (Spieler, 
Compi) und viele Samples, min. über 300, viele vielleicht ähnlich.)

- Voice Synth programmieren
- wie mit Synth nachsprechen? Mama, Papa, Opa, Oma, Ei, Hut usw..?

von Christoph db1uq K. (christoph_kessler)


Bewertung
0 lesenswert
nicht lesenswert
Im neuen c't Sonderheft Raspi-Projekte steht auch ein Artikel
"Sprach-Assistent ohne Cloud" ab Seite 34.
https://www.heise.de/newsticker/meldung/c-t-Projekte-Smart-Home-mit-Raspi-ESP-und-Co-4468676.html?hg=1&hgi=0&hgf=false

Ich habe das Heft zuhause, weiß also nicht, ob das identisch mit einem 
früheren Artikel ist:
https://www.heise.de/ratgeber/Snips-Raspi-Sprachassistent-ganz-ohne-Cloud-4415247.html
also mal nach "Snips" suchen.
https://www.home-assistant.io/components/snips/

Elektor hat es auch beschrieben:
https://www.elektormagazine.de/news/review-snips-spracherkennung-auf-dem-raspberry-pi

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Bewertung
0 lesenswert
nicht lesenswert
Hab nachgeschaut, es scheint derselbe Artikel zu sein. Es ist nicht 
genau das gesuchte, sondern ein fertiges Projekt mit Hard- und Software, 
keine selbsterstellten Algorithmen. Vielleicht läßt sich die Hardware 
aber benutzen. Weitere Info zum Artikel hier:
http://www.ct.de/w92c
Das Mikrofonarray zum Aufstecken auf den Raspi, 8 MEMS-Mikrofone und ein 
FPGA für $55.00 könnte interessant sein, wenn es unabhängig vom 
Hersteller verwendbar ist.

: Bearbeitet durch User
von Elbi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christoph db1uq K. schrieb:
> Hab nachgeschaut, es scheint derselbe Artikel zu sein. Es ist nicht
> genau das gesuchte, sondern ein fertiges Projekt mit Hard- und Software,
> keine selbsterstellten Algorithmen

Würde mich sehr interessieren, was da drinsteckt. Also was so eine 
Erkennung kann. Wie genau muss ein Wort ausgesprochen werden, damit es 
erkannt wird. Geht jedes Tempo? Jede Tonhöhe? Versteht das Dingens auch 
Sächsisch?

von Stefan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du könntest es mit einem VS1053 versuchen.
Und dann noch einen µC dann sollte es gehen.
Gibt ja im Netz auch fertige Module die das
schon alles haben. Einfach mal danach suchen.

von Weg mit dem Troll ! Aber subito (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Allenfalls einfach mal den Code von Alexa oder dergleich herunterladen, 
studieren und testen.

von Bernd K. (prof7bit)


Bewertung
0 lesenswert
nicht lesenswert
Weg mit dem Troll ! Aber subito schrieb:
> Allenfalls einfach mal den Code von Alexa oder dergleich
> herunterladen,
> studieren und testen.

Echt jetzt? Alexa kann man herunterladen (noch dazu im Quelltext) und 
offline betreiben? Wie groß muss der Rechner sein? Wie groß sind die 
Datenbanken?

von Weg mit dem Troll ! Aber subito (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Naja, wenn du auf den deutschsprachigen Sprachraum mit seinen Dialekten 
eingrenzen kannst wird die Datenbank kleiner. Und wenn "einfach" 
wirklich "einfach" bedeutet, im Sinne von "Los", "Halt", "Jetzt", "Stop" 
, genuegt noch weniger.
Allenfalls ist das Selberherausfinden der kleinere Aufwand wie Alexa.
Der einfachste Ansatz ist den Benutzer vorsprechen zu lassen.

von ... (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
In der S.B.Z. hat man Spracherkennug per Histogramm der
Nulldurchgaenge des Signals benutzt.
Kann also nicht so schwer sein.

> Alexa kann man herunterladen

Ja sicher. Nur kennst du den Befehl nicht.
Versuchs doch mal mit: "Alexa halts Maul".
Vielleicht gibt sie dann wertvolle Tipps.

von Stefan (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Und schau dir mal das an für die
Programmierung. DTW algorithm

von Xilinx Entwickler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Weg mit dem Troll ! Aber subito schrieb:
> Los", "Stop"
Die beiden sollten noch gut zu unterscheiden sein, aber viele Worte 
konträrer Bedeutung liegen schon recht nahe beieinander, denke ich. Für 
sicherheitskritische Anwendungen nicht nutzbar.

... schrieb:
> In der S.B.Z. hat man Spracherkennug per Histogramm der
> Nulldurchgaenge des Signals benutzt.
Das fände ich spontan zu simpel.

von ~Mercedes~ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@...,

Was ist denn eigendlich die S.B.Z?
Sowas wie die A.B.Z?
oder die F.B.Z?
oder die E.B.Z? ;--p


mfg

von Manni (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Tay F. schrieb:
> Da ich mich durch mein Studium aktuell viel mit digitaler Bild- und
> Signalverarbeitung beschäftige, habe ich mich gefragt, ob ich mit meinem
> Wissen wohl eine ganz simple Spracherkennung programmieren könnte.

Da kannst du wohl nur selber wissen, was du da gelernt hast. Da du aber 
nur einen Beitrag hier geschrieben hast, scheinen dich die bisherigen 
Antworten abgeschreckt zu haben.

Du bist also entweder ein Troll oder hast keine Ausdauer oder gar 
Inspiration, technisch komplexe Themen anzugehen!

von Jürgen S. (engineer) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Weg mit dem Troll ! Aber subito schrieb:
> Der einfachste Ansatz ist den Benutzer vorsprechen zu lassen.
Wenn das machbar ist, ja.

Tay F. schrieb:
> Heutige Spracherkennung ist natürlich viel weiter
Man muss unterscheiden, ob man konkrete Worte einer konkreten Person 
sucht und damit sehr konzentriert matchen kann, oder ob man den Sinn der 
Sprache unbekannter Personen mit allenmöglichen Worten erkennen möchte.

Im Fall 1 reicht es in der Tat, die Worte zu hinterlegen und einfach zu 
matchen. Habe ich schon gemacht. Im Fall 2 muss man die Gemeinsamkeiten 
der Sprache unterschiedlicher Menschen finden und den Rohdatenstrom 
normieren. Dazu ist es auch nötig, das zu tun:

> Ich stelle mir das grob so vor, dass ich ein Wort ganz oft immer und
> immer wieder in ein Mikrofon spreche und aufnehme, sodass ich mehrere
> Beispiele habe, wie dieses Wort klingen könnte.

Google et al haben das bereits getan und die Sprache in eindeutige Laute 
zerlegt, was es auch gestattet, den Effekt von Dialekten und 
landestypischen Betonungen zu ignorieren und sich auf die markanten 
Frequenzprofile zu stützen, um Worte von einander abzugrenzen. Dazu gibt 
es von unterschiedlicher Seite diverse Softwarepakete.

Nichtsdestotrotz braucht man auch ein gutes Eingangssignal, das spektral 
normiert wird, mit Richtungstoleranz /-fokussierung und 
Störsignalunterdrückung, etc.

Tay F. schrieb:
> Wenn ich nun ein Wort ins Mikrofon spreche, dann muss zuerst ja erst
> einmal der Teil gefunden werden, in dem ich wirklich spreche.

Nö. Wenn man permanent sucht und korelliert, kommt ein match automatisch 
heraus, wenn das Profil gut genug ist. Das drop level liegt dann eher 
auf dem Ausgang des Korrelators.

von Tay F. (tayfe)


Bewertung
0 lesenswert
nicht lesenswert
Danke erst einmal für die vielen Antworten, es war tatsächlich einiges 
hilfreiches dabei, worauf ich nochmal näher eingehen möchte.

Manni schrieb:
> Da kannst du wohl nur selber wissen, was du da gelernt hast. Da du aber
> nur einen Beitrag hier geschrieben hast, scheinen dich die bisherigen
> Antworten abgeschreckt zu haben.
>
> Du bist also entweder ein Troll oder hast keine Ausdauer oder gar
> Inspiration, technisch komplexe Themen anzugehen!

Ja es tut mir auch tatsächlich etwas leid, dass ich nicht geantwortet 
habe. Da ich mich nebenbei noch an anderen Projekten versucht habe, ist 
mir dieses Thema tatsächlich etwas untergegangen. Trotzdem habe ich es 
nicht ganz vergessen und habe nach wie vor vor, es einmal versuchen zu 
wollen!

Egon D. schrieb:
> Es wird wärmer.
> Belies Dich mal über "Formanten". Auch der Wikipädie-
> Artikel über Spracherkennung schien mir beim Überfliegen
> recht brauchbar.

Danke für den Tipp! Der Artikel ist in der Tat sehr hilfreich. Nebe 
groben Erklärungen für einen ersten Überblick fallen auch ein paar 
Stichwörter, nach denen zu googeln vermutlich ein guter zweiter Schritt 
ist.

Clemens N. schrieb:
> Schau dir z.B. mal diese Vorlesung an (also das Skript das es auf der
> Website gibt):
> https://www.ei.ruhr-uni-bochum.de/studium/lehrveranstaltungen/581/
>
> Die Leute in der Vorlesung haben selber auch eine einfache
> Spracherkennung als Projekt entwickelt, geht also durchaus nebenher.
> Einfach ist aber natürlich anders.

Ja ohne lesen gehts wohl nicht, auch wenn mir diese 160 Seiten wohl doch 
zu viel sind. Aber auch hier gibts wieder ein paar Schlagwörter. Leider 
sind die Übungen ja scheinbar nicht öffentlich zugänglich, die hätten 
mich ja doch noch sehr interessiert.

Stefan schrieb:
> Und schau dir mal das an für die
> Programmierung. DTW algorithm

Danke fürs nächste Schlagwort. Wikipedia erwähnt auch direkt, dass 
dieser Algorithmus in der Spracherkennung genutzt wird.

Jürgen S. schrieb:
> Man muss unterscheiden, ob man konkrete Worte einer konkreten Person
> sucht und damit sehr konzentriert matchen kann, oder ob man den Sinn der
> Sprache unbekannter Personen mit allenmöglichen Worten erkennen möchte.
>
> Im Fall 1 reicht es in der Tat, die Worte zu hinterlegen und einfach zu
> matchen. Habe ich schon gemacht. Im Fall 2 muss man die Gemeinsamkeiten
> der Sprache unterschiedlicher Menschen finden und den Rohdatenstrom
> normieren. Dazu ist es auch nötig, das zu tun:
> [...]
> Nö. Wenn man permanent sucht und korelliert, kommt ein match automatisch
> heraus, wenn das Profil gut genug ist. Das drop level liegt dann eher
> auf dem Ausgang des Korrelators.

In meinem Fall soll es zu Beginn tatsächlich erst einmal um deinen 
zuerst genannten Fall gehen. Die Spracherkennung sollte erstmal nur für 
wenige Wörter gelten, die nur von mir gesprochen werden, alles weitere 
kann nach Lust, Laune und Erfolg danach kommen.
Der nächst schwierigere Schritt könnte ja schon Raumklang durch 
verschiedene Entfernungen zum Mikro sein. Aber auch so weit möchte ich 
eigentlich noch gar nicht denken sondern lieber ganz kleine Schritte.
Und stimmt natürlich, permanente Korrelation reicht aus, danke dafür! :)

Ja dann wie gesagt noch einmal Danke für die vielen Schlagwörter, 
Anregungen und Ideen! Ich werde mich jetzt, wo die kälteren Tage wieder 
kommen, hoffentlich mal ein wenig mit dem Projekt auseinander setzen und 
erste kleine Erfolge erreichen. Da melde ich mich dann gerne auch 
nochmal zu :)

von Manfred Scheer (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
..Alexa läuft auf den Supercomputern der NSA.....Speicherbedarf ca. 512 
Fantastillionen Terrabyte...

von Helwein V. (forgoden)


Bewertung
-1 lesenswert
nicht lesenswert
"Alexa, gibt es ein Open Source Code von Alexa?"

"Alexa, werde ich von NSA überwacht?"

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
> In meinem Fall soll es zu Beginn tatsächlich erst einmal um deinen
> zuerst genannten Fall gehen. Die Spracherkennung sollte erstmal nur für
> wenige Wörter gelten, die nur von mir gesprochen werden, alles weitere
> kann nach Lust, Laune und Erfolg danach kommen.

Also "einfache Spracherkennung", genau genommen die Erkennung von 
Kommandos, bestehend aus einem Wort, funktioniert tatsächlich ähnlich 
OCR:

- der Soundschnipsel wird auf eine Lautstärke normiert
- das Soundschnipsel wird auf eine bestimmte Länge normiert
- der Soundschnipsel wird in einen bestimmten Frequenzbereich normiert

Damit wird das Gesprochene zunächst maximal Sprecherunabhängig. Am 
Schluss wird das Soundfile in z.B. 10 gleich lange Abschnitte geteilt 
und darin jeweils einige wenige Frequenzbänder (z.B. 3 oder 4) 
heraussepariert u. deren relative Amplitude ermittelt ...

Daraus werden Koeffizienten gewonnen, die man gegen eine Datenbank 
matcht. Das Ergebnis, was am dichtesten rankommt, ist es dann, sofern 
ein Mindest-Schwellwert erreicht wird. So kann man relativ sicher 
unterscheiden, ob das Kommando z.B. mit M, F, S, A, U oder T anfängt 
oder aufhört. Allerdings auch nicht viel mehr - mit den ausgeklügelten 
KI-Verfahren für eine "richtige" Spracherkennung hat das natürlich nicht 
das Geringste zu tun, erfüllt aber seinen (beschränkten) Zweck.

Eventuell könnte man tatsächlich eine OCR-Engine einsetzen, z.B. das 
freie Tesseract. Man zeichnet mittels der oben genannten Parameter 
irgendwelche Objekte und lässt die von der OCR-Engine analysieren ... 
interessantes Experiment!

Allerdings gibt es bereits für kleines Geld ferige "speech recognition 
chips", was wohl komplette DSP- bzw. Mikrocontrollersysteme mit 
entsprechend vorinstallierter Software sein dürften, die die Anwendung 
stark vereinfachen. Für den seltenen oder gar einmaligen Einsatz ist 
aber wahrscheinlich das Studium der Unterlagen ein viel zu großer 
Aufwand.

: Bearbeitet durch User
von Jürgen S. (engineer) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Frank E. schrieb:
> - der Soundschnipsel wird auf eine Lautstärke normiert
> - das Soundschnipsel wird auf eine bestimmte Länge normiert
> - der Soundschnipsel wird in einen bestimmten Frequenzbereich normiert
>
> Damit wird das Gesprochene zunächst maximal Sprecherunabhängig.

Das wäre schön. Leider spricht jeder andere Dialekte und hat auch bei 
ein und derselben Aussprache andere Formanten und damit einen 
abweichenden 3D-Verlauf der Frequenzkonstellation über die Zeit. Wenn 
aber mit der SV soweit ist, dass man dort die Muster herausfiltern kann, 
ist das von dir beschriebene gleich nebenbei miterledigt:

Die Lautstärke ist das geringste Problem, weil sie bei der Betrachtung 
im Frequenzbereich komplett unter den Tisch fällt. Aus demselben Grund 
sind auch die Länge und der Frequenzbereich indirekt uninteressant.

Was man aber machen muss, ist das Mikrofonsignal überhaupt erst einmal 
so zu gewinnen und zu konditionieren, dass ein verarbeitbares digitales 
Signal herauskommt. Da geht es mit Position, Charakteristik und 
Amplitudenregelung los, um ein möglichst hoch aufgelöstes Signal 
übertragen zu können. Die internetbasierten Systeme z.B. vorverarbeiten 
das Signal passend für den MPG-Kompressor.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.