Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Sprachein- und ausgabe realisieren (https://www.delphipraxis.net/129662-sprachein-und-ausgabe-realisieren.html)

LDericher 23. Feb 2009 14:11


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:
//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;
So dass ich dann die Daten über ein lineares neuronales Netz weiterverarbeiten kann...
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]

omata 24. Feb 2009 02:26

Re: Sprachein- und ausgabe realisieren
 
Vielleicht hilft dir das hier ja ein bißchen weiter.

LDericher 24. Feb 2009 12:09

Re: Sprachein- und ausgabe realisieren
 
Zitat:

Zitat von omata
Vielleicht hilft dir das hier ja ein bißchen weiter.

Die Dokumentation ist zwar recht hilfreich, aber auch nur, was die Erkennung angeht.
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.

LDericher 24. Feb 2009 14:07

Re: Sprachein- und ausgabe realisieren
 
Zitat:

Zitat von omata
Vielleicht hilft dir das hier ja ein bißchen weiter.

Gerade ist mir erst aufgefallen, dass du ja der Autor BIST -.- ... Also: könntest du ein paar Wörtchen zum Thema Aufnahme verlieren?

Gruß LDer.

LDericher 27. Feb 2009 15:19

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:
http://www.delphipraxis.net/internal...light=frequenz

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:
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;
Gruß vom LDer!

omata 27. Feb 2009 22:44

Re: Sprachein- und ausgabe realisieren
 
Zitat:

Zitat von Superwinger
Genauer: An welcher Stelle finde ich hier im generierten Array z.B. die Frequenz 480 hz?

Da deine Soundkarte maximal 20KHz verarbeiten kann, markiert dieser Wert schonmal die ober Schranke für weitere Berechnungen. Bei einer FFT-Breite von 512 ergeben sich 256-Frequenzwerte. Das Frequenzraster ist demnach 78Hz groß. Der Index, der 480Hz entspricht ist also (480/20000)*256 = 6. Dabei ist die wirkliche Frequenz (6/256)*20000 = 468.75Hz.
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.

LDericher 27. Feb 2009 23:11

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.

LDericher 28. Feb 2009 15:43

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!

igel457 28. Feb 2009 15:58

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: http://de.wikipedia.org/wiki/RIFF_WAVE

Die von dir aufgezählten Aufgaben, solltest du mit Memory-Streams (Stichwort TMemoryStream) oder GetMem, Copy und etwas Pointerarithmetik lösen können.

omata 28. Feb 2009 21:35

Re: Sprachein- und ausgabe realisieren
 
Zitat:

Zitat von Superwinger
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?

Diese ganzen Dinge verwende ich alle in meinem oben angegebenen Beispiel.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz