Audio aufnehmen solange gesprochen wird

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Guten Morgen,
    ich hatte vor ein paar Monaten ein Bash Script geschrieben, welches eine Variable Sekunden Zeit Audio aufnimmt und das ganze mithilfe der Google Speech2Text API in einen String umwandelt. An sich funktioniert das ganze auch und bis jetzt gab es keine Probleme.

    Jetzt kam mir die Idee, dass man ja ein Script schreiben könnte, mit dem solange aufgenommen wird wie gesprochen wird.
    Google schafft es auf Android/Google Suche ja irgendwie auch. Meine erste Idee war es einfach immer 0.5 Sekunden aufzunehmen und dann nachzuschauen ob noch etwas zurückgegeben wird. Es hat zwar mit dem Abbrechen funktioniert, aber nun fehleten einfach Wörter, die in der Zeit der Konvertierung gesprochen wurden.
    Meine nächste Idee war es ein kleines Python Script zu schreiben, welches nach jeder Aufnahme einen neuen Thread startet und dann das ganze wieder durchlaufen lässt. Allerdings dauert die init Sequenz von arecord zu lange. Auch dort werden halbe Worte abgeschnitten.

    Hat jemand noch eine Idee wie man so etwas realisieren könnte oder ist der Pi einfach dafür zu schwach auf der Brust? Wenn ja würde es mich trotzdem interessieren, ob ihr noch andere Lösungsansätze habt.

  • > Hat jemand noch eine Idee wie man so etwas realisieren könnte oder ist der Pi einfach dafür zu schwach auf der Brust?
    Wenn Sound-Recording grundsaetzlich geht, muesste es machbar sein.

    Am besten ist sicher ein C-Programm, das die Aufnahme macht, und dabei checkt ob eine bestimmte
    Zeit nichts mehr kommt. Wenn man von der Source des verwendeten Recorders ausgeht, muesste das
    zu machen sein.

    Ohne die Source ist es wohl muehsam, weil fuer ein sauberes Recording die Hardware trickreich
    angesteuert werden muss.

    Ein anderer Ansatz: den Recorder verwenden um ein File schreiben zu lassen. Das File waehrend der
    Aufnahme mitlesen und den Inhalt kopieren bis nichts mehr kommt. An diesem Punkt den Recorder
    stoppen oder killen und die Kopie des Files an Google schicken.

    Hmm, das koennte man wohl noch cleverer machen: den Recorder auf eine Named Pipe schreiben
    lassen ! Auf der anderen Seite von dieser Pipe lesen und auf Pausen checken.

    So muesste es eigentlich relativ einfach zu realisieren sein (wenn der Leser schnell genug ist) ...

    Einmal editiert, zuletzt von Tell (7. Juli 2014 um 21:32)


  • So muesste es eigentlich relativ einfach zu realisieren sein (wenn der Leser schnell genug ist) ...


    Genau da sehe ich den Kackpunkt. Der Pi hat nur einen Kern und kann damit physikalisch auch immer nur einen Thread bedienen. Wenn man nun die Aufnahme laufen lässt und gleichzeitig das Output File ließt hat man nun schon zwei. Logisch ist das ja auch kein Problem aber ich habe die Befürchtung, dass er dafür zu langsam ist. Ein Versuch ist es aber Wert.
    Habe hier ein Projekt gefunden welches ein C Programm enthält, welches von einer Quelle aufnimmt. https://github.com/certik/record/blob/master/arecord.c Ob es jetzt das originale "arecord" ist? Keine Ahnung aber es scheint zu funktionieren. Werde es mir heute im laufe des Tages noch einmal genauer anschauen.

    Ohh Gott ist C lange her :bravo2:

  • > Wenn man nun die Aufnahme laufen lässt und gleichzeitig das Output File ließt hat man nun schon zwei.
    Der erste Prozess wird wahrscheinlich gar nicht viel machen. Er stellt Buffer bereit und wartet
    bis die DMA sie gefuellt hat. Die vollen Buffer schreibt er auf den Disk und uebergibt sie wieder
    der DMA-Einheit.

    Wenn er nicht Busy Waiting macht, sollte noch CPU-Zeit uebrig bleiben.

    - - - - -

    Wieviel CPU-Zeit die Aufnahme braucht, kann man zum Beispiel mit top herausfinden.

    Einmal editiert, zuletzt von Tell (8. Juli 2014 um 09:05)

  • Okey hier mal eben ein Zwischenstatus: Habe einen Audiorecorder in C zum laufen gebracht. Leider ist Stille anscheinend nicht gleich Stille. An Raw Daten bekomme ich bei der Stille immer etwas anderes, und dadurch kann ich das ganze nicht genau bestimmen.

    Also funktioniert das Mitlesen des Files auch nicht. Die Methode mit der Named Pipe habe ich jetzt noch nichz ausprobiert. Werde mich dazu dann auch noch einmal melden.

  • > Habe einen Audiorecorder in C zum laufen gebracht.
    Sehr gut.

    > Leider ist Stille anscheinend nicht gleich Stille. An Raw Daten bekomme ich bei der Stille immer
    > etwas anderes, und dadurch kann ich das ganze nicht genau bestimmen.
    Ein simpler Vergleich funktioniert natuerlich nicht, schon wegen dem Rauschen
    des Verstaerkers und dem Quantisierungsrauschen. Und wenn's nicht gerade
    ein schalltoter Raum ist, hat man Nebengeraeusche wie Verkehr, Kinder, Tiere,
    Maschinen, Wind, Wasser ...

    Stille wuerde ich definieren als eine bestimmte Zeit mit Sample-Werten unter einer definierten
    Amplitude.

    Einfach mal ein paar Aufnahmen machen und mit Audacity studieren ;)


  • Ein simpler Vergleich funktioniert natuerlich nicht, schon wegen dem Rauschen
    des Verstaerkers und dem Quantisierungsrauschen. Und wenn's nicht gerade
    ein schalltoter Raum ist, hat man Nebengeraeusche wie Verkehr, Kinder, Tiere,
    Maschinen, Wind, Wasser ...

    Stille wuerde ich definieren als eine bestimmte Zeit mit Sample-Werten unter einer definierten
    Amplitude.

    ja klar darauf wollte ich auch hinaus als ich meinte Stille != Stille :) . Habe nur noch nicht herausgefunden, wie ich diese aus dem Track herausfiltern kann. Es gibt ja keine Funktion
    "getDB(track.file)". Jetzt mal ganz einfach ausgedrückt.

  • Hallo zusammen,

    nur mal als Idee (habe nur oberflächlich in die manpage geschaut):

    Könnte man das nicht auch mit "sox" in den Griff kriegen, insbesondere mit den Parametern "vad" (= voice activity detector) und ergänzend evtl. "silence" ?

    Gruß, mmi

  • Okey XOS ist nun installiert, allerdings gibt es nun ein großes Problem: Die Webcam, die zurzeit noch als Mikrofon dient, wird nun nicht mehr als Audio Quelle erkannt. Zumindest nicht von XOS.
    Im Alsamixer steht sie immer noch als "USB Device 0x64d:0x805" zur Verfügung. Allerdings bekomme ich unter "hw:1,0" keine Verbindung mehr zu ihr.

    Fehlermeldung: "rec FAIL formats: can't open input `hw:1,0': snd_pcm_open error: Device or resource busy"

    Einmal editiert, zuletzt von audacity363 (14. Juli 2014 um 19:47)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!