Voice-Recognition

Dieses Forum beschäftigt sich mit allen Fragen, Kommentaren und Anregungen zu MemBrain Skripten. Auch der Austausch von Skripten zwischen MemBrain Benutzern soll hiermit gefördert werden.
Wenn Sie ein interessantes Skript haben, das Sie anderen MemBrain Benutzern zur Verfügung stellen wollen, dann Erstellen Sie dafür jeweils bitte ein neues Thema in diesem Forum. Der Titel des Themas sollte es anderen Benutzern erlauben möglichst schnell zu erfassen, wozu Ihr Skript dient.
Post Reply
Crafter
Posts: 3
Joined: Mon 26. Aug 2013, 11:43

Voice-Recognition

Post by Crafter » Mon 26. Aug 2013, 11:59

Hallo,
ich habe eine Frage bezüglich des Script-Examples der voice-recognition. Ich habe alle Schritte der Anleitung befolgt, klappt auch soweit, wenn ich jetzt aber zur online voice-recognition gelange, erhalte ich die Meldung: unable to create FFT Lesson
Wäre toll wenn mir jemand helfen könnte.

lg Crafter

User avatar
TJetter
Posts: 318
Joined: Sat 13. Oct 2012, 12:04

Re: Voice-Recognition

Post by TJetter » Tue 27. Aug 2013, 12:17

Hallo,

danke für die Rückmeldung!

Ich kann das Problem nun nachvollziehen, es scheint eine Timing-Sache zu sein: Wenn die Aufnahmezeit für den Erkennungsmodus kurz gewählt wird (Default ist hier 2 sec), dann kommt es offensichtlich gehäuft zu diesem Problem. Vielleicht benötigt der Hard Disk Ogg hier zu lange, um die Aufnahme zu starten, ich werde der Sache nachgehen.

Einstweilen hilft es, die Aufnahmezeit hochzusetzen:

In der Datei 'GlobalDefinitions.as', welche sich im Unterverzeichnis 'Includes' des VoiceRecognition Scripts befindet, steht oben die Zeile:

Code: Select all

// Overall recording duration per detection cycle during detection [s]
const uint OVERALL_REC_SECONDS_FOR_DETECTION = 2;
Diesen Wert erhöhen (z.B. auf den Wert 3) sollte als 'Workaround' funktionieren, bis ich das näher Problem eingekreist habe.

Viel Erfolg und Grüße
Thomas Jetter

Crafter
Posts: 3
Joined: Mon 26. Aug 2013, 11:43

Re: Voice-Recognition

Post by Crafter » Wed 28. Aug 2013, 11:24

Hallo Herr Jetter,
ich habe eine weitere Frage, nämlich wenn ich die Dateien nicht aufnehmen, sondern extern einfügen will, wie muss ich diese Dateien bearbeiten, dass sie verwendet werden können? Habe dies nämlich bereits probiert, die Dateien konnten jedoch nicht gelesen werden.

lg Crafter

User avatar
TJetter
Posts: 318
Joined: Sat 13. Oct 2012, 12:04

Re: Voice-Recognition

Post by TJetter » Wed 28. Aug 2013, 21:29

Crafter wrote:Habe dies nämlich bereits probiert, die Dateien konnten jedoch nicht gelesen werden.
Was genau haben Sie denn versucht?
Das Script erwartet während des Trainings und der Erkennung eine Datei mit festem Namen im Arbeitsverzeichnis des Scripts. Diese Wave-Datei wird dann in eine Lesson eingelesen, eine FFT darüber berechnet, gemittelt und das Ergebnis dann je nach zu erkennendem Teilnehmer abgespeichert.
Wenn Sie also selbst vorgenerierte Wave Files nutzen möchten, dann müssen Sie diese vorher entsprechend oben beschriebenem Vorgang umwandeln.
Im Script geschieht dies in der Funktion

Code: Select all

/*
    Convert the wave file (sWavePath) into a new lesson in the Lesson Editor and set the 
    new lesson to be the active one.
    
    The wave file is read in by use of an object of the script class 'WaveFile'.
    After reading in the file portions of length SAMPLE_COUNT_PER_SNIPPET are taken and transformed 
    to the frequency domain using an FFT transform. After the transformation the patterns are 
    averaged with respect to their inputs in order to fit into the specified input dimension 
    given by the constant INPUT_DIMENSION. 
*/
void ConvertWaveToNewAveragedFftLesson()
...
An diesem Beispiel können Sie sich entlanghangeln, wenn Sie das Script entsprechend anpassen oder erweitern möchten. Man könnte sich z.B. einen Dateiauswahldialog vorstellen, der es dem Benutzer erlaubt, eine Wave-Datei zu einem bestimmten Teilnehmer einzulesen.
Vielleicht haben Sie obiges aber auch schon versucht und es klemmt an dem speziellen Wave-File Format, das Sie verwenden?
Thomas Jetter

Crafter
Posts: 3
Joined: Mon 26. Aug 2013, 11:43

Re: Voice-Recognition

Post by Crafter » Thu 29. Aug 2013, 13:14

Hallo,
erstmal danke für die Antwort.
Ja ich habe die Datei bereits in Sample umbenannt und eine Methode weiter oben im Script aufgerufen, dass er die Aufnahme nicht durchführt, sondern gleich die Datei verwendet(so habe ich das zumindest gedacht). Daraufhin bekam ich die Meldung dass er die Datei nicht lesen kann. Was für ein wav-Format brauche ich denn direkt?

