Problembeschreibung
Ich möchte die Spracherkennung als Teil eines Hardwareprojekts verwenden, mit dem ich mich selbstständig machen möchte (ich verwende kleine Geräte mit geringem Stromverbrauch und geringer Geschwindigkeit wie Arduino's und Raspberry Pi's, Kinects usw., auf denen kein herkömmlicher Computer läuft) ein OS ist involviert (also ein geschlossenes / eigenständiges Projekt).
Die Spracherkennung kann je nach gewünschter Komplexität sehr kompliziert sein. Ich habe, wie ich glaube, vergleichsweise einfache Anforderungen. Ich möchte nur meine eigene Stimme erkennen und ich habe ein kleines Wörterbuch mit etwa 20 Wörtern, die ich gerne wiedererkennen würde. Daher benötige ich keine komplexen Spracherkennungs- und Spracherkennungsbibliotheken oder die exzellente Software von Drittanbietern, die ich über Internet-Suchmaschinen finde (es gibt keinen Mangel an diesen!). Ich glaube, meine Anforderungen sind "einfach genug" (im Rahmen der Vernunft), dass ich meine eigene Lösung codieren kann. Ich frage mich, ob jemand seinen eigenen Prozess so geschrieben hat und ob meine Methode massiv fehlerhaft ist? Gibt es einen besseren Weg, dies zu tun, ohne ein hohes Maß an Mathematik zu erfordern oder einen komplexen Algorithmus schreiben zu müssen? Das ist die Lösung, die ich mir unten ausgedacht habe.
Lösungsbeschreibung
Ich werde dies in C schreiben, aber ich möchte einen sprachunabhängigen Prozess diskutieren, der sich auf den Prozess selbst konzentriert. Ignorieren wir das also, wenn wir können.
1. Ich werde mein Wörterbuch vorab aufzeichnen, damit es mit den gesprochenen Wörtern übereinstimmt. Wir können uns vorstellen, dass ich 20 Aufzeichnungen meiner 20 verschiedenen Wörter oder vielleicht kurze Sätze oder Sätze von zwei oder drei Wörtern habe. Ich glaube, dies macht den Vergleich zweier Aufnahmedateien einfacher als die eigentliche Konvertierung des Audios in Text und den Vergleich zweier Zeichenfolgen.
2. Ein Mikrofon ist an mein Hardwaregerät angeschlossen, auf dem mein Code ausgeführt wird. [1] Der Code entnimmt kontinuierlich Abtastwerte mit fester Länge, beispielsweise mit einer Länge von 10 ms, und speichert beispielsweise 10 aufeinanderfolgende Abtastwerte in einem Umlaufprotokollierungsstil. [2] (Ich erfinde diese Figuren aus dem Kopf, so dass sie nur Beispiele sind, um den Prozess zu beschreiben).
[1] Dies würde wahrscheinlich über ein Bandpassfilter und einen Operationsverstärker erfolgen, ebenso wie die Wörterbuchaufnahmen, um die gespeicherten und gesammelten Audio-Samples kleiner zu halten.
[2] Ich weiß nicht genau, wie ich ein Sample nehmen soll. Ich muss jedoch eine Methode ausarbeiten, bei der ich eine numerische Zahl (Integer / Float / Double) erzeuge, die das Audio eines 10-ms-Samples darstellt (möglicherweise ein CRC-Wert) oder MD5-Summe usw. des Audio-Samples) oder ein Strom von Zahlen (ein Strom von Audio-Ablesungen von Frequenzen vielleicht). Letztendlich wird ein "Beispiel" eine numerische Zahl oder Zahlen sein. Dieser Teil wird viel mehr mit Hardware zu tun haben, sodass er hier nicht wirklich zur Diskussion steht.
3 . Der Code prüft, ob er 10 aufeinanderfolgende Samples gespeichert hat, und sucht nach einem Lautstärkeanstieg, um anzuzeigen, dass ein Wort oder eine Phrase gesprochen wird (eine Pause von der Stille). Anschließend erhöht sich die Anzahl der aufeinanderfolgenden Samples, um beispielsweise 500 Samples zu sammeln. Dies würde bedeuten, dass 5 Sekunden Audio in 10-ms-Samples erfasst werden.
Es sind diese Samples oder "Slices", die zwischen dem gespeicherten Sound und dem aufgenommenen Sound verglichen werden. Wenn ein ausreichend hoher Prozentsatz der erfassten Proben mit den entsprechenden gespeicherten übereinstimmt, nimmt der Code an, dass es sich um dasselbe Wort handelt.
The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence
Incoming Sample No | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value | | | |20|27|38|46|16|59|77|200|78|
4. Sobald der Code einen vollständigen Sample-Stream gesammelt hat, schneidet er die leeren Samples zu Beginn ab, um die folgende Audioaufnahme zu erstellen. Es könnte auch das Sample-Set einige Stellen vor- und zurückbewegen, um eine bessere Ausrichtung mit dem gespeicherten Sample zu erzielen.
Dies erzeugt ein Beispielset wie das folgende:
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming Sample No |-1| 1| 2| 3| 4| 5| 6| 7| 8|
Incoming Sample Value |20|27|38|46|16|59|81|201|78|
5. Meiner Meinung nach unterscheidet sich Stichprobe 7 durch einen Prozentwert, der angibt, wie nahe jede Stichprobe sein muss, um einen Wert von 1, der unter% 1 liegt, und einen Prozentwert für die Gesamtzahl der Stichproben, die innerhalb des Prozentsatzes für die Stichprobenübereinstimmung liegen müssen hat der Code eine leicht einstellbare Genauigkeit.
Ich habe so etwas noch nie mit Audio gemacht, es könnte eine Menge Arbeit sein. Deshalb stelle ich diese Frage, wenn Sie vielleicht bereits wissen, dass die Antwort auf diese Frage offensichtlich ist (was auch immer diese Antwort sein mag). Ich hoffe, dass dies keine rechenintensiven Aufgaben sein werden, da ein Teil der Hardware, die ich verwenden werde, Low-Sec-Teile sein werden. In den Hunderten von Megahertz (vielleicht 1 GHz mit einem übertakteten Rasp Pi). Dies ist also eine ziemlich grobe Methode, um Audio-Samples mit geringerer Rechenleistung abzugleichen. Ich strebe keine sofortigen Ergebnisse an, sondern weniger als 30 Sekunden für einen anständigen Proof of Concept.
PS Ich habe keinen Mitarbeiter, der dies mit einem neuen Tag wie "Audio", "Audioerkennung", "Stimme", "Spracherkennung" usw. kennzeichnet.