오디오 엔벨로프 시작 및 중지 위치를 감지하는 가장 간단한 방법


43

아래는 말하는 사람의 녹음을 나타내는 신호입니다. 이를 바탕으로 일련의 작은 오디오 신호를 만들고 싶습니다. '중요한'사운드가 시작되고 끝나는시기를 감지하고이를 마커로 사용하여 새로운 오디오 조각을 만드는 아이디어입니다. 다시 말해, 오디오 '청크'가 시작 또는 중지 된 시점에 대한 표시로 침묵을 사용하고이를 기반으로 새로운 오디오 버퍼를 만들고 싶습니다.

예를 들어 사람이 자신의

Hi [some silence] My name is Bob [some silence] How are you?

그런 다음 이것으로부터 3 개의 오디오 클립을 만들고 싶습니다. 하나는 Hi, 다른 My name is Bob하나는 말합니다 How are you?.

저의 초기 아이디어는 오디오 버퍼를 통해 진폭이 낮은 영역이 있는지 지속적으로 확인하는 것입니다. 어쩌면 처음 10 개의 샘플을 가져 와서 값을 평균화하고 결과가 낮 으면 침묵으로 표시하십시오. 다음 10 개의 샘플을 확인하여 버퍼를 진행합니다. 이 방법으로 증가하면 봉투가 시작되고 중지되는 위치를 감지 할 수 있습니다.

누군가 좋은 일에 대한 조언을 가지고 있지만 이를 수행하는 간단한 방법이 있다면 좋을 것입니다. 내 목적을 위해 솔루션 아주 기초 있습니다.

저는 DSP 전문가가 아니지만 몇 가지 기본 개념을 이해합니다. 또한 프로그래밍 방식 으로이 작업을 수행하므로 알고리즘 및 디지털 샘플에 대해 이야기하는 것이 가장 좋습니다.

모든 도움을 주셔서 감사합니다!

여기에 이미지 설명을 입력하십시오


편집 1

지금까지 큰 반응! 이것이 라이브 오디오에 있지 않다는 것을 분명히하고 싶었고 C 또는 Objective-C로 직접 알고리즘을 작성하므로 라이브러리를 사용하는 솔루션은 실제로 옵션이 아닙니다.


1
침묵의 기간을 중단 점으로 사용하여 분리하려고하는 것처럼 들립니다. "침묵"을 결정하기 위해 전력 임계 값을 사용하고 휴식 시간을 구성하기에 충분한 시간을 결정하는 임계 값 시간을 갖는 이유는 무엇입니까?
Jim Clay

@JimClay 예, 정확히 내가하려고하는 것입니다. 전력 임계 값에 대해 들어 본 적이 없지만 사용할 수있는 것 같습니다. 복잡합니까? 조금 확장 해 주시겠습니까?
Eric Brotto

@EricBrotto 아마도 당신이 당신의 라이브러리에 어떤 기능이 있는지에 대해 조금 이야기해야 할 것입니다. 그렇게하면 실제 방법론을 더 잘 마사지 할 수 있습니다.
Spacey

무음 감지에 대한이 접근법은 더 낫습니다. 0.05 이외의 서스테인 레벨은 무엇입니까? x wavread ( 's1.wav'); i = 1; abs (x (i)) <0.05 % 침묵 검출 i = i + 1; 끝 x (1 : i) = []; x (6000 : 10000) = 0;
zeee

답변:


26

이것은 음성 감지 의 고전적인 문제입니다 . 가장 먼저해야 할 일은 구글에게 개념이다. 그것은 디지털 통신에 널리 사용되며 그 주제에 대한 많은 연구가 있었고 좋은 논문이 있습니다.

일반적으로 처리해야 할 배경 소음이 많을수록 음성 감지 방법이 더 정교해야합니다. 조용한 방에서 촬영 한 녹화물을 사용하는 경우 매우 쉽게 (나중에) 수행 할 수 있습니다. 누군가가 말하고있는 동안 (트럭이 지나가거나, 개가 짖고, 판이 부서지고, 외계인이 공격하고), 모든 종류의 소음이 있다면 훨씬 더 영리한 것을 사용해야합니다.

첨부 한 파형을 보면 노이즈가 최소화되므로 다음을 제안합니다.

  1. 신호 엔벨로프 추출
  2. 좋은 임계 값을 선택
  3. 엔벨로프 크기가 ​​임계 값을 초과하는 장소 감지

이것이 무엇을 의미합니까? 신호 의 엔벨로프 는 주파수 내용이 어떻게 진동하는지에 관계없이 시간에 따른 크기를 나타내는 곡선입니다 (아래 이미지 참조).

여기에 이미지 설명을 입력하십시오