Vielen Dank für die Hilfe
Crafter

User avatar
TJetter
Posts: 318
Joined: Sat 13. Oct 2012, 12:04

Re: Voice-Recognition

Post by TJetter » Thu 29. Aug 2013, 13:40

Crafter wrote:Was für ein wav-Format brauche ich denn direkt?
Die Implementierung für das Einlesen des Wave Files ist in der Klasse 'WaveFile' in der Script-Datei WaveFile.as zu finden.
Diese kann im Moment nur WaveFiles des Formats 'PCM' einlesen.

Sie können mit Hilfe des Script-Debuggers auch einfach einmal in die Methoden der Klasse hinein Debuggen.
Dazu bitte vorher noch eine Anpassung vornehmen:
In der Datei 'VoiceRecognition.as' sind oben die anderen Script-Dateien includiert, mit Anweisungen wie z.B.:

Code: Select all

#include "Includes\\WaveFile.as" 
Die Zeichenkette '\\' muss durch '\' ersetzt werden (nur ein Backslash anstatt zwei). Ansonsten funktioniert das Anhalten bei Breakpoints in den inkludierten Dateien mit der momentanen MemBrain Version nicht. Ein BugFix hierfür ist bereits in Vorbereitung.

Außerdem kann in der Datei 'GlobalDefinitions.as' die boolsche Variable 'DEBUG' auf true gesetzt werden. Dann werden ins Script-Trace-Fenster Debug-Ausgaben geschrieben, die in den Skripten untergebracht sind, z.B. in WaveFile.as.

Sollten Sie sich dazu entscheiden, die WaveFile.as auf weitere Formate zu erweitern, dann wäre das als eigener Post im Bereich Scripting natürlich schön ;-)

Viele Grüße und viel Erfolg!
Thomas Jetter

Soph
Posts: 1
Joined: Wed 4. Mar 2015, 18:27

Re: Voice-Recognition

Post by Soph » Thu 5. Mar 2015, 17:40

Hallo Herr Jetter,
ich habe auch noch eine Frage zu diesem Thema. Ich muss für mein W-Seminar Informatik in der Schule ein neuronales Netz in Membrain nachbauen/abwandeln/selbst erstellen, welches Altersklasse und Geschlecht einer Person anhand ihrer Stimme bestimmt. Hierzu habe ich ihre Datei Voice Recognition abgewandelt, also die Participants durch z.B. "jünger als 20, weiblich" ersetzt. Damit komme ich auf 8 "Participants" (Natürlich auch im Netz auf 8 Outputs erweitert) Für die Trainingsbeispiele würde ich gerne bereits aufgenommene Dateien im wav Format verwenden. Was müsste ich im Script ändern, um das Problem so zu lösen?
Danke für Ihre Antwort!
Sophia

User avatar
TJetter
Posts: 318
Joined: Sat 13. Oct 2012, 12:04

Re: Voice-Recognition

Post by TJetter » Thu 5. Mar 2015, 18:38

Hallo,

Wenn Sie bereits aufgenommene Wave Files verwenden möchten, dann müssen Sie das Skript so umschreiben, dass es diese nacheinander einliest und jeweils eine MemBrain 'Lesson' daraus generiert bzw. diese für jedes Wave File um einen Eintrag erweitert. Dazu schauen Sie sich am besten an, wie in der Funktion

Code: Select all

void CollectTrainData()
eine einzelne Stimmprobe aufgenommen und anschließend die Funktion

Code: Select all

BuildParticipantLesson
aufgerufen wird:

Code: Select all

switch (ret)
        {
        case IDYES:
            // Build full path for target wave file and start recording. If the user accepted the sample then
            // convert the data and add it to the participant's training data lesson.
            sWavePath = sWorkDir + "\\" + PARTICIPANT_DIR + "\\"+ participantName + "\\" + WAVE_FILE_NAME;
            if (RecordParticipant())
            {
                BuildParticipantLesson();
            }
            break;
Die Variable

Code: Select all

sWavePath
ist eine skriptglobale Variable. Diese müssen Sie jeweils vor dem Aufruf der Funktion

Code: Select all

BuildParticipantLesson()
auf den jeweils korrekten Dateipfad setzen, analog zum Code oben. D.h., bei Ihnen würden in einer Schleife alle Participants abgearbeitet (Variable

Code: Select all

sCurParticipantIdx
muss hierfür jeweils gesetzt werden) und für alle Wave Files jedes Participants die Funktion

Code: Select all

BuildParticipantLesson
aufgerufen, nachdem die Variable

Code: Select all

sWavePath
jeweils so gesetzt wurde, dass sie auf die entsprechende Wave-Datei zeigt. Die Funktion

Code: Select all

RecordParticipant
würden Sie NICHT aufrufen, sie ist dazu da, neue Wave-Files aufzuzeichnen.
Das Ganze packen Sie am besten in eine vollständig neue Funktion, ich würde sie z.B.

Code: Select all

ImportExistingWaveFiles
nennen. Diese können Sie dann zu Beginn des Skriptes optional aufrufen (vielleicht mit einer entsprechenden Rückfrage an den Benutzer).

Genügt das als 'Wegweiser'?

Viele Grüße und viel Erfolg!
Thomas Jetter

Post Reply