web-dev-qa-db-ja.com

「16ビット整数PCMデータ」とは、符号付きまたは符号なしを意味しますか?

私はFMODを使用して、ユーザーが[次へ/前へ]ボタンをクリックすると、音楽なしで音声を含むMP3ファイルの最初から次/前の文の録音の再生をすぐに開始するアプリケーションを開発しています。 Sound :: lockを呼び出してmp3ファイルのPCMデータを取得しましたが、Sound :: getFormatは、「16ビット整数PCMデータ」であるとだけ言っていました。 符号付きまたは符号なしでした。どうすればそれを知ることができますか?

インターネット上のいくつかの記事は、ほとんどすべての16ビット整数PCMデータが署名済みであると述べています。 PCMデータがsignedの場合、無音を表す値の範囲、0に近い値(例:-10〜10)、または-32768に近い値(例:-32768〜-32750)?それらが0に近い値である場合、これは、-32767と32767のような反対の数値の意味に違いがないことを意味しますか?

十分な長さの無音を検出する必要があります。スピーチの各文がどこから始まるかを決定するために、500msより長い。

文間の沈黙を検出する方法について誰かが私に何か提案をしてもらえますか?

11
xiaokaoy

慣例により、16ビットオーディオは通常署名されています。

PCMオーディオとは何かを考えてみてください。各測定値は、その時点でスピーカーが物理的に静止する軸に沿った距離です。したがって、完全な沈黙とは、絶対に繰り返される値です。つまり、スピーカーが動かないことを表します。

その場合、0は範囲の中心であり、通常は入力のないマイクがあるべき場所です。 -32768は、軸の一方の端にできるだけ近いスピーカーであり、32767はもう一方の端にあります。

無音を検出する最も安全な方法は、関連する範囲でスペクトル分析を実行し、可聴周波数範囲で活動がない期間を探すことです。

スピーチ間の一時停止を探している場合、最も簡単なことはおそらく this のような場所に行き、スピーチの許容周波数範囲をプラグインすることです(テレフォニーでは約300Hzから約3500Hzと見なされます) )、サンプリングレート、および余裕があると思われる多くの乗算。提供された係数をコピーします。例えば。 44100Hzの入力で音声範囲全体で37タップを実行すると仮定し、Cアレイに変換すると、次のようになります。

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};

double入力の場合、各入力サンプルcについて、サンプル値を計算します。

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)

私が持っているのはバンドパスフィルターです。 300〜3500Hzの周波数範囲の音を表す信号のその部分のみが出力値に残る必要があります。実生活では、そのようなフィルターは完璧ではありません。係数の数を増やして、フィルターの品質を高めます。

信号の無関係な部分を切り取ったので、sampledValue = [close to] 0.0の長期間を探すことができました。

19
Tommy