質問
私は将ビル。NET clientのアプリを検出す静寂、WAVファイルです。
こんなことが可能なので、内蔵のWindows Api?或いは、良い図書館がある。
解決
オーディオ分析が難しいものを必要に多くの複雑な数学(フーリエ変換).の質問ください"どのような)場合は、オーディオが主張しようとしているの編集が捕獲したアナログからソースをチャンスはありません静寂---もみのソフトノイズ(ラインハム周囲の背景ノイズです。
すべてとはいえ、アルゴリズムが働きを決める最低量(振幅の閾値との間に(例えば、 <10dbA2秒以上)、そのように量分析の波形を探る本基準の(おそらくいくつかのフィルタミリ秒のスパイク).そん書きにこのスレッドセーフで、C#、この CodeProject第 面白;で記述したC#コードで波形を描く...それが、同じようなコードされる可能性のある他の振幅の解析。
他のヒント
http://www.codeproject.com/Articles/19590/WAVE-File-Processor-in-C
このことがすべてのコードに必要なグレーのクラムシェル型クランプ無音、ミックスwaveファイルです。
楽しめます。
したい場合に効率的に計算し、平均力のスライドウィンドウスクエアでは、各サンプルを追加しランニングます。減算、乗値からNのサンプルしていけるようになっています。そして先週末、例のギフトショップへ。これは、最も単純な形 CIC フィルター Parsevalの定理 が出てくるというこの電力計算用の両方の時間周波数領域.
もたらすために追加 ヒステリシス のを回避するための切り替えオ急時の電力レベルは、閾値レベル。
を使用してい 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を検出のための沈黙を強いられるものでした。ものを利用できることがgood ol'数学/discreete信号処理エラウドネス.こちらは小例: http://msdn.microsoft.com/en-us/magazine/cc163341.aspx
使用 Sox.を除去できることの先頭と最後の換ができない電話としてexeからのアプリです。
参照コードは下記から 検出オーディオの静寂のWAVファイルを使用C#
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();
}