ffmpeg를 사용하여 배경 소음을 줄이고 오디오 클립의 음성을 최적화합니다.

ffmpeg를 사용하여 배경 소음을 줄이고 오디오 클립의 음성을 최적화합니다.

음성 인식을 위해 비디오 파일에서 오디오 클립을 추출합니다. 이러한 영상은 모바일/기타 핸드메이드 기기에서 제작되므로 노이즈가 많이 포함되어 있습니다. 음성 인식 엔진에 전달하는 음성이 명확하도록 오디오의 배경 소음을 줄이고 싶습니다. 나는 이 모든 작업을 수행하기 위해 ffmpeg를 사용하고 있지만 노이즈 감소 단계에서 멈춰 있습니다.

지금까지 나는 다음 필터를 시도했습니다.

ffmpeg-20140324-git-63dbba6-win64-static\bin>ffmpeg -i i nput.wav -filter_complex "highpass=f=400,lowpass=f=1800" out2.wav

ffmpeg -i i nput.wav -af "equalizer=f=1000:width_type=h:width=900:g=-10" output.wav

ffmpeg -i i nput.wav -af "bandreject=f=1200:width_type=h:width=900:g=-10" output.wav

하지만 결과는 매우 실망스럽습니다. 내 추론은 음성이 300-3000hz 범위에 속하기 때문에 다른 모든 주파수를 필터링하여 배경 소음을 억제할 수 있다는 것입니다. 내가 무엇을 놓치고 있나요?

또한 음성 향상에 사용할 수 있는 위너 필터에 대해 읽었으며 이를 발견했습니다.이것하지만 어떻게 사용하는지 잘 모르겠습니다.

답변1

가청 음성을 분리하려는 경우 저역 통과 필터와 고역 통과 필터를 결합해 보십시오. 사용 가능한 오디오의 경우 200hz 이하를 필터링한 다음 3000hz 이상을 필터링하면 사용 가능한 음성 오디오를 유지하는 데 매우 효과적이라는 것을 알았습니다.

ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>

이 예에서는 먼저 고역 통과 필터를 추가하여 낮은 주파수를 차단한 다음 저역 통과 필터를 사용하여 더 높은 주파수를 차단합니다. 필요한 경우 이를 통해 파일을 두 번 이상 실행하여 절단 주파수 범위 내에서 더 높은 db 주파수를 정리할 수 있습니다.

답변2

FFmpeg에는 이제 노이즈 배경을 처리하는 3개의 기본 필터가 있습니다.

  • afftdn: FFT를 사용하여 오디오 샘플의 잡음을 제거합니다.
  • anlmdn: Non-Local Means 알고리즘을 사용하여 오디오 샘플의 광대역 잡음을 줄입니다.
  • arnndn: 순환 신경망을 사용하여 음성의 소음을 줄입니다. 로드할 모델 파일의 예를 찾을 수 있습니다.여기.

또한, 언젠가부터 FFmpeg와 함께 ladspa(잡음 억제기 찾기) 및/또는 lv2(음성 제거기 찾기) 필터를 사용할 수 있습니다.

답변3

업데이트: afftdn아래에 설명된 FFT-bin별 노이즈 임계값 방법을 사용하는 FFmpeg가 최근 추가되었으며, 적절한 임계값을 즉석에서 조정/파악하기 위한 다양한 옵션이 포함되어 있습니다.

anlmdn(비로컬 수단)은 비디오에 잘 작동하는 기술입니다. 오디오 필터는 사용해보지 못했습니다.

둘 중 하나는 다음 중 하나여야 합니다.많이유일한 소음이 60Hz 험 같은 것이 아니라면 하이패스/로우패스보다 낫습니다. (사람의 말은 꽤 좁은 대역 통과에서도 여전히 괜찮게 들릴 수 있지만 광대역 잡음 배경 히스를 제거하는 훨씬 더 나은 방법이 있습니다.)


ffmpeg에는 잡음 감소를 위한 적절한 오디오 필터가 내장되어 있지 않습니다. Audacity에는 상당히 효과적인 NR 필터가 있지만 잡음 샘플과 입력만으로 2패스 작업에 사용하도록 설계되었습니다.

맨 위에 달린 댓글은https://github.com/audacity/audacity/blob/master/src/ Effects/NoiseReduction.cpp그것이 어떻게 작동하는지 설명하십시오. (기본적으로 임계값 아래에 있는 모든 FFT 빈을 억제합니다. 따라서 해당 주파수 대역의 노이즈 플로어보다 큰 경우에만 신호를 통과시킵니다. 문제를 일으키지 않고 놀라운 일을 할 수 있습니다. 이는 적응하는 대역 통과 필터와 같습니다. 잡음 에너지는 전체 스펙트럼에 분산되므로 몇 개의 좁은 대역만 통과시키면 전체 잡음 에너지가 많이 줄어듭니다.

또한보십시오오디오 소음 감소: 대담성은 다른 옵션과 어떻게 비교됩니까?작동 방식에 대한 자세한 내용과 어떤 방식으로든 FFT 빈을 임계값으로 설정하는 것이 일반적인 상업용 노이즈 감소 필터의 기초라는 점을 알아보세요.

해당 필터를 ffmpeg로 포팅하는 것은 약간 어색할 것입니다. 아마도 2패스 필터 대신 2개의 입력이 있는 필터로 구현하는 것이 가장 효과적일 것입니다. 노이즈 프로필을 얻는 데 몇 초밖에 걸리지 않기 때문에 전체 파일을 읽어야 하는 것과는 다릅니다. 그리고 어쨌든 전체 오디오 스트림을 노이즈 샘플로 공급해서는 안 됩니다. 각 FFT 빈에 대한 임계값을 설정하려면 JUST 노이즈 샘플을 확인해야 합니다.

예, 2pass 대신 2nd 입력이 의미가 있습니다. 그러나 이는 대부분의 ffmpeg 필터보다 사용하기가 훨씬 덜 쉽습니다. 스트림 분할/시간 범위 추출을 사용하면 많은 부두가 필요합니다. 물론 여러 입력 파일에 적합한 별도의 파일에 노이즈 샘플이 없으면 수동 개입이 필요합니다. (동일한 마이크/설정의 하나의 노이즈 샘플은 해당 설정의 모든 클립에 적합해야 합니다.)

답변4

완료하려면사용자564335님의 답변:

이것: -af arnndn=m=cb.rnnn 아마도 내가 사용해 본 최고의 노이즈 필터일 것입니다.ffmpeg(AI 기반).

이와 같이:

ffmpeg -i <input_file> -af arnndn=m=cb.rnnn <output_file>

주파수 대역 필터가 필요하지 않습니다. 훈련된 모델( files.rnnn)여기에서 사용 가능(파일 중 하나를 다운로드하여 사용해야 합니다).

cb( ) 모델 conjoined-burgers은 제가 찾은 모델입니다.가장 인상적인그리고 다재다능합니다. 나는 또한 이 필터가 매우 효율적이라는 것을 알았습니다(예를 들어 필터보다 더 많은 CPU를 사용하지 않는 것 같습니다 loudnorm).


또한 ffmpeg 5.0부터 새로운 노이즈 필터가 있습니다.afwtdn.

제 기억으로는 시도해 보았지만 IMHO 위의 훈련된 신경망만큼 효율적이지는 않았습니다.

관련 정보