2017-01-04 6 views
2

나는 오디오 파일을 동시에 재생하고 녹음해야하는 지난 며칠 동안 내 앱의 일부로 작업 해 왔습니다. 달성해야 할 작업은 녹음 된 오디오 파일을 녹음 된 파일과 비교하여 일치하는 비율을 반환하는 것입니다. 여기에 지금까지 무엇을했는지 그리고 내 질문에 어떤 컨텍스트 : 대상 API는 내가 파일FFT (Android Studio)를 사용하여 두 개의 오디오 파일 매칭

를 디코딩 단순화하기 위해 .wav 오디오 파일 형식을 사용하기로 결정> 15

    • 입니다

      내 오디오 파일을 전달하고
    • 내가 '일치하는 분석을 수행하기 위해 PCM으로 변환하기 위해 결정자 클래스를 만들어 내가 오디오 파일
    • 재생을위한 녹음 및 MediaPlayer를 위해 가지 audiorecord을 사용하고
    • 오디오 파일을 디코더에 전달한 후 FFT 클래스로 전달하여 주파수 도메인 데이터를 가져옵니다 (CHANNEL_MONO, 16 BIT, SAMPLE_RATE = 44100)
    • 내 분석에 필요합니다. 내가 가지 audiorecord를 사용하여 오디오를 기록 할 때

      • , 기본적으로 포맷 PCM이 아니면이 몇 가지 방법을 지정해야 할 아래

      그리고

    • 내가 가진 몇 가지 질문입니까?
    • 나는 일치하는 분석을 수행하기 위해 주파수 도메인 데이터를 얻기 위해 FFT 클래스에 녹음을 전달하려고합니다. 녹음을 사용자의 장치에 저장하지 않고이 작업을 수행 할 수 있습니까?
    • 두 파일 모두에 대해 FFT 분석을 수행 한 후에는 일치하는 분석을 수행하기 위해 텍스트 파일에 데이터를 저장해야합니까? 어떤 옵션이나 가능한 방법은 무엇입니까?
    • 상당량의 조사를 한 후에 내가 찾은 모든 출처는 녹음 자료를 데이터베이스에 포함 된 노래/음악과 일치시키는 법을 다룹니다. 내 목표는 두 개의 특정 오디오 파일이 얼마나 밀접하게 결합되어 있는지 확인하는 것입니다. 어떻게하면됩니까? - 내 목표를 달성하기 위해 해시 함수를 만들거나 사용해야합니까? 이에 대한 자세한 대답은 정말 도움이 될 것입니다.
    • 현재 녹음을위한 별도의 스레드가 있습니다. 오디오 파일을 디코딩하기위한 별도의 활동; FFT 분석을위한 별도의 활동. 필자는 별도의 스레드 또는 AsyncTask에서 일치하는 분석을 실행할 계획입니다. 이 구조가 최적이라고 생각하십니까? 아니면 더 좋은 방법이 있습니까? 또한 오디오 파일을 별도의 스레드에서 디코더로 전달해야합니까? 아니면 녹음 스레드 또는 MatchingAnalysis 스레드에서 할 수 있습니까?
    • 일치하는 비교를 수행하기 전에 오디오 파일에 대한 작업에서 윈도우 작업을 수행해야합니까?
    • .wav 파일을 디코딩해야하나요 아니면 2 개의 .wav 파일을 직접 비교할 수 있습니까?
    • 비교하기 전에 오디오 파일에 대해 낮은 피칭 작업을 수행해야합니까?
    • 내 일치 비교를 수행하려면 정확히 어떤 데이터를 생성해야합니까 (파워 스펙트럼, 에너지 스펙트럼, 스펙트로 그램 등)?

    나는 올바른 방향으로 가고 있습니까? 아니면 뭔가 빠져 있습니까?

  • +0

    들으 셨습니다. 모바일 장치에서이 작업을 수행하려고 생각하기 전에 데스크톱 컴퓨터에서 실행되는 동안 두 개의 웨이브 파일을 전달할 때 좋은 작업을 수행 할 수있는 알고리즘을 개발해야합니다. 예를 들어, 알 수없는 지체로만 다른 두 개의 동일한 파일 * (현실 세계에서는 결코 찾을 수 없지만 논증의 목적으로)을 어떻게 처리 할 것인지 예를 고려해보십시오. 안드로이드 오디오 스택 삽입 지연을 더 잘 믿어야했습니다! 이제 지연, 잡음 및 다양한 주파수 응답의 조합을 고려하십시오. 이제 방 에코를 추가하십시오 .... –

    +0

    @ChrisStratton 지연은 슬라이딩 창을 추가하거나 트리밍/두 신호를 잘라내서 길이가 일치하므로 해결할 수 있다고 생각하십니까? 아니면 해시 함수를 사용하면 시간 지연을 무시할 수 있습니까? – Zack

    +0

    테스트 데이터 레코딩 세트를 수집하고 알고리즘을 작성하고 점수를 매기는 방법을 생각해냅니다. 그런 다음 데이터 수집을 위해 사용 (전화 마이크는 컴퓨터와 다릅니다)하고, 테스트 환경에서 좋은 결과를 얻을 때까지 모바일 장치를 터치하지 마십시오. –

    답변

    1

    Shazam과 같은 응용 프로그램에서 Midomi 오디오 매칭은 스펙트로 그램과 해시를 사용하는 오디오 지문이라는 기술을 사용하여 수행됩니다.

    • FFT를 찾기위한 첫 단계는 정확하지만 Spectrogram이라는 시간과 주파수 사이의 2 차원 그래프를 작성해야합니다.
    • 이 스펙트로 그램 어레이에는 백만 개가 넘는 샘플이 포함되어 있으며 많은 데이터를 처리 할 수 ​​없습니다. 그래서 우리는 진폭에서 정점을 찾습니다. 피크는 주변의 근처의 에서 가장 큰 진폭 값에 해당하는 (시간, 주파수) 쌍이됩니다. 최고 수준의 발견은 계산 비용이 많이 드는 프로세스가 될 것이며, 다양한 앱이나 프로젝트가이를 다른 방식으로 수행합니다. 피크 노이즈는 배경 잡음에보다 민감하기 때문에 피크를 사용합니다.
    • 이제 서로 다른 노래가 동일한 피크를 가질 수 있지만 차이점은 발생 순서와 시간차입니다. 그래서 우리는 이러한 봉우리를 고유 한 해시로 결합하여 데이터베이스에 저장합니다.
    • 위의 과정을 앱에서 인식하고 데이터베이스에서 일치시킬 각 오디오 파일에 대해 수행하십시오. 매칭은 간단하지 않지만, 노래가 어떤 인스턴트에서 나올 수 있고 전체 노래의 지문을 가지고 있기 때문에 시간 차이도 고려해야합니다. 그러나 지문은 상대적 시간차가 있기 때문에 문제가되지 않습니다.

    그것은 다소 상세한 과정이며, 일부는 (https://github.com/worldveil/dejavu를) 데자뷰을 위해 할 수있는 라이브러리와 chromaprint (그것 C에서이 ++)이 있습니다이 링크 http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf

    에서 더 많은 설명을 찾을 수 있습니다. Google의 Musicg는 자바에 있지만 배경 소음이 잘 들리지 않습니다.

    두 개의 오디오 파일을 매칭하는 것은 복잡한 과정이며, 위의 설명과 마찬가지로 PC에서 먼저 시도한 다음 전화로 시도해 보도록하겠습니다.