음성 전용 녹음에서 노래가 시작되는 위치 식별


14

사용자가 노래의 4 줄을 노래하는 작은 노래방 스타일 앱이 있으며 각 줄 사이에 1 초 간격이 있습니다. 배경 음악이 없으므로 음성만으로 문제를 쉽게 해결할 수 있습니다.

내 녹음에서 사용자가 노래 1을 시작하고 끝내고 노래 2를 시작하고 끝내는 등을 정확하게 감지하는 가장 강력한 방법을 찾고 있습니다.

나는 녹음에 배경 소음이 거의 없을 때 작동하는 간단한 알고리즘을 함께 모았지만 가장 작은 소음이있는 경우 조각으로 떨어집니다.

아무도 나를 좀 더 강건하게 지적 할 수 있습니까?


내 답변이 도움이 될 것입니다 -dsp.stackexchange.com/a/1543/440
Dipan Mehta

일부 녹음에서 음성은 두 채널에서 동일한 진폭으로 연주되는 유일한 악기입니다. 이 정보를 사용하여 스테레오 녹음에서 음성을 추출 할 수 있습니다.
Jader Dias

답변:


4

배경 노이즈가 흰색을 띠면 스펙트럼 평탄도를 측정 하고 진폭이 임계 값보다 높고 스펙트럼 평탄도가 일부 임계 값보다 낮을 때 음성으로 간주 할 수 있습니다.

기본적으로 신호 청크의 FFT를 취한 다음 스펙트럼 크기의 기하 평균을 산술 평균으로 나눕니다.

밴드 패스 필터를 사용하여 사람의 음성이 일반적으로 앉아있는 주파수 영역 만 강조 할 수도 있습니다 (스펙트럼 평탄도를 측정하기 전에 FFT의 원하지 않는 영역을 0으로 설정하는 것만 큼)


Endolith는 경험상 스펙트럼 편평도를 측정하기 전에 크기를 제곱 대 VS로 가져 가면 큰 차이가 있습니까?
Spacey

@Mohammad : 나는 그것에 대한 경험이 없습니다. :) 나는 사양을 이해하지 못했기 때문에 이전 질문을 했지만 여전히 어떤 방법이 올바른지 잘 모르겠습니다. 그래도 제곱이 실질적인 차이를 만드는 것은 아닙니다. 임계 값을 통과 할 때 트리거하는 경우에는 제곱 여부에 관계없이 동일하게 반응해야하며 (임계 값을 일치하도록 조정한다고 가정) 크기 만 계산하면 저렴합니다.
endolith

@ Endolith, 이것은 약간 긴 샷입니다 : matlab 에서이 접근법을 구현하는 방법을 알고 있습니까? MATLAB (실제 옥타브)에서 여기에 언급 된 모든 접근 방식을 테스트하여 가장 적합한 방법을 확인하고 싶습니다.
Mike Hogan 2016 년

@ MikeHogan : 아니요, 오랫동안 matlab을 사용하지 않았습니다. : / 또한 실제 작업이 필요합니다. :) 사전 작성된 것이 없습니다. 신호를 작은 청크로 나누고, 각각의 FFT를 수행하고, 각 FFT에 대해 크기의 기하 평균을 크기의 산술 평균으로 나눕니다. 숫자가 높을수록 잡음이 많고 숫자가 낮을수록 음조입니다.
endolith 2016 년

3

나는 과거에 스펙트럼 플럭스를 사용했으며 잘 작동하는 것 같습니다. 기본 아이디어는 관심있는 대역에 걸쳐 신호의 스펙트로 그램을 생성하는 것입니다. 우리가 당신의 주파수가 y 축에 있고, 시간이, x 축에 있다고 가정 해 봅시다 과 같이 .

이것은 스펙트로 그램이 행렬임을 의미합니다. 각 열은 신호 시점에서 한 번의 스냅 샷에 대한 FFT의 절대 값을 나타내고 각 행은 시간에 따라 한 대역의 에너지가 어떻게 변하는지를 나타냅니다.

