![]() |
Sprachein- und ausgabe realisieren
Hallo DP!
Erstes Problem: Habe schon seit Längerem mal die Idee eine Spracherkennung zu basteln. Soweit ja löblich, aber ich bräuchte verwertbare Daten, zB Lautstärke&Frequenz, und das Ganze möglichst als Live-Mikrofon-Stream. Also dass ich quasi direkt mit einer Art Variablen/Funktion arbeiten kann:
Delphi-Quellcode:
So dass ich dann die Daten über ein lineares neuronales Netz weiterverarbeiten kann...
//Ein Passender Datentyp:
type TSoundRec:record Freq, Volume:integer; end; //Das soll den wirklich AKTUELLEN Zustand am Mikrofon liefern: function CurrentSound:TSoundRec; //Testprogramm: begin while(CurrentSound.Volume<=cSCHWELLE) do Application.ProcessMessages; Windows.Beep; end; Also bräuchte ich dafür nur die Möglichkeit, auf den aktuellen Zustand zuzugreifen zu können. Habe schon Bass.dll und mciSendString gehört, mci ist imho aber nicht dafür geeignet, bis ich eines Besseren belehrt werde, mit der Bass habe ich noch nie gearbeitet. Zweites Problem: Sprachsynthese, oder: Wie kann ich dynamisch Audiodateien generieren (ohne alle Ressourcen zu verbrauchen ist ein höheres Level :D) Also, hoffe mal dass wer was weiß, vielleicht hat unser 0v3rki113r ja was ;) Gruß vom LDer! [edit]Titel geändert - nun passender[/edit] |
Re: Sprachein- und ausgabe realisieren
Vielleicht hilft dir das
![]() |
Re: Sprachein- und ausgabe realisieren
Zitat:
Für die Aufnahme, also das was mich interressiert, ist leider keine Doku vorhanden. Den Quelltext ohne eine Erklärung zu verstehen, bzw. in allen mitgelieferten Units nach der entscheidenden Codezeile zu suchen, ist mir zu viel Arbeit; zumindest in Anbetracht der Tatsache, dass in diesem Forum mindestens Einer ist, der den Quelltext voll und ganz versteht - Der Autor. Deswegen werde ich ihm eine PN mit diesem Link schicken; mal schauen, was er hierzu sagen kann. Gruß vom LDer. |
Re: Sprachein- und ausgabe realisieren
Zitat:
Gruß LDer. |
Re: Sprachein- und ausgabe realisieren
Hallo DP! Hallo omata!
Also: Ich glaube, ich verstehe langsam... Das da ist glaube ich etwa das was ich brauche: ![]() Stichwort "BASS_ChannelGetData". Fraaaage. Wie sind die Daten darin organisiert/wie hängt die Organisation der Daten von der aktuellen Umgebung und den Parametern ab? Genauer: An welcher Stelle finde ich hier im generierten Array z.B. die Frequenz 480 hz? (Habe mal überflüssige Codezeilen entfernt und den Source in meine Formatierung umgewandelt):
Delphi-Quellcode:
Gruß vom LDer!
function RecordingCallback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
var fft : array[1..512] of single; i : integer; begin BASS_ChannelGetData(Handle, @fft, BASS_DATA_FFT512); for i := 1 to 256 do begin _BitmapOut.Canvas.MoveTo(i, _BitmapOut.Canvas.ClipRect.Bottom); _BitmapOut.Canvas.LineTo(i, _BitmapOut.Canvas.ClipRect.Bottom-round(fft[I] * _BitmapOut.Canvas.ClipRect.Bottom) end; end; |
Re: Sprachein- und ausgabe realisieren
Zitat:
Genauer wird es, wenn du die FFT-Breite erhöst. Bei einer Breite von 4096 ist der Index (480/20000)*2048 = 49 und die wirkliche Frequenz entspricht dann 478.5Hz, das Frequenzraster ist dann 9.8Hz. |
Re: Sprachein- und ausgabe realisieren
Die Lösung klingt vielversprechend und durchaus schlüssig.
Der Haken ist bloß, dass wenn ich den Stereomix abhöre und mir an der Stelle, wo z.B. 8000hz. sein müssten eine rote linie zeichnen lasse und dann per Windows.beep 800hz. anlege, der peak viel zu weit links ist von der Linie - Ich treffe die Linie mit 8800 hz. Kann das an der Soundkarte liegen? verarbeitet meine Soundkarte ein höheres Spektrum? Wie finde ich solche Daten? Ja, Google ist eine gute Idee aber nicht mehr um diese Uhrzeit, wenn die ersten paar Treffer nix bringen; btw ich habe einen realtek AC97 Audiochip... Ich schau morgen mal nach ;-) Gruß vom LDer P.S.: Habe die Konstante nun auf 22000 gesetzt(8800=8000*110%; 22000=20000*110%). Funktioniert. Werde euch über den Status meines Programms auf dem Laufenden halten. |
Re: Sprachein- und ausgabe realisieren
Themensprung zur Sprachausgabe.
Erstmal, hat jemand verständliche Quellen/kann jemand erklären, wie eine Wave-Datei aufgebaut ist? Kann ich in einem Programm Wavedaten puffern, schneiden und abspielen? Dass ich nur einen großen Wave-Stream habe, aus dem ich je nach Bedarf bestimmte Teile kopiere, zu einem neuen Stream zusammensetze und schließlich ausgebe? Gruß vom LDer! |
Re: Sprachein- und ausgabe realisieren
Standard WAVE-Dateien enthalten PCM-Wave Daten. Das heißt, dass der aufgenommene Schalldruck im zeitlichen Verlauf aufgezeichnet wird. Frequenzdaten erhälst du erst nach einer Fourier Transformation (Stichwort FFT).
Eine brauchbare Anlaufstelle über den Aufbau von Wave-Dateien findest du bei Wikipedia: ![]() Die von dir aufgezählten Aufgaben, solltest du mit Memory-Streams (Stichwort TMemoryStream) oder GetMem, Copy und etwas Pointerarithmetik lösen können. |
Re: Sprachein- und ausgabe realisieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz