2015-02-20 14 views
9

Ich benutze FMOD, um eine Anwendung zu entwickeln, die sofort beginnt, die Aufnahme des nächsten/vorherigen Satzes genau von Anfang an in einer MP3-Datei abzuspielen, die Sprache ohne Musik enthält, wenn der Benutzer auf die Schaltfläche Weiter/Zurück klickt. Ich habe die PCM-Daten von einer MP3-Datei von Ton Aufruf :: sperren, aber Ton :: GetFormat nur mir gesagt, dass es „16bit_integer PCM-Daten“ ist, ohne zu sagen, ob es oder unsigned unterzeichnet. Woher soll ich das wissen?Bedeutet "16bit ganzzahlige PCM-Daten", dass es signiert oder unsigniert ist?

Einige Artikel im Internet sagen, dass fast alle 16-Bit-Integer-PCM-Daten sind unterzeichnet. Wenn meine PCM-Daten mit signiert sind, welcher Wertebereich steht für Stille, sind diese Werte nahe bei 0 (z. B. -10 ~ 10) oder nahe bei -32768 (z. B. -32768 ~ -32750)? Wenn sie die Werte nahe 0 sind, bedeutet dies, dass es keinen Unterschied in der Bedeutung zwischen entgegengesetzten Zahlen wie -32767 und 32767 gibt?

Ich brauche Stille, die lang genug sind, z.B. länger als 500 ms, um zu bestimmen, wo jeder Satz in der Rede beginnt.

Könnte mir jemand Vorschläge machen, wie man Stille zwischen Sätzen erkennt?

Antwort

17

16-Bit-Audio ist per Konvention normalerweise signiert.

Denken Sie darüber nach, was PCM-Audio ist: Jedes Maß ist, wie weit der Lautsprecher in diesem Moment physisch ruhen sollte. Daher ist perfekte Stille absolut jeder sich wiederholende Wert - das bedeutet, dass sich der Sprecher nicht bewegt.

0 ist dann das Zentrum der Palette, und in der Regel, wo ein Mikrofon ohne Eingabe sein sollte. -32768 ist der Sprecher so nahe wie möglich an einem Ende seiner Achse, 32767 ist es am anderen Ende.

Der sicherste Weg, Stille zu erkennen, wäre, eine Spektralanalyse über den relevanten Bereich durchzuführen und nach Perioden zu suchen, in denen keine Aktivität in irgendeinem hörbaren Frequenzbereich auftritt.

Wenn Sie Pausen zwischen Sprache suchen, dann wäre die einfachste Sache wahrscheinlich zu irgendwo wie this gehen, einen akzeptablen Frequenzbereich für Sprache (es wird angenommen, um 300Hz bis etwa 3500Hz in der Telefonie sein), Ihre Abtastrate und wie viele Multiplikationen Sie denken, dass Sie sich leisten können. Kopiere die gelieferten Koeffizienten. Z.B. Ich nahm man 37 Taps mit einem 44100 Hz Eingang über den Sprachbereich zu tun, und in C-Array umgewandelt, ich habe:

double coefficients[] = { 
    -0.000560, -0.001290, -0.002332, -0.003606, -0.004911, -0.005921, -0.006201, 
    -0.005256, -0.002610, 0.002106, 0.009059, 0.018139, 0.028924, 0.040691, 0.052479, 
    0.063203, 0.071794, 0.077351, 0.079274, 0.077351, 0.071794, 0.063203, 0.052479, 
    0.040691, 0.028924, 0.018139, 0.009059, 0.002106, -0.002610, -0.005256, -0.006201, 
    -0.005921, -0.004911, -0.003606, -0.002332, -0.001290, -0.000560}; 

Wenn es double eingegeben wurde, für jeden Eingangsabtastwert c Ich würde dann berechnen ein Abtastwert:

double *inputWave = ... input, an infinite array for the purposes of the example ... 
double sampledValue = 0.0; 
for(size_t coeff = 0; coeff < numberOfTaps; coeff++) { 
    sampledValue += coefficients[coeff] * inputWave[c + coeff]; 
} 

// (where numberOfTaps = sizeof(coefficients)/sizeof(coefficients[0]), 
// i.e. the number of coefficients: 37 with the array given above) 

Was ich dann habe, ist ein Bandpassfilter. Nur der Teil des Signals, der den Ton im Frequenzbereich 300-3500 Hz darstellt, sollte in den Ausgangswerten verbleiben. Im wirklichen Leben ist kein solcher Filter perfekt; Erhöhen Sie die Anzahl der Koeffizienten, um die Qualität Ihres Filters zu erhöhen.

Nach dem Schneiden irrelevanter Teile des Signals konnte ich dann für längere Zeiträume von 10 suchen.

+0

Vielen Dank, Tommy. Ich dachte, ich müsste nur die PCM-Daten mit einer Zahl direkt vergleichen, um die Pausen zwischen Sätzen zu finden. Entschuldige meine Ignoranz, aber was bedeutet "taps"? Warum sollte es 37 Wasserhähne geben?Bezieht sich das Array inputWave [] auf die PCM-Daten wie die 16-Bit-Ganzzahlen, die ich erwähnt habe? Und soll Ihr Beispielcode bestimmen, ob das Beispiel inputWave [c] Stille darstellt? Sorry für so viele Fragen und mein schlechtes Englisch. – xiaokaoy

+0

Taps ist der Signalverarbeitungsterm für die Anzahl der Eingangsabtastwerte, die kombiniert werden, um eine Ausgangsabtastung durchzuführen. Es kommt mehr aus der Hardware-Tradition Seite der Dinge. Es muss nicht 37 sein, das ist nur der Standard auf dieser Seite. Sie sollten wahrscheinlich basierend auf subjektive Leistung wählen - mehr = besser, im Allgemeinen. Was die CPU-Leistung angeht, schauen Sie sich die SIMD-Einheit Ihres Prozessors für das Ganze an (was bedeuten kann, dass Sie eher Kurzschlüsse als Doppelpunkte verwenden, aber was auch immer). Die Ausgabe ist eine gefilterte Welle. Sie können es direkt hören. Suchen Sie längere Zeit in der Nähe von 0, um Stille zu finden. – Tommy