2010-10-18 8 views
10

Robię pewne badania na temat porównywania plików dźwiękowych (wave). Zasadniczo chcę porównać przechowywane pliki dźwiękowe (wav) z dźwiękiem z mikrofonu. W związku z tym chciałbym wstępnie zapisać niektóre własne komendy głosowe, a kiedy używam mojej aplikacji, chciałbym porównać wstępnie zapisane pliki z danymi wejściowymi z mikrofonu.Co zawiera ramka audio?

Moja myśl polegała na tym, żeby w pewnym stopniu porównywać, ponieważ mówienie czegoś dwa razy z rzędu w ten sam sposób byłoby trudne, jak sądzę.

Po pewnym czasie googlowania widzę, że pyton ma moduł o nazwie wave i obiekt Wave_read. Że obiekt posiada funkcję o nazwie readframes (N):

czyta i powraca co najwyżej n ramek dźwięku jako ciąg bajtów.

Co zawierają te bajty? Myślałem o zapętleniu się plików wave'owych po jednej klatce, porównując je klatka po klatce.

+2

Bajty zawierają dane PCM. Czy próbujesz wykonać rozpoznawanie głosu? Wygląda na to, że jesteś w drodze nad głową. Powinieneś zbadać ten temat. – JoshD

+0

Ach, do cholery :) Dzięki za odpowiedzi. Można to nazwać rozpoznawaniem głosu, ale sposób, w jaki myślałem o tym, to proste porównywanie plików, które byłoby znacznie prostsze. W moim przypadku byłoby to tylko kwestią wykonania tego samego dźwięku, nie analizowania i próbowania interpretowania słów. – Jason94

+1

To wciąż rozpoznawanie głosu. Nawet niewielka fleksja lub różnica prędkości w twoim głosie będzie dawała dziko różne dane audio, więc nie możesz po prostu porównać klatka po klatce. – Soviut

Odpowiedz

28

Ramka audio lub próbka zawiera informację o amplitudzie (głośności) w danym momencie. Aby wytworzyć dźwięk, odtwarzane są dziesiątki tysięcy klatek w celu wygenerowania częstotliwości.

W przypadku jakości dźwięku CD lub nieskompresowanego dźwięku wave, około 44 100 klatek/próbek na sekundę. Każda z tych ramek zawiera 16 bitów rozdzielczości, pozwalając na dość dokładne odwzorowanie poziomów dźwięku. Ponadto, ponieważ dźwięk CD jest stereo, jest w istocie dwa razy więcej informacji, 16 bitów w lewym kanale, 16 bitów w prawo.

W przypadku korzystania z modułu dźwiękowego w python dostać ramkę, zostanie on zwrócony jako ciąg znaków w systemie szesnastkowym:

  • Jeden znak dla sygnału mono 8-bitowym.
  • Dwa znaki dla ośmiobitowego stereo.
  • Dwa znaki dla 16-bitowego mono.
  • Cztery znaki dla 16-bitowego stereo.

Aby przekonwertować i porównać te wartości, należy najpierw użyć funkcji modułu falowego python do sprawdzenia głębi i liczby kanałów. W przeciwnym razie będziesz porównywać niedopasowane ustawienia jakości.

+1

75 klatek na sekundę? Czy nie masz na myśli 44100? – corvuscorax

+0

Tak, początkowo miałem to (zobacz edycje), ale zostało zmodyfikowane na mnie. Zamierzam to zmienić, chyba że ktokolwiek edytuje, może wyjaśnić swoją interpretację klatki audio. – Soviut

+1

To może być pewne zamieszanie wynikające z faktu, że odtwarzacze CD Red Book odczytują 75 sektorów z dysku na sekundę, ale to powinno być nieistotne dla celów tej dyskusji. – corvuscorax

7

Proste porównanie bajt po bajcie prawie nie ma szans na udane dopasowanie, nawet z pewną tolerancją. Rozpoznawanie wzorca głosu jest bardzo złożonym i subtelnym problemem, który wciąż jest przedmiotem wielu badań.

+1

Aby dodać do tej odpowiedzi ... problem ma wiele wspólnego z tym, jak zwykle reprezentujemy audio cyfrowo a jak postrzegamy dźwięk. Słuchamy częstotliwości i ich interakcji. Nie postrzegamy bezpośrednio każdego wzlotu i upadku fali. Jednak, gdy przechwytywamy audio cyfrowo jako PCM, właśnie rejestrujemy pomiary poziomu ciśnienia tysiące razy na sekundę. Słyszymy w dziedzinie częstotliwości, ale dźwięk PCM jest w dziedzinie czasu. Aby zacząć porównywać, najpierw musimy przeprowadzić transformatę Fouriera, aby uzyskać cyfrowy dźwięk w domenie częstotliwości. – Brad

5

Pierwszą rzeczą, którą powinieneś zrobić, to przekształcenie Fouriera, aby przekształcić dane na ich częstotliwości. Jest to jednak dość złożone. Nie używałbym tutaj bibliotek rozpoznawania głosu, ponieważ brzmi to tak, jakbyś nie nagrywał tylko głosów. Następnie spróbowałbyś różnych przesunięć czasowych (w przypadku, gdyby dźwięki nie były dokładnie wyrównane) i używał tego, który daje najlepsze podobieństwo - gdzie musisz zdefiniować funkcję podobieństwa. Och i powinieneś normalizować oba sygnały (taką samą maksymalną głośność).

5

Uważam, że przyjęty opis jest nieco niepoprawny.

Ramka rama wygląda trochę jak krok w formatach graficznych.Dla z przeplotem stereo @ 16 bitów/próbka, rozmiar ramki wynosi 2*sizeof(short) = 4 bajty. W przypadku niezoblokowanych stereo @ 16 bitów/próbka, próbki lewego kanału są wszystkie po sobie, więc rozmiar ramki wynosi zaledwie sizeof(short).

+0

jak sprawdzić, czy przeplatany, czy nie? co jest bardziej powszechne? – jiggunjer