봉투 추출은 원래 신호의 절대 값을 포함하는 새로운 신호를 생성하여 수행 할 수 있습니다. 예를 들어 는 를 입력 한 다음 결과를 저역 필터링 합니다. 가장 간단한 저역 통과 필터는 각 샘플 값 을 양쪽 의 N 이웃 평균으로 대체하여 구현할 수 있습니다 . N 의 최상의 값은 실험적으로 찾을 수 있으며 샘플링 속도와 같은 여러 가지에 따라 달라질 수 있습니다.{ 1 , 45 , 6 , 2 , 43 , 2 }{1,45,6,2,43,2}{1,45,6,2,43,2}

노이즈가 거의없는 이미지에서 신호 엔벨로프가 항상 특정 임계 값 (음량 수준)보다 높으며 해당 영역을 음성 감지 영역 으로 간주 할 수 있습니다 .


3
나는 이것을 good'ol winamp의 플러그인 중 하나로 실제로 구현했습니다. 당신이 묘사하는 것은 좋지만 충분하지 않습니다. 일반적으로 유성음 (모음)과 무성음 (자음)이 있습니다. 유성음 만 있었다면 설명하는 내용이 효과가 있지만 무성음은 에너지가 매우 적으며 일반 소음과 구별 할 수 없습니다. 또한 소음이없는 조건은 스튜디오에서도 매우 드 rare니다.
Dipan Mehta

파이썬에서 이것을 달성하는 방법?
kRazzy R

26

실제로하고 싶은 것을 본질적으로 음성 활동 감지 또는 음성 감지라고합니다.

기본적으로 순수한 음성 신호 (음악 없음)에는 세 부분이 있습니다.

  1. 유성음-기본적으로 모음에 의해 발생
  2. 무성음-자음이 들어 있습니다.

인간의 소리의 특징은 많은 소리가 유성음에 사용되지만 실제 정보는 자음에 포함되도록하는 것입니다. 또한, 유성음은 보통 무성음이 높을수록 낮은 주파수입니다. [정확하게 말하면, 모든 사람의 음은 자신의 피치 인 주어진 사람에 대해 일정한 주파수로 공명됩니다].

이제 모든 시스템에 노이즈가 있습니다. 유성음은 일반적으로 눈에 잘 띄도록 충분히 강력합니다. 더 낮은 주파수 필터링을 적용하면 좋은 크기의 유성음을 수집 할 수 있지만 무성음 (모든 풍부한 정보 포함)이 손실됩니다.

그것을 해결하는 방법에 대한 질문에 :

비결은 소리가 여전히 공명 소스에서 나온다는 사실입니다. 본질적으로 특정 주파수로 제한됩니다. 어디에서나, 소음은 다소 균일하다. 따라서 세 가지를 모두 구별하는 간단한 방법은 "로컬 파워"또는 대안이지만 윈도우 자동 상관을 취하는 것입니다.

한 번에 100 개의 샘플을 말하고 자동 상관 관계를 맺고 노이즈 만 포함하면 결과는 음성 신호와 같이 거의 제로가됩니다 (이것은 백색 노이즈의 특성입니다).이 크기는 신호 때문에 관찰 할 수 있습니다 여전히 더 나은 구조를 가지고 있습니다. 이것은 과거에 저에게 효과적이었습니다.

VAD는 활발한 연구 분야였습니다. 거의 모든 휴대 전화 통신에서 비 음성 부분을 감지하여 인코딩에서 제거하려고하기 때문입니다. 그러나 음성이 아닌 음성을 제거하면 전화 통신이 쓸모 없게됩니다.

G.729 표준은 라인 스펙트럼 주파수, 전대역 에너지, 저 대역 에너지 (<1 kHz) 및 제로 크로싱 속도와 같은 기능을 기반으로 VAD를 계산합니다.

GSM 표준은 다음과 같이 작동합니다. 옵션 1은 9 개의 대역으로 SNR을 계산하고이 값에 임계 값을 적용합니다. 옵션 2는 채널 전력, 음성 메트릭 및 잡음 전력과 같은 다양한 매개 변수를 계산합니다. 그런 다음 추정 된 SNR에 따라 달라지는 임계 값을 사용하여 음성 메트릭을 임계 값으로 지정합니다. (wikipedia에서)

더 고급 기술을 위해이 주제에 대한 참고 문헌을 나열하고 있습니다.

  1. 가장 많이 참조 된 문헌 : Jongseo Sohn; 김남수; 성원용; "통계 모델 기반 음성 활동 탐지"신호 처리 문자, IEEE, 1999 년 1 월, 볼륨 : 6 문제 : pp : 1-3

  2. 가장 관련성이 높은 항목 : Mark Marzinzik 및 Birger Kollmeier "전력 봉투 역학을 추적하여 잡음 스펙트럼 추정을위한 음성 일시 정지 감지"음성 및 음성 처리에 관한 IEEE 트랜잭션, VOL. 10 호 2002 년 2 월 2 일 109 페이지

  3. 라미레스, 제이; JM Górriz, JC Segura (2007). "음성 활동 감지. 기본 및 음성 인식 시스템 견고성". M. Grimm과 K. Kroschel. 강력한 음성 인식 및 이해. 1–22 페이지. ISBN 978-3-902613-08-0.

  4. 소개 : Jonathan Kola, Carol Espy-Wilson 및 Tarun Pruthi "음성 활동 감지"


