私は、WAV ファイル内の無音を検出する .NET クライアント アプリを構築する任務を負っています。
これは組み込みの Windows API で可能ですか? または、これを支援する優れたライブラリはありますか?
オーディオ分析は、多くの複雑な数学を必要とする難しいものです(フーリエ変換を考えてください)。あなたが尋ねなければならない質問は「沈黙とは何か」です。編集しようとしているオーディオがアナログソースからキャプチャされている場合、無音がない可能性があります...それらはソフトノイズ(ラインハム、周囲のバックグラウンドノイズなど)の領域のみになります。
とはいえ、機能するアルゴリズムは、最小ボリューム(振幅)しきい値と期間(たとえば、2秒以上で<10dbA)を決定し、この基準を満たす領域を探すために波形のボリューム分析を実行することです。 (おそらくミリ秒スパイク用のいくつかのフィルターを使用)。私はこれをC#で書いたことがありませんが、このCodeProjectの記事は面白そうです。波形を描画するためのC#コードについて説明しています...これは、他の振幅分析を行うために使用できるのと同じ種類のコードです。
http://www.codeproject.com/Articles/19590/WAVE-File-Processor-in-C
これには、無音部分を取り除き、ウェーブファイルをミックスするために必要なすべてのコードが含まれています。
楽しみ。
私はNAudioを使用しています。オーディオ ファイルの無音を検出して、レポートまたは切り捨てを行うことができるようにしたいと考えていました。
多くの調査の後、私はこの基本的な実装を思い付きました。AudioFileReader
そこで、ファイルの先頭/末尾、または特定の位置から始まる無音時間を返すクラスの拡張メソッドを作成しました。
ここ:
static class AudioFileReaderExt
{
public enum SilenceLocation { Start, End }
private static bool IsSilence(float amplitude, sbyte threshold)
{
double dB = 20 * Math.Log10(Math.Abs(amplitude));
return dB < threshold;
}
public static TimeSpan GetSilenceDuration(this AudioFileReader reader,
SilenceLocation location,
sbyte silenceThreshold = -40)
{
int counter = 0;
bool volumeFound = false;
bool eof = false;
long oldPosition = reader.Position;
var buffer = new float[reader.WaveFormat.SampleRate * 4];
while (!volumeFound && !eof)
{
int samplesRead = reader.Read(buffer, 0, buffer.Length);
if (samplesRead == 0)
eof = true;
for (int n = 0; n < samplesRead; n++)
{
if (IsSilence(buffer[n], silenceThreshold))
{
counter++;
}
else
{
if (location == SilenceLocation.Start)
{
volumeFound = true;
break;
}
else if (location == SilenceLocation.End)
{
counter = 0;
}
}
}
}
// reset position
reader.Position = oldPosition;
double silenceSamples = (double)counter / reader.WaveFormat.Channels;
double silenceDuration = (silenceSamples / reader.WaveFormat.SampleRate) * 1000;
return TimeSpan.FromMilliseconds(silenceDuration);
}
}
これは、 WAV だけでなく、ほぼすべてのオーディオ ファイル形式を受け入れます。
使用法:
using (AudioFileReader reader = new AudioFileReader(filePath))
{
TimeSpan duration = reader.GetSilenceDuration(AudioFileReaderExt.SilenceLocation.Start);
Console.WriteLine(duration.TotalMilliseconds);
}
参考文献:
沈黙を検出するための組み込みAPIはないと思います。しかし、ラウドネスを見つけるために、いつでも古き良き数学/目立たない信号処理を使用することができます。ここに小さな例があります:http://msdn.microsoft.com/en-us/magazine/cc163341.aspx
ソックスを使用。先頭と末尾の無音を削除できますが、アプリから exe として呼び出す必要があります。
C# を使用して WAV ファイル内のオーディオ無音を検出する の以下のコードを参照してください。
private static void SkipSilent(string fileName, short silentLevel)
{
WaveReader wr = new WaveReader(File.OpenRead(fileName));
IntPtr format = wr.ReadFormat();
WaveWriter ww = new WaveWriter(File.Create(fileName + ".wav"),
AudioCompressionManager.FormatBytes(format));
int i = 0;
while (true)
{
byte[] data = wr.ReadData(i, 1);
if (data.Length == 0)
{
break;
}
if (!AudioCompressionManager.CheckSilent(format, data, silentLevel))
{
ww.WriteData(data);
}
}
ww.Close();
wr.Close();
}