문제

저는 WAV 파일에서 무음을 감지하는 .NET 클라이언트 앱을 구축하는 임무를 맡고 있습니다.

내장된 Windows API를 사용하면 이것이 가능합니까?아니면 이 문제를 해결하는 데 도움이 되는 좋은 라이브러리가 있나요?

도움이 되었습니까?

해결책

오디오 분석은 복잡한 수학이 많이 필요한 어려운 작업입니다(푸리에 변환을 생각해 보세요).당신이 물어봐야 할 질문은 "침묵이란 무엇인가"이다.편집하려는 오디오가 아날로그 소스에서 캡처된 경우 무음이 없을 가능성이 높습니다...이는 단지 부드러운 소음(라인 험, 주변 배경 소음 등)이 있는 영역일 뿐입니다.

즉, 작동해야 하는 알고리즘은 최소 볼륨(진폭) 임계값과 지속 시간(예: 2초 이상 <10dbA)을 결정한 다음 이 기준을 충족하는 영역을 찾기 위해 파형의 볼륨 분석을 수행하는 것입니다. (아마도 밀리초 스파이크에 대한 일부 필터 포함)나는 이것을 C#으로 작성한 적이 없지만 CodeProject 기사 재미있어보이네요;파형을 그리는 C# 코드를 설명합니다.이는 다른 진폭 분석을 수행하는 데 사용할 수 있는 것과 동일한 종류의 코드입니다.

다른 팁

http://www.codeproject.com/Articles/19590/WAVE-File-Processor-in-C

여기에는 묵음을 제거하고 웨이브 파일을 혼합하는 데 필요한 모든 코드가 포함되어 있습니다.

즐기다.

슬라이딩 윈도우에 대한 평균 전력을 효율적으로 계산하려면 다음을 수행하십시오.각 샘플을 제곱한 다음 누계에 추가합니다.이전 N개 샘플에서 제곱값을 뺍니다.그런 다음 다음 단계로 이동합니다.이것은 가장 간단한 형태의 a이다. CIC 필터. 파세발의 정리 이 전력 계산은 시간 영역과 주파수 영역 모두에 적용 가능하다는 것을 알려줍니다.

또한 추가하고 싶을 수도 있습니다 히스테리시스 전력 레벨이 임계값 레벨 근처에서 춤을 추고 있을 때 빠르게 스위치를 켜고 끄는 것을 방지하기 위해 시스템에 적용됩니다.

나는 사용하고있다 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();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top