파이썬에서 이것을 달성하는 방법?
kRazzy R

9

그의 접근 방식에서 Jim Clay는 완전히 두 번째이지만 봉투를 사용하여 맛을 약간 다릅니다.

우리는 음성이 주로 1-2kHz 부근에서 발생한다는 것을 알고 있습니다. 데이터 샘플링은 44kHz 일 수 있습니다 (기록 장치에 따라 다름). 그래서 내가 먼저 할 것은 신호 전력의 포락선을 가지기 위해 실시간으로 10 포인트에 걸쳐 제곱 된 신호의 이동 평균입니다. 감지가 지연 될 수 있으므로이를 낮게 유지하려고합니다.

그런 다음 시스템에 보정 단계를 추가합니다. 사용자에게 침묵을 유지하고 버튼을 누르고 10 초 동안 배경 소음을 녹음합니다. 안전을 위해 엔벨로프의 평균 또는 중간 진폭에 2를 곱하면 Jim이 말한 임계 값을 자동으로 얻을 수 있습니다.

실시간 기록이 아닌 경우 0 상 이동 평균을 사용하여 지연으로 인한 성가심을 줄이는 것이 유용 할 수 있습니다. 그것이 당신을 위해 그대로 작동하는지 알려주십시오.


9

에릭,

당신이 진정으로 빠르고 더러운 일을 겪고 있다면 가장 먼저해야 할 일은 봉투이며, MATLAB에서 간단히 다음과 같이하면됩니다.

 envelope = abs(hilbert(yourSignal));

이 시점에서 나는 단순히 임계 값을 정하고 특정 임계 값을 초과하면 '음성이 존재합니다.

이것은 매우 간단한 솔루션입니다.하지만 그것은 당신을 위해 일할 수 있습니다.


1
+1. 아마도이 코드 줄의 방법에 대해 자세히 설명 할 수 있습니까? OP가 Hilbert Transform을 통한 봉투 추출에 익숙하지 않다고 확신합니다.
Phonon

@Mohammad 감사합니다! 그러나 :) 확실히 신속하고 더러운 싶습니다 내 EDIT 1을 참조하십시오뿐만 아니라 알고리즘 나 자신을 할 필요가하십시오
에릭 Brotto

@EricBrotto 아 좋아, 힐버트 변환기를 구현하는 방법을 알려줄 수는 있지만 C / Obj-C 라이브러리에서 FFT를 수행 할 수 있다고 가정합니다. 그렇지 않다면 문제가 될 것입니다 ... :-)
Spacey

파이썬에서 이것을 달성하는 방법?
kRazzy R

Kind Sir / Ma'am이 힐버트가 파이썬에서 어떻게 구현되는지에 대한 리소스를 알려주시겠습니까?
kRazzy R

6

나는 당신이 복잡한 신호가 아닌 실제 신호를 다루고 있다고 가정합니다. 그렇지 않은 경우 알려 주시면 답변을 수정할 수 있습니다.

전력은 신호의 제곱 (즉, 신호 샘플에 스스로 곱한 값)으로 정의됩니다. 음성이 있는지 여부를 결정하기 위해 전력을 일부 임계 값과 비교할 수 있습니다. 경험적으로 좋은 임계 값을 찾으려면 기록을 약간 측정해야 할 수도 있습니다.

녹음이 "깨끗한"(즉, 노이즈가 많지 않은 경우) 순간 전력 (예 : 단일 샘플)을 임계 값과 비교하여 가능한 한 간단하게 진행할 수 있습니다. 즉, 원치 않으면 제곱 할 필요가 없으며 절대 값이 필요하고 사전 계산 할 수있는 전력 임계 값의 제곱근과 비교하면됩니다. 음성을 감지하면 음성을 녹음하고 녹음하기 전에 일정량의 녹음을해야합니다 (1/10 초 정도). 임계 값을 초과하는 샘플이없는 기간이 길어질 때까지 계속하십시오. 다시 말하지만, 기간의 길이는 경험적으로 결정되어야합니다.

헹구고 반복하십시오.


4

Java로 활동 탐지기 클래스를 작성했습니다. 내 오픈 소스 Java DSP 컬렉션 의 일부입니다 . 테스트 프로그램 WavSplitter.java를 사용하여 WAV 파일을 입력으로 사용하여 체크 아웃 할 수 있습니다.


OP는 특히 그가 직접 알고리즘을 C로 작성해야한다고 말합니다.
Sam Maloney

이러한 알고리즘을 Java에서 C로 변환하는 것은 매우 쉽습니다.
Christian d' Heureuse

파이썬에서 이것을 달성하는 방법은 무엇입니까?
kRazzy R
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.