이제는 단순히 열의 차이를 고려하십시오. 즉, 열을 가져 와서 그 이전의 열을 빼고 모든 열에 대해 수행하십시오. (시작 열을 분명히 남겨두고). 그런 다음 모든 밴드를 합산하십시오. 즉, 모든 행을 합산하십시오.

신호 발생 을 체계화하는 1D 신호로 끝납니다. . 음성이 어디서 시작되는지 알려줍니다.

편집하다:

이제 발병을 감지 했으므로 반대를 감지하려면 (즉, 신호가 활동에서 없음으로 이동하는 경우) 스펙트럼 플럭스는 실제로 해당 정보를 제공합니다. 발병이있는 곳이면 양의 정점을 갖게되고, 더 나은 단어가없는 곳에서 '망상'이있는 곳이면 음의 정점을 갖게됩니다.

신호의 총 시작 및 중지 시간을 표시하기 위해 첫 번째 양의 피크와 마지막 음의 피크를 간단히 사용합니다.


모하마드, "행"은 무슨 뜻입니까?
Mike Hogan

@MikeHogan 내 편집 내용을 참조하십시오. 나는 답변을 다시 썼습니다.
Spacey

그래도 이것이 시작되지 않습니까? 드럼 타격 또는 기타 충동 소음도 감지됩니다. 톤 사운드와 시끄러운 사운드를 구분하지 않습니다.
endolith

@endolith 당신은 좋은 점을 제기하지만 여전히 효과가 있다고 생각합니다. 내 추론은이 시나리오에서 음성 + 음악 상태 또는 음악 상태에 있다는 것입니다. 스펙트럼 플럭스를 계산할 때는 실제로 음성 + 음악과 음악 사이의 델타를 계산하는 것입니다. (물론 나는 그것을 훨씬 더 분석해야하지만 그것이 내가 지금 어떻게 생각하는지) :-P
Spacey

1
@endolith 방금 다시 읽었고 OP는 음성 만 있다고 말하고 있습니다 (명백히 간단한 응용 프로그램).이 경우 음성 VS 아무것도 아닙니다.
Spacey

2

내 경험으로는 Mel-Frequency-Cepstrum-Coefficients (MFCCs)를 살펴볼 것 입니다. FFT를 사용할 수 있고 음성 처리에 매우 일반적으로 사용되는 경우 MFCC는 구현하기가 매우 쉽습니다.

MFCC를 사용하면 실제 음성 데이터와 노이즈를 구별 할 수 있어야합니다.


@endolith, 그 링크는 완전히 저를 넘어! 내가 볼 수있는 오픈 소스 구현 또는 작동 방식에 대한 단계별 조리법을 알고 있습니까?
Mike Hogan

2

" 스펙트럼 플럭스 "( "스펙트럼 차이"라고도 함)는 "발병 감지"에 대한 일반적인 방법입니다. 기본적으로 신호의 순차적 FFT를 취하여 한 샘플에서 다음 샘플로의 FFT 버킷 차이의 크기를 합산합니다. "시작"은 일반적으로이 값에서 실질적인 "점프"로 표시됩니다.

다른 아이디어를위한 Google "발병 감지".


2

스펙트럼 플럭스 만 사용하면 노래 소리를 감지 할뿐만 아니라 특정 노이즈에 대해 오 탐지를 생성 할 수 있습니다.

노래는 일반적으로 피치가 포함 된 신호 내용을 의미하므로 피치 검출기 또는 추정기 (두뇌 등)를 사용할 수 있습니다. 전체 신호 에너지와 비교하여 피치로 감지 된 에너지의 비율을 확인하고 추정 된 피치가 사람의 음성 범위 내에 있는지 확인할 수 있습니다. 이는 일반 보컬 범위를 벗어난 음악 사운드뿐만 아니라 음소거되지 않은 노이즈에 대한 오 탐율을 감소시킵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.