Sprechanalyse - Oszilloskop, Tonhöhevariabilität, Lautstärkevariabilität, Intonation, Sprechgeschwindigkeit... Alles muss gemessen werden!

  • Zitat von edgar-rft

    Gesamtlänge einer Tonspur mit Audacity


    Ganz unten im Fenster, unter den Tonspuren gibt es einen Bereich mit der 'Projektrate' (Audacity Samplefrequenz), und mehreren Feldern mit Positions- und Längenangaben. Das mittlere Feld zeigt das Ende bzw. die Länge der aktuellen Auswahl in einstellbaren Einheiten an (z.B. auch Sekunden und Millisekunden). Wenn das mittlere Feld auf 'Länge' steht und Du die gesamte Spur markierst (Ctrl-A oder mit der Maus irgendwo in den Spurkopf klicken, wo keine Knöpfe und Regler sind) wird im mittleren Feld die Gesamtlänge der Spur angezeigt.


    Kann man die Angaben dann in einen z.B. .txt File o.ä exportieren?

  • Also ich habe mal ein Audacity 'Speech Segment Analysis' Plugin gebastelt: http://www.audacity-forum.de/d…eech-segment-analysis.htm


    Wie das installiert wird und die Beschreibung der Regler befindet sich auf der verlinkten Seite oben. Alle Werte im Fenster 'Nyquist Diagnose Protokoll' (auch die Länge der markierten Auswahl bzw. die Länge der Tonspur, wenn die gesamte Tonspur vorher markiert wird) können mit Ausschneiden/Kopieren/Einfügen in jeden Texteditor kopiert werden.


    Das Plugin befindet sich meiner eigenen Meinung nach im Stadium 'funktioniert zwar, aber noch nicht toll'. Ich würde lesnoj bitten mal auszuprobieren ob die 'Start' und 'End' Punkte genau genug getroffen werden. Da das stark von dern Originalaufnahmen selbst abhängt hilft nur der praktische Versuch. Und bitte keine Komplexe haben herumzumeckern, was alles nicht genau genug funktioniert oder wie ich das immer erkläre: was das Plugin SUPER kann weiss ich bereits, mich würde viel mehr interessieren, was ich besser machen muss.


    Die Anzeigewerte am Ende des Texts im 'Nyquist Diagnose Protokoll' Fenster sind noch ausbaufähig. Falls das Plugin brauchbar sein sollte bitte eine Wunschliste schreiben, was alles berechnet werden soll. Das alles hängt aber massgeblich davon ab, ob die 'Start' und 'End' Punkte überhaupt genau genug getroffen werden.

  • Danke für deine Mühe Edgar!
    Also ich habe dein Plugin ausprobiert und mit der Funktionen in Praat verglichen:


    Meine Aufgabe:
    Patienten lesen vorgegebene Text ab. Augewertet wird jeweils der 1. Satzt (36 Silben) und der letzte (47 Silben). Gesucht wird nach der Pausen zwischen den Wörten und den Silben (msec-Bereich).
    Verglichen wird dann Unterschied zwischen dem ersten und dem letzten Satz.


    Audacity
    Standart Einstellung:
    Treshold 26 dB
    Hysteresis 3.0 dB
    Min. Duration 10


    Müsste in meinem Fall umgestellt werden. Min. Duration = 0 msec. Dann funktioniert das ganze schon mal nicht schlecht.


    Genauigkeit der START / END Punkte.

    Also in meinem Fall (1 Sprechsatz ca. 11 sec) war die Abweichung:
    - meist unter 0,05 sec -> (würde ich akzeptieren)
    - oft 1,5 / 1,6 msec (0,15 / 0,16 sec) -> es ist viel zu viel für einen Satz der nur 11 sec dauert. Meine Auswertung wird dadurch verfälscht.


    Diese Abweichung konnte man vielleicht verringern wenn man Treshold um einiges runter dreht. Doch wenn ich da kleinere Wert eingebe in Verbindung mit 5 msec. dann kommt der Meldung:
    "Nyqist gab keine Audiodateien zurück"


    Ich habe versucht die Werte in deinem Skript zu verändern:
    ;control silence-level "Treshold" real "dB" 10 0 40
    ;control hysteresis "Hysteresis" real "dB" 3 1 10
    ;control minimum-duration "Min. Duration" real "ms" 5 10 500


    Doch der Fehlermeldung blieb der gleiche.


    Ablauf
    Das ganze ließe sich ertragen wenn ich manuell die START / END Punkte genauer stellen konnte aber dann kann ich nicht mehr Protokol Datei anzeigen (mit geänderten manuellen Einstellungen der S/E Punkten). Also Protokol-Datei-Ausgabe wäre ganz am Schluss besser als vorher. Aber lässt sich wohl nicht mehr ändern.


    Und automatische Speicherung der Protokoll Datei wäre auch gut (oder zumindest ein SPEICHERN-Button ähnlich wie in Praat).


    Anzeige in der Protokolldatei (=Ausgabedatei):


    Du wolltest Vorschläge für die Ausgabe Datei? Hier sind Paar Sachen die ich z.B. brauchen würde:
    Anzahl der Sprechperioden --> XXX
    Anzahl der Pausenperioden --> XXX
    Brutto Sprechzeit = Gesamtlänge der Audiodatei wenn vor dem 1. Sprechen und nach dem letztem Sprechen keine Pause vorliegt. --> XXX
    Reine Sprechzeit (Netto Sprechzeit) --> XXX (Als Zeitangabe)
    Reine Sprechzeit (Netto Sprechzeit) --> XXX (Als Prozentangabe)
    Gesamtpausenlänge --> XXX (Als Zeitangabe)
    Gesamtpausenlänge --> XXX (als Prozentangabe) (ohne Pausen vor dem 1. und nach dem letzten Sprechen).


    So gibt z.B Praat seine Info aus:


    intervals: size = 2


    intervals [1]:
    xmin = 0
    xmax = 0.6107324263038549
    text = "sounding"
    intervals [2]:
    xmin = 0.6107324263038549
    xmax = 0.7387324263038548
    text = "silent"


    Solche Angaben können auch nicht stören!


    Cool wäre wenn du jede Zeile Nummerierst. Ich lege immer sehr viele von solchen Dateien an (von verschiedenen Patienten) und lasse dann einen PHP-Skript drüber laufen damit er mir die Werte abliest und in MySQL speichert.
    Wäre gut wenn man wusste dass z.B. Angaben über "Anzahl der Pausenperioden" unter der Zeile #12# sich verstecken.


    #11# Anzahl der Sprechperioden --> XXX
    #12# Anzahl der Pausenperioden --> XXX
    #13# Brutto Sprechzeit = Gesamtlänge der Audiodatei wenn vor dem 1. Sprechen und nach dem letztem Sprechen keine Pause vorliegt. --> XXX
    #14# Reine Sprechzeit (Netto Sprechzeit) --> XXX (Als Zeitangabe)
    #15# Reine Sprechzeit (Netto Sprechzeit) --> XXX (Als Prozentangabe)
    #16# Gesamtpausenlänge --> XXX (Als Zeitangabe)
    #17# Gesamtpausenlänge --> XXX (als Prozentangabe) (ohne Pausen vor dem 1. und nach dem letzten Sprechen).



    Praat
    In Praat "Praat objekts"-Fenster links auf "Anotate" gehen.
    "To TextGrid (silences)..." klicken
    Im nächsten Fenster Werte einstellen ind "OK" klicken
    In "Praat objekts"-Fenster erscheint jetzt ein neues objekt "TextGrid 1"
    Auf "Edit" klicken und es kommt ein Fenster mit Übersicht.


    Was mich bei der Sache stört, dass man hier die gefundene Segmente (Pausen- und Sprechperioden) weder hören noch sehen kann (keine oszilloskopische Darstellung). Da ist Audacity schon um einiges besser.
    Hier muss ich mich drauf verlassen dass das Programm alles richtig gemacht hat. Oder ich habe hier noch nicht alle Funktionen entdeckt.


    Deshalb würde ich schon lieber mit deinem Plugin arbeiten wenn man die Möglichkeit findet die Einstellungen zu ändern "Treshold" zu verringern.


    P.S.
    Habe versucht dein Script zu verstehen um automatische Speicherung einzubauen, aber.... trotz Referezen (http://www.cs.cmu.edu/~rbd/doc/nyquist/root.html)... die Sprache sieht für mich leider nach nichts aus :-/

  • Noch eine Überlegung!


    Ich schätzte dass "silence" wird man mit dB alleine nie richtig abfangen können. Sprich 10 sec lang und lass dir die Aufnahme in Praat anzeigen. Aktiviere dabei nur Pitch und Intensity Anzeige.
    Von der Kurven wird schnell klar dass die dB-Kurve (Intensity) schon fast auf Null ist aber Hz-Kurve (Pitch) noch Werte über 150 Hz aufweist. Dem entsprechend sieht man noch die Ausschläge in dem Oszilloskop (obwohl das ganze schon unter 26 dB liegt und als "silence" erkannt wird).


    Du muss in deinem Plugin ein zweites Parameter einbauen (Frequenz-Regler) dann wird man wahrscheinlich fast mit chirurgischer Präzision arbeiten können :) .
    Ich weiss natürlich nicht ob das technisch überhaupt machbar ist.


    Praat bietet zwar diese Einstellungen aber als ich am Ende die Sprech- und Pausenperioden von Praat und Audacity (deine Plugin) verglichen habe, musste ich fest stellen dass Audacity (auch mit diesen groben Einstellungen) mehr Perioden erkannt hat als Praat und sie waren bei Audacity so wie ich es manuell eingestellt hätte. Allerdings war wie ich schon geschrieben habe die Periodengenauigkeit etwas falsch. Bei Praat konnte ich die Periodengenauigkeit gar nicht prüfen.


    Also wenn es irgendwie möglich ist dann Frequenz-Regler einbauen und so machen dass sich das ganze noch verändern/einstellen lässt.

  • Zitat

    Standart Einstellung müsste in meinem Fall umgestellt werden


    Das war mir sowieso fast schon klar. Hier die Beschreibung der 'control' Parameter am Anfang der '.ny' Plugin Datei:


    Code
    ;control <VariableName> "Text_links" <VariableTyp> "Text_rechts" <AnfangsWert> <Minimum> <Maximum>


    AnfangsWert = Einstellung des Reglers beim ersten Start des Plugins
    Minimum = Linksanschlag des Reglers
    Maximum = Rechtsanschlag des Reglers


    Zitat

    Min. Duration = 0 msec, dann funktioniert das ganze schon mal nicht schlecht.


    'Min. Duration = 0 msec' bedeutet, dass überhaupt keine Samples da sind, die analysiert werden könnten. Wenn es trotzdem funktioniert (und das tut es ja scheinbar) bedeutet das leider nichts weiter, als dass irgendwo ein Fehler im Plugin Code ist. Trotzdem natürlich danke für den Hinweis, weil ich weiss jetzt wo ich suchen muss.


    Zitat

    Bei kleinen 'Trehold' Werte in Verbindung mit 5 msec. 'Min. Duration' kommt eine Fehlermeldung


    Das ist das Verhalten, das bei 'Min. Duration' kleiner als '10 ms' grundsätzlich auftreten sollte (vermutlich gleicher Fehler wie oben, muss noch gefunden werden).


    Zitat

    Genauigkeit der START / END Punkte unter 0,05 secwürde ich akzeptieren


    Danke sehr, weil wichtige Information, viel mehr wird aber leider auch nicht machbar sein (siehe technische Erklärungen im nächsten Kasten).


    Zitat

    Das ganze ließe sich ertragen wenn ich manuell die START / END Punkte genauer stellen konnte aber dann kann ich nicht mehr Protokol Datei anzeigen


    Die gleiche Idee hatte ich auch schon. Eine nachträgliche manuelle Korrektur der Start und End Punkte und eine Erneute Auswertung der Spur mit den Textmarken wäre wahrscheinlich sogar die best-mögliche Lösung, nur ist das Auswerten von Textspuren über Nyquist Plugins in Audacity leider überhaupt nicht machbar.


    Zitat

    Eine automatische Speicherung der Protokoll Datei wäre auch gut


    Das Lesen und Schreiben externer Dateien (ob Text-, Sound- oder sonstiger Dateien) ist mit Nyquist (der Plugin-Interpreter) in Audacity überhaupt nicht möglich. Laut Dominik Mazzoni 'aus Sicherheitsgründen'. Die Beschwerden darüber sind nicht wenige und die Diskussion dauert nun mittlerweile schon über zwei Jahre, Dominik weigert sich aber immer noch entschieden, dass so etwas eingebaut wird. (Hintergrund: es gibt eine 'Original' Nyquist Version von Roger Dannenberg, allerdings als reine Skriptsprache ohne grafische Oberfläche, damit funktioniert das ohne Probleme).


    Zitat

    ... Zeilennumerierung, z.B. #11#, #12#, ...


    Enlich mal eine gute Nachricht: das ist überhaupt kein Problem.


    Zitat

    ... ich mich drauf verlassen dass das Programm alles richtig gemacht hat ...


    Das dürfte bei einer medizinischen Diagnose wohl das WICHTIGSTE ÜBERHAUPT sein. Ich möchte ja auch nicht zu einem Arzt gehen, dessen Diagnose auf Würfelspielen oder Kaffesatzlesen beruht. Ich habe mit Praat in dieser Hinsicht auch noch keine wirklich überzeugende Lösung gefunden, muss aber sagen, dass ich mit mit Nyquist Plugins in Audacity auch wesentlich besser auskenne als mit der Scriptsprache von Praat (kann aber auch nochmal erforscht werden sobald wir eine wirklich funktionierende Lösung gefunden haben).


    Zitat

    ... habe versucht dein Script zu verstehen ...


    Nyquist beruht auf eine modifizierten XLISP Interpreter. XLISP wiederum ist eine der Vorgängersprachen von Common Lisp, der Standard AI Sprache (künstliche Intelligenz, sofern es so etwas überhaupt gibt). Nyquist/XLISP ist mit fast 500 eingebauten Funktionen leider keine Sprache, die in 5 Minuten zu verstehen wäre. Das immerhin über 100 Seiten dicke Nyquist Manual beschreibt z.B. nur die Audiofunktionen, und nur sehr mangelhaft die eigentliche XLISP Sprache. Mehr Informationen über XLISP gibt es unter:


    http://www.audacity-forum.de/d…doc/xlisp/xlisp-index.htm


    Ich schlage der Einfachheit aber vor, dass ich Dir eine Anleitung schreibe, wie Du die Textausgaben des Plugins selbst anpassen kannst (das kann in 5 Minuten verstanden werden). Den Rest könntest Du dann mit Deinen PHP Skripten weiter verarbeiten. Nur für automatische Textspeicherung aus Audacity heraus habe ich leider noch keine Lösung auf Lager.


    Ich werde versuchen, dass das im Laufe dieses Tages noch fertig wird...

  • Zitat von edgar-rft

    'Min. Duration = 0 msec' bedeutet, dass überhaupt keine Samples da sind, die analysiert werden könnten. Wenn es trotzdem funktioniert (und das tut es ja scheinbar) bedeutet das leider nichts weiter, als dass irgendwo ein Fehler im Plugin Code ist. Trotzdem natürlich danke für den Hinweis, weil ich weiss jetzt wo ich suchen muss.


    Sorry war mein Tipp-Fehler!
    Min Duration auf 0 hatte ich natürlich nicht gehabt. War 0.05 sec.

  • Die technischen Schwierigkeiten sind folgende:


    Eine Soundkarte (und damit auch Audacity und Praat) arbeitet mit ABSOLUTEN Werten, in Audacity z.B. zwischen -1.0, 0, und +1.0, wie sie dann auch in der Tonspur dargestellt werden. Die akustische Wahrnehmmung im menschliche Gehirn ist jedoch ein adaptiver Apparat, der ausschliesslich mit RELATIVEN Werten arbeitet. Das heisst auf deutsch, alle Schallereignisse, die über das Trommelfell aufgenommen werden, werden mit den Schallereignissen verglichen, die während der letzten ca. halben Sekunde vom Gehirn aufgenommen wurden. Weiter reicht das Erinnerungsvermögen des menschlichen Gehirns für ABSOLUTE Lautstärkeverhältnisse überhaupt nicht zurück.


    Die ABSOLUTE Wahrnehmung schwankt also ständig und auch noch ziemlich extrem. Der Bereich von 'kaum noch hörbar' bis 'so laut dass es weh tut' liegt bei ca. 130dB oder in 'normalen' Zahlen ausgedrückt etwa eins zu sechseinhalb Millionen. Das ist ungefähr hundert mal mehr als eine Standard 16-bit Soundkarte überhaupt aufnehmen kann (die Mikrofone und elektrischen Verstärker sind aber auch nicht viel besser, so dass eine Soundkarte mit mehr als 16-bit das Problem also auch nicht automatisch löst). In der praktischen Alltagsumgebung kommen 'Lautstärkesprünge' im Bereich von 130dB aber so gut wie nie vor, so dass es sich im Lauf der Evolution wohl als praktischer erwiesen hat, die ABSOLUTE Lautstärke im Gehirn anpassbar zu machen. In der Aufnahmepraxis mit Mikrofonen bedeutet das, dass wir wahrscheinlich niemals eine wirklich perfekte Aussteuerungsautomatik haben werden.


    Auf was ich raus will:


    Da ein Mikrofon (und damit auch ein Computer) ausschliesslich ABSOLUTE Lautstärkewerte aufnehmen können, ist es extrem aufwändig bis unmöglich, die adaptive Lautstärkeanpassung des Gehirns zu simulieren, um wirklich die EXAKTEN Start und End Zeiten einer Silbe oder eines Wortes zu definieren. Die Bestimmung über ABSOLUTE Threshold und Hysteresis Werte ist also prinzipbedingt mehr oder weniger reine Glückssache (was nichts weiter ist als eine höfliche Formulierung für 'im Prinzip misfunktional'). Da wird sich aber 'auf die Schnelle' wahrscheinlich nichts dran ändern lassen (siehe auch Vorschläge ganz unten).


    Wie das Plugin arbeitet:


    Vorwort: vielleicht hat der Markus noch ein paar Ideen weil im Prinzip arbeitet ein Dynamikkompressor ähnlich


    Zuerst wird eine 'Hüllkurve' mit einer Samplefrequenz von 100_Hz erzeugt, um zu vermeiden, dass aus Versehen Nulldurchgänge der Sprachfrequenzen detektiert werden. Das bedeutet gleichzeitig, dass die maximal mögliche Präzision des Detektors 10_Millisekunden beträgt. Danach läuft das auf 100_Hz Hüllkurvensignal durch einen 'Schmitt-Trigger', das ist ein Baustein, der erst einschaltet, wenn das Signal die 'Treshold' Schwelle übersteigt (dort wird die 'Start' Marke gesetzt) und danach erst wieder abschaltet wenn das Signal unterhalb der 'Treshold' minus der 'Hysteresis' Schwelle fällt (siehe Bild auf der Plugin Seite). Dort wir dann die 'End' Marke gesetzt. Der 'Schmitt-Trigger' und der 'Hysteresis' Regler sind uralte Tricks aus der allgemeinen Messtechnik um Störungen des Messignals selbst auszublenden.


    Was eventuell machbar wäre (aber vermutlich länger dauern wird):


    Ich werden versuchen, ob es möglich ist einen 'adaptiven Threshold' zu implementieren, der mit dem Anstiegs- und Abfallwinkel der Hüllkurve arbeitet. Das wird aber wesentlich aufwändiger werden und ich kann auch nicht versprechen, ob das Ergebnis dadurch wirklich entscheidend besser werden wird (versuchen werde ich es aber trotzdem).

  • Zitat von edgar-rft


    Ich schlage der Einfachheit aber vor, dass ich Dir eine Anleitung schreibe, wie Du die Textausgaben des Plugins selbst anpassen kannst (das kann in 5 Minuten verstanden werden). Den Rest könntest Du dann mit Deinen PHP Skripten weiter verarbeiten. Nur für automatische Textspeicherung aus Audacity heraus habe ich leider noch keine Lösung auf Lager.


    Ich werde versuchen, dass das im Laufe dieses Tages noch fertig wird...


    Das wäre gute Idee!


    Zitat von edgar-rft


    Nur für automatische Textspeicherung aus Audacity heraus habe ich leider noch keine Lösung auf Lager.


    Ich werde versuchen, dass das im Laufe dieses Tages noch fertig wird...


    Mach dir nicht so viele Umstände! Es ist mir schon fast peinlich. Ich komme mit manuellen Auswertung auch ganz gut zu recht. Habe eh schon die Hälfte durch!

  • Zitat

    Min. Duration = 0 msec, dann funktioniert das ganze schon mal nicht schlecht.
    Sorry war ein Tipp-Fehler! Min Duration auf 0 hatte ich natürlich nicht gehabt. War 0.05 sec


    Das ist nicht so schlimm. Was wichtiger wäre: wenn es Fehlermeldungen gibt spuckt der Nyquist Interpreter einen ganzen Wust von (für normale Menschen) unlesbarem Kauderwelsch aus. Könntest Du mir die KOMPLETTE Ausgabe des 'Diagnose Protokoll' Fenster hier reinkopieren? Hintergrund: auf Grund von Hardwareproblemen ist mein Mac System mittlerweile veraltet (OS X 10.3.9), so dass ich die neuen Audacity Versionen z.B. nicht mehr selbst kompilieren kann. Ich möchte nur sichergehen, dass ich nicht nach Fehlern suche, die es bei mir eventuell nicht (oder anders) gibt.

  • Wow, danke für die Erklärung!
    Hier ist der Protokol:

    --- DETECTOR SETTINGS ---
    threshold speech : 0.316228 (-10 dB)
    threshold silence : 0.223924 (-12.998 dB)
    minimum speech/pause duration: 5 milliseconds
    error: bad argument type - NIL
    Function: #<Subr--: #2391e24>
    Arguments:
    3.32546
    NIL
    Function: #<FSubr-SETF: #23931c8>
    Arguments:
    LAST-LABEL
    (/ LEN *SOUND-SRATE*)
    SPEECH-TIME
    (+ (- LAST-LABEL START-LABEL) SPEECH-TIME)
    SPEECH-SEGMENTS
    (1+ SPEECH-SEGMENTS)
    Function: #<FSubr-COND: #23923dc>
    Arguments:
    ((NOT LAST-LABEL) (SETF LAST-LABEL (/ LEN *SOUND-SRATE*) SPEECH-TIME (+ (- LAST-LABEL START-LABEL) SPEECH-TIME) SPEECH-SEGMENTS (1+ SPEECH-SEGMENTS)) (ADD-LABEL LAST-LABEL "End"))
    Function: #<FSubr-LET: #239231c>
    Arguments:
    ((VOWEL-SOUND (MAKE-VOWEL-SOUND S)) (CONSONANT-SOUND (MAKE-CONSONANT-SOUND S)))
    (SETQ S NIL)
    (SETQ NEW-SOUND-LENGTH (DO ((N 1 (1+ N)) (CURRENT-SAMPLE (SND-FETCH VOWEL-SOUND) (SETQ VOWEL-SAMPLE (SND-FETCH VOWEL-SOUND))) (CONSONANT-SAMPLE (SND-FETCH CONSONANT-SOUND) (SETQ CONSONANT-SAMPLE (SND-FETCH CONSONANT-SOUND)))) ((OR (NOT CURRENT-SAMPLE) (NOT CONSONANT-SAMPLE)) N) (COND ((>= CURRENT-SAMPLE CONSONANT-SAMPLE) (SETF VOWEL-COUNTER (1+ VOWEL-COUNTER))) (T (SETF CURRENT-SAMPLE CONSONANT-SAMPLE) (SETF CONSONANT-COUNTER (1+ CONSONANT-COUNTER)))) (COND ((< CURRENT-SAMPLE THRESHOLD-SILENCE) (SETF SILENCE-COUNTER (1+ SILENCE-COUNTER)) (COND ((= 1 SILENCE-COUNTER) (SETF INDEX (/ (1- N) (FLOAT *NEW-SOUND-SRATE*)))) ((AND (= 1 *SPEECH-DETECTOR-STATE*) (> SILENCE-COUNTER MINIMUM-LENGTH)) (ADD-LABEL INDEX "End") (COND ((NOT LAST-LABEL) (SETF LAST-LABEL INDEX))) (SETF SPEECH-TIME (+ (- INDEX START-LABEL) SPEECH-TIME) SPEECH-SEGMENTS (1+ SPEECH-SEGMENTS) END-LABEL INDEX *SPEECH-DETECTOR-STATE* 0))) (SETF SPEECH-COUNTER 0)) ((> CURRENT-SAMPLE THRESHOLD-SPEECH) (SETF SPEECH-COUNTER (1+ SPEECH-COUNTER)) (COND ((= 1 SPEECH-COUNTER) (SETF INDEX (/ (1- N) (FLOAT *NEW-SOUND-SRATE*)))) ((AND (= 0 *SPEECH-DETECTOR-STATE*) (> SPEECH-COUNTER MINIMUM-LENGTH)) (ADD-LABEL INDEX "Start") (FORMAT T "first-label : ~A~%" FIRST-LABEL) (COND ((NOT FIRST-LABEL) (SETF FIRST-LABEL INDEX)) (T (SETF PAUSE-TIME (+ (- INDEX END-LABEL) PAUSE-TIME) PAUSE-SEGMENTS (1+ PAUSE-SEGMENTS)))) (SETF START-LABEL INDEX LAST-LABEL NIL *SPEECH-DETECTOR-STATE* 1))) (SETF SILENCE-COUNTER 0)))))
    (COND ((NOT LAST-LABEL) (SETF LAST-LABEL (/ LEN *SOUND-SRATE*) SPEECH-TIME (+ (- LAST-LABEL START-LABEL) SPEECH-TIME) SPEECH-SEGMENTS (1+ SPEECH-SEGMENTS)) (ADD-LABEL LAST-LABEL "End")))
    (FORMAT T "--- DETECTOR INTERNALS ---~%")
    (FORMAT T "number of audio blocks used : ~A~%" (1- NEW-SOUND-LENGTH))
    (FORMAT T "vowel blocks used : ~A~%" VOWEL-COUNTER)
    (FORMAT T "consonant blocks used : ~A~%" CONSONANT-COUNTER)
    (FORMAT T "--- VOICE SEGMENT ANALYSIS ---~%")
    (FORMAT T "Audacity selection : ~A seconds~%" (/ LEN *SOUND-SRATE*))
    (FORMAT T "time from first Start to last End : ~A seconds~%" (- LAST-LABEL FIRST-LABEL))
    (FORMAT T "speech segments found : ~A~%" SPEECH-SEGMENTS)
    (FORMAT T "sum of all speech times : ~A seconds~%" SPEECH-TIME)
    (FORMAT T "pause segments found : ~A~%" PAUSE-SEGMENTS)
    (FORMAT T "sum of all pause times : ~A seconds~%" PAUSE-TIME)
    1> "No Segments found."
    1>



    Das hört sich ja spannend an!
    ;)

  • Vorläufige, grob fahrlässige Anleitung für die Textausgabe


    Die Textausgabe befindet ziemlich sich am Ende des Plugin Codes:


    Code
    (format t "--- VOICE SEGMENT ANALYSIS ---~%")
    (format t "Audacity selection : ~A seconds~%" (/ len *sound-srate*))
    (format t "time from first Start to last End : ~A seconds~%" (- last-label first-label))
    (format t "speech segments found : ~A~%" speech-segments)
    (format t "sum of all speech times : ~A seconds~%" speech-time)
    (format t "pause segments found : ~A~%" pause-segments)
    (format t "sum of all pause times : ~A seconds~%" pause-time)


    Jede 'format' Zeile entspricht einer Zeile im 'Diagnose Protokoll' Fenster:


    Code
    (format t "irgendein_Text ~A~%" <VariableName>)


    ~A ist der Platzhalter im Text für den berechneten Wert von <VariableName>
    ~% ist ein Zeilenumbruch


    momentan gibt es folgende Variablennamen:


    first-label ist die Zeit in Sekunden des ersten 'Start' Labels (Textmarke)
    last-label ist die Zeit in Sekunden des letzten 'End' Labels
    speech-segments ist die die Gesamtanzahl aller Start/End Segmente
    pause-segments ist die die Gesamtanzahl aller Pausen zwischen dem ersten und dem letzten Start/End Segment
    speech-time ist die die Summe der Zeiten aller Start/End Segmente
    pause-time ist die die Summe aller Pausen zwischen dem ersten und dem letzten Start/End Segment


    Bei den 'Pausen' werden eventuelle Pausen VOR dem ersten und NACH dem letzten Start/End Segment NICHT mitgerechnet.


    Mathematische Berechnungen in Lisp


    Lisp verwendet AUSSCHLIESSLICH Prefix Notation. Das bedeutet 1+1 wird folgendermassen geschrieben:


    Code
    (+ 1 1)


    Die Zeit zwischen dem ersten 'Start' und dem letzten 'End' Label 'last-label minus first-label' wird demnach folgendermassen berechnet:


    Code
    (- last-label first-label)


    Folgende Zeile gibt die Zeit zwischen dem ersten 'Start' und dem letzten 'End' Label in PHP Nummerierung aus:


    Code
    (format t "#12# Zeit vom ersten Start bis zum letzen End : ~A Sekunden~%" (- last-label first-label))


    Den Fehler mit den unpräzisen Start- und Endpunkten bei Zeiten >0.05ms muss ich erst noch suchen. Danke für das 'unlesbare' Nyquist Zeugs (mit den Nyquist/XLISP Backtrace Meldungen bekomme sogar ich jedesmal eine mittelschwere Nervenkrise). Hoffentlich funktioniert das bis heute Abend richtig.

  • Zitat von edgar-rft

    Das war mir sowieso fast schon klar. Hier die Beschreibung der 'control' Parameter am Anfang der '.ny' Plugin Datei:


    Code
    ;control <VariableName> "Text_links" <VariableTyp> "Text_rechts" <AnfangsWert> <Minimum> <Maximum>


    AnfangsWert = Einstellung des Reglers beim ersten Start des Plugins
    Minimum = Linksanschlag des Reglers
    Maximum = Rechtsanschlag des Reglers


    Genau das habe ich vorher probiert.
    Beim Anklicken der "Speech Segment Analysis" wird nur "Treshold" Wert übernommen, Zeitangabe bleibt immer bei "10". Und das ganze gibt dann ein Fehler der ich beschrieben habe.

  • Zitat von edgar-rft

    Lisp verwendet AUSSCHLIESSLICH Prefix Notation. Das bedeutet 1+1 wird folgendermassen geschrieben:


    Code
    (+ 1 1)


    Die Sprache hört sich ziemlich behindert an :) aber danke für die Erklärung. Versuche mal ein paar Systemabstürze zu verursachen!
    :D

  • Dumme Fragen nochmal weil es gibt einen bekannten Punkt-und-Komma BUG im Audacity Plugin Fenster:


    Frage 1: um welche Audacity Version handelt es sich genau (steht im Audacity 'Hilfe' Menü unter 'über Audacity').


    Frage 2: ändert sich etwas wenn Du statt '0.05' (mit Punkt) '0,05' (mit Komma) eintippst?


    Ich erhalte hier nämlich in keinem von beiden Fällen ein Fehlermeldung (Audacity 1.3.4-beta, allerdings auf Windows XP). Ich werden das nachher zu Hause auch nochmal auf Mac überprüfen.

  • Was ich gerade finde und noch nicht beantwortet habe:


    Zitat

    Du muss in deinem Plugin ein zweites Parameter einbauen (Frequenz-Regler)


    Das Plugin arbeitet bereits mit mehreren Frequenzbändern und verwendet nur dasjenige, bei dem im aktuellen Hüllkurvensegment die meisten Änderungen auftreten. Im Plugin Code heisst das 'vowel-sound' für die typischen Vokal Frequenzbänder und 'consonant-sound' für die höherfrequenten Kononanten Frequenzbänder, die meist geringere Lautstärken haben als die breitbandigeren Vokal Frequenzbänder. In der Plugin Ausgabe gibt es deshalb auch die Information 'vowel blocks used' und 'consonant blocks used' die aber mehr oder weniger für mich selber gedacht waren um zu sehen ob das auch richtig funktioniert.


    Wenn Du noch eine bessere Idee hast bin ich natürlich gerne bereits sie einzubauen (Versuch macht kluch) :)

  • Meine Dummheit, ich glaub' ich muss so langsam mal in's Bett. Ich hatte den Plugin Code extra deswegen von Sekunden auf Millisekunden geändert, damit keine Kommazahlen eingegeben werden müssen. Trotzdem bekomme ich auf Windows XP keine Fehlermeldung. Sehr seltsam, vor allem schon deshalb weil die Fehlermeldung so weit ich das sehen kann auf einem angeblich falschen Wert einer von Audacity selbst an den Nyquist übergebenen Variablen beruht. Ich werden mir das aber noch einmal zu Hause in Ruhe auf dem Mac anschauen. Vielleicht ist das ein nur-Macintosh Fehler. Was aber in jedem Fall wichtiger wäre, wären exakte Start und End Punkte.

  • Probier mal bitte aus ob das Plugin hier unten im Attachment besser funktioniert. Es gibt jetzt keine unnötigen Fehlermeldungen mehr, wenn keine Sprachsegmente gefunden wurden, und auch das Finden der Start und Endpunkte sollte jetzt mit '10ms' genau funktionieren (genauere Erklärung folgt noch). PHP Nummerierung ist auch schon integriert.