Tondateien auswerten

Hallo Experten!

Ich programmiere seit ca. einem Jahr VB.
(soll heißen, ich hab ein bisschen Erfahrung)
Jetzt suche ich nach einer Möglichkeit, Audio-Dateien graphisch darzustellen (wie das der Windows Media Player z.B macht)

Es soll nichts graphisch anspruchsvolles sein, ich will nur 2 Tondateien miteinander vergleichen(Lautstärke, Frequenz, Tonhöhe) und Übereinstimmungen feststellen.

Vielen Dank im Vorraus

Rodario

Hallo Rodario,

ich habe mal ein wenig bei ActiveVB ‚gewühlt‘, die Informationen, die ich dort gefunden habe auf das notwendige Minimum reduziert und ein Beispiel daraus gebastelt.

Option Explicit

 Dim na As String
 Dim ff As Integer
 Dim cnt As Long
 Dim ByteArray() As Byte
 Dim IntArray() As Integer
 Dim i As Long

Private Sub Command1\_Click()
 na = "c:\foxnews3[1].wav"
 cnt = FileLen(na)
 ReDim ByteArray(cnt)
 ff = FreeFile
 Open na For Binary As #ff
 Get #ff, , ByteArray()
 Close #ff
 If ByteArray(16) = 16 Then
 ReDim IntArray(cnt / 2)
 Open na For Binary As #ff
 Get #ff, , IntArray()
 Close #ff
 shw16
 Else
 shw8
 End If
End Sub

Private Sub shw8()
 List1.Clear
 For i = 44 To cnt - 1
 List1.AddItem ByteArray(i)
 Next
End Sub

Private Sub shw16()
 List1.Clear
 For i = 22 To cnt / 2 - 1
 List1.AddItem IntArray(i)
 Next
End Sub

Ein wenig ändern und optimieren kannst Du ja selbst, ich nehme an, der Code ist so verständlich. Die zahlen, die Du als grafik ausgeben möchtest stehen nun in der Liste, die als Kurve auszugeben ist nicht mehr schwer, darauf habe ich absichtlich verzichtet, der dazu nötige Code verwirrt mehr als er nützt, das kannst Du selbst.

Gruß, Rainer

Hallo Rainer!

Erst mal Danke!

Ich hab 2 Fragen:

Ich hab den Code jetzt so:

Option Explicit
Dim na As String
Dim ff As Integer
Dim cnt As Long
Dim ByteArray() As Byte
Dim IntArray() As Integer
Dim i As Long
Private Sub Command1_Click()
na = „c:\tada[1].wav“
cnt = FileLen(na)
ReDim ByteArray(cnt)
ff = FreeFile
Open na For Binary As #ff
Get #ff, , ByteArray()
Close #ff
If ByteArray(16) = 16 Then
ReDim IntArray(cnt / 2)
shw16
Else
shw8
End If
End Sub

Private Sub shw8()
List1.Clear
For i = 44 To cnt - 1
List1.AddItem ByteArray(i)
Next
End Sub

Private Sub shw16()
List1.Clear
For i = 22 To cnt / 2 - 1
List1.AddItem IntArray(i)
Next
End Sub

Ich bekomm in der Listbox aber nur Lauter Nullen!

Ich hab „C:\Windows\Media\tada.wav“ genommen, der is nur eine Sekunde lang und hat ziemlich viele Zahlen…

Also jetzt zu meinen angekündigten 2 Fragen:

  1. Ich will später Dateien vergleichen, die max. 5 sek lang sind, also macht das nicht so viel, aber gibt es noch eine andere Möglichkeit, die etwas weniger genau, dafür aber schneller ist?

  2. Wie krieg ich das Problem mit den Nullen hin?
    Ich hab keine Ahnung, an was das liegt!

Wenn nicht nehme ich gerne diese Methode!

Rodario

Ich hab das Problem selbst hingekriegt(bin auch ganz stolz :smile: )

Mit der ListBox war was nicht in Ordnung, wenn ich das in ne Textdatei schreibe kommen auch vvernünftige Werte raus!

Trotzdem vilen Dank für den Code!

Rodario

Hallo,

Ich hab das Problem selbst hingekriegt(bin auch ganz stolz :smile:

freut mich! :smile:

Mit der ListBox war was nicht in Ordnung, wenn ich das in ne
Textdatei schreibe kommen auch vernünftige Werte raus!

Nein, das war es nicht, in der Version, die Du da postest, füllst Du nur das Bytearray mit Zahlen, das IntegerArray nicht, zeigst aber das Integerarray an. Schön wenn es klappt.

Vergleichen ist trotzdem sehr schwer, damit haben sich wegen Spracherkennung schon ganze Forschungsinstitute mit nur geringem Erfolg befasst.

Stell Dir vor, Du hast eine simple Sinuskurve und berechnest nur für ganze X-Werte den Y-Wert. Nun nimmst Du die selbe Kurve, machst das Selbe noch einmal, setzt den Startpunkt aber auf einen Zufälligen Wert zwischen Null und Eins. Du bekommst keine gleichen Werte. Wenn Du die Grafiken vergleichst kannst Du mit bloßem Auge die Ähnlichkeit erahnen, der Computer kann die nicht erkennen. Mach Dich auf heftige Probleme gefasst und runde an der richtigen Stelle heftig.

Viel Erfolg!

Gruß, Rainer

Bis jetzt klappt alles!

Was mir jetzt noch fehlt is ein headset, bei meinem is das Mikro kaputt!

Zu der Sinuskurve:

Du bekommst schon Übereinstimmungenn nämlich die Schnittpunkte(2 pro Abschnitt,wenn ich nicht völlig daneben liege).

Aber mit dem Startpunk hast du mich auf ne Idee gebracht: Was is, wenn der Benutzer nicht am Anfang der Aufnahmephase spricht?

Ich hab das so gelöst:

Dim temp as string
Open „C:\Sprachsteuerung\record.txt“ for Input As #1
(Da stehen die ganzen Zahlen drin)

start:
Input #1,temp
If temp=0 Then GoTo start
.
.
.

Dann der restliche Code

Damit wäre das Problem gelöst, oder?

Hallo,

Damit wäre das Problem gelöst, oder?

das weiß ich so nicht genau, da musst Du testen. Ich bekomme nie Nullen, meine Mikrofonaufnahmen brummen grundsätzlich, wirkliche Stille gibt es da nie.

Du willst tatsächlich eine Spracherkennung auf die Art realisieren? Eventuell hilft es, wenn Du Dich mal mit den veröffentlichten Forschungsergebnissen befasst.

So viel ich da verstanden habe, wird die Kurve meist erst in ihre Bestandteile zerlegt und verschiedene Frequenzanteile getrennt betrachtet. Dort werden Rhythmen analysiert und mit Mustern verglichen. Sprache besteht ja aus mehreren überlagerten Frequenzen, die man rechnerisch trennen kann, dazu reichen meine mathematischen Fähigkeiten aber nicht aus.

Etwas einfacheres ist Dir nicht eingefallen? Ein neues Betriebssystem zum Beispiel? *fg* Ich will Dich nicht entmutigen, aber mir wäre eine Spracherkennung zu kompliziert, würde ich mir nicht zutrauen.

Gruß, Rainer

Hallo,

Du bekommst schon Übereinstimmungenn nämlich die
Schnittpunkte(2 pro Abschnitt,wenn ich nicht völlig daneben
liege).

dazu noch kurz. Dir ist schon klar, daß Du keine wirkliche Kurve hast?

Du hast z.B. die Zahlen:
0, 215, 232, 36, -193, -245, -71

mit neuem Startwert dann:
24, 227, 220, 11, -209, -236, -46

Da herauszufinden, daß das die selbe Kurve ist, stelle ich mir schon schwer vor. Noch schwerer wird es, wenn die Frequenz abweicht.

Gruß, Rainer

Hallo Rainer!

Es ist nur ein kleiner Versuch, ob man es einigermaßen zuverlässig auf diese Weise realisieren kann…

Ich hab mit meinem Frund ein bisschen „rumgealbert“ und wir kamen irgendwie auf einen sprachgesteuerten Kühlschrank.

Da hab ich gemeint, ich versuch mich mal an der Sprachsteuerung

Auch mein mathematisches Wissen wird wohl nicht ausreichen, um so etwas wirklich zu realisieren, wie gesagt, es ist nur ein kleiner Test, Ich bin in der 11. Klasse und wir fangen gerade Differenzialrechnung an. Weit komme ich mit meinem Wissen nicht :smiley:

Gruß Rodario

Hallo Rodario,

Es ist nur ein kleiner Versuch, ob man es einigermaßen
zuverlässig auf diese Weise realisieren kann…

Ich hab mit meinem Frund ein bisschen „rumgealbert“ und wir
kamen irgendwie auf einen sprachgesteuerten Kühlschrank.

Da hab ich gemeint, ich versuch mich mal an der
Sprachsteuerung

Klar, mal experimentieren kann man immer mal, und auf dem Weg lernt man mit VB besser umzugehen. Was direkt VB angeht, freue ich mich über jede Frage, mit API-Aufrufen lässt sich oft der Code beschleunigen, da kenne ich mich inzwischen recht gut aus.

Auch mein mathematisches Wissen wird wohl nicht ausreichen, um
so etwas wirklich zu realisieren, wie gesagt, es ist nur ein
kleiner Test, Ich bin in der 11. Klasse und wir fangen gerade
Differenzialrechnung an.

Differentialrechnung? … Da war doch mal was … Ich glaube das war 1975 als ich das an der ‚Ingenierschule für Maschinenbau Berlin‘ gelernt habe. :smile: Alles vergessen! Pass gut auf, wenn ich da etwas brauche, frage ich Dich. :smile:

Gruß, Rainer