Porownaniw dwoch plikow wav

0

Pewnego dzionka wymyslilem ze mozna by sterowac kompem przy pomocy glosu. Niby nic nowego a jednak. Pomysl prosty - program, ktory porowna plik wav zapisany w bazie z tym, ktory nagra sie z mikorfonu. Problem tkwi w porownaniu. Mozna porownac bajt po bajcie, ale tu potrzebny jest pewien zakres tolerancji, czego takie porownanie nie zapewnia. Jesli ktos wie jak to zrobic, albo wie gdzie mozna dowiedziec sie wszystkiego o strukturze plikow wav to prosze o odpowiedz.-------[ Delphi Rulez 4 Ever!, przynajmniej do czasu gdy naucze sie C++ :) ]------

0

Tu &gt&gt http://republika.pl/mgkiler/wav.zip &lt&lt
jest jakiś opis pliku *.wav - ale nie dokładny i raczej ci się nie przyda.
( więc po co ja to pisze...? )--Delphi 6
Pozdrawiam All

1

Struktura pliku WAV w WERSJI POSTAWOWEJ jest dosc prosta:

Naglowek:

type TWaveheader = packed record
RiffID : array [1..4] of AnsiChar; * musi byc 'RIFF'
RiffLen : LongWord; * dlugosc pliku bez pol RiffID i RiffLen
WaveID : array [1..4] of AnsiChar; musi byc 'WAVE'
FmtID : array [1..4] of AnsiChar; musi byc 'fmt ' (ze spacja na koncu)
FmtLen : LongWord; * dlugosc pola format, tu (i zazwyczaj) 16
FormatTag : Word; * 1 dla PCM (normalnie zapisany dzwiek)
Stereo : Word; * w zasadzie wylacznie 1 lub 2
Freq : LongWord; * czestotliwosc probkowania zwykle 11025, 22050 lub 44100
BytesPSec : LongWord; * liczba bajtow na sekunde=Freq
Stereo
(BitsPer/8)
BlockAlign : Word; * Stereo * (BitsPer/8)
BitsPer : Word; * rozdzielczosc probkowania - zwykle 8 lub 16 (bitow) Koniec pola format
DataID : array [1..4] of AnsiChar; * musi byc 'data'
DataLen : LongWord; // dlugosc danych
end;

A potem dane w nastepujacym ukladzie:

8-bit mono
probka0, probka1, probka2...

8-bit stereo
probka0 L, probka0 R, probka 1 L, probka 1 R, ...

16-bit mono
probka0 lowByte (LB), probka 0 HighByte(HB), probka 1LB, probka1 HB, ...

16-bit stereo
probka0 L LB, probka0 L HB, probka0 R LB, probka 0 R HB, probka 1 L LB, probka 1 L HB, probka 1 R LB, probka 1 R HB...

dla danych 8-bit probki sa unsigned, dla danych 16-bit signed. Wiem ze to glupie ale wymyslil to Microsoft a nie ja. Dla danych 24 i 32 bit sa rozne formaty ale w zwyklych zastosowaniach uzywa sie zwykle 16-bit, rzadzej 8-bit. Nie wiem jak zapisuje sie dzwiek &gt2 kanalowy, ale to tez Ciebie nie dotyczy.

Plik Wave (a dokladniej plik RIFF, ktorego Wave jest podtypem) moze miec znacznie bardziej zawila strukture, z wieloma polami oprocz Wave, fmt, data. Pelny opis zajalby wiele stron, ale wiekszosc programow ogranicza sie do tego co powyzej. Tym bardziej ze struktura ta jest podobno (nigdy nie chcialo mi sie jej dokladnie przestudiowac) wysoce balaganiarska (dublujace sie funkcje pol, itp).

To byly dobre wiadomosci.

Teraz zle. Gdyby rozpoznawanie glosu dalo sie zrobic tak jak to proponujesz, pewnie nikt by juz nie umial pisac, tylko wszystko by sie dyktowalo komputerom... Twoja metoda nie da zadnych wynikow. Jesli nie wiesz dlaczego, proponuje DUUUZO doczytac z PODSTAW akustyki, akustyki mowy, cyfrowego przetwarzania dzwieku. Jesli nie zrozumiales jakiegokolwiek terminu z czesci pierwszej, w rodzaju probkowanie, czestotliwosc probkowania, rozdzielczosc probkowania, tym bardziej DOUCZ SIE.

Pozdrawiam i mimo wszystko zycze sukcesow na tym fascynujacym polu.

--Pawel

Delphi6

0

Hmm, pomysl dopry, tylko dzwieki som wydawane dosc chaotycznie przez organizm ludzki. tylko dzieki doskonale dopracowanemu mozgowi mozemy je identyfikowac. Nigdy nie uda cie sie wydac z siebie dwoch identycznych dzwiekow. a porownanie takich fal to dosc zawila sprawa. Np duzy wplyw ma shybkosc mowienia. Jak odroznish dwie fale identyczne, lecz jedna "rozciongnieta"? Trzeba by je np "skracac", a mozliwosci jest bez liku. Gdybys wprowadzil jakies dopushczalne bledy procentowo, to np padnie ci program na tak popularnym slowie jak "wczoraj". 60% ludzi mowi "wczorej". Posluchaj sobie Miodka. A akcenty, gwary itp?? To jest niewykonalne w obecnych czasach, takie jest moje zdanie i wiekszosci informatykow...--Delphi 4

Skysh The God, Your Slave

0

az takie niemozliwe to nie jest, ale bardzo trudne swiadczy o tym fakt, zeprogramow do rozpoznawania mowy nie jest za wiele, a jeden ktory mialem okazje przetestowac rozpoznawal gdzies 3/4 slow ale dopiero po tym jak sporo nad nim posiedzialem i nauczylem sie mowic tak aby on to rozpoznal

0

No ale na pewno zaden program do rozpoznawania mowy nie dziala na zasadzie porownywania zapisow bajt po bajcie. Trzeba na pewno zrobic analize czestotliwosci, znalezc formanty... kupa roboty i mnostwo trzeba wiedziec...--Pawel

Delphi6

0

Panowie rozpoznawanie mowy to nie zadne porownywanie czestotliwocsi !!!

aby rozpoznawac (mauczyc sie rozpoznawac) musisz stosowac sieci neuronowe
a pisanie programow z zakresu sztucznej inteligencji w Pascalu czy w Delphi brzmi frasujaco zebu nie powiedziec glupio

powodzenia (ironicznie)--Lets make linux better :-)

0

Wojtasie,

sieci neuronowe to technika obliczeniowa (byc moze nie jedyna, nie wiem) nadajaca sie do rozpoznawania mowy. Ja mialem na mysli sposob podejscia do samego sygnalu. Spodziewam sie, ze analiza widma czestotliwosci jest nader przydatna. Np. samogloski roznia sie od siebie polozeniem formantow czyli maksimow energii w widmie czestotliwosci. Bodajze niejaki Remez pokazal, ze po sprowadzeniu sygnalu mowy do sumy trzech sygnalow sinusoidalnych ktorych chwilowe czestotliwosci podazaja za czestotliwosciami trzech najsilniejszych formantow otrzymuje sie cos co brzmi bardzo dziwnie ale ludzie sa w stanie to zrozumiec - mimo skrajnego uproszczenia sygnalu. Nie wiem, czy akurat ta technika jest stosowana do automatycznego rozpoznawania mowy, ale mysle ze mozna sprobowac. Dalej: sylaby typu ba, ga, da skladaja sie z trudno definiowalnej spolgloski sensu stricte, 40ms segmentu przejsciowego w ktorym istnieja formanty ale zmieniaja swoje czestotliwosci, i samogloski, gdzie formanty sa stale. Przebieg zmian czestotliwosci formantow w segmencie przejsciowym jest charakterystyczny dla poszczegolnych spolglosek i mozna je po tym odroznic. A na przyklad spolgloske 's' mozna rozpoznac po b. charakterystycznym widmie z duza iloscia energii w wysokich czestotliwosiach (rzedu 10kHz). Proponuje Ci sciagnac program SpectroGram (www.visualizationsoftware.com/gram.html), podlaczyc mikrofon i pogladac jak to wyglada.

Podsumowujac, chcialem jeszcze raz zwrocic uwage ze techniki programistyczne to nie wszystko, duzo wazniejsza jest wiedza o strukturze sygnalu mowy.--Pawel

Delphi6

0

Zapomnijmy o porownywaniu plikow wav. Po owocnych poszukiwaniach w necie proponuje scignac sobie SAPI 5.1 z Microsoftu : http://download.microsoft.com/download/speechSDK/SDK/5.1/WXP/EN-US/speechsdk51.exe [skromne 67MB]. Po zainstalowaniu i dodaniu tego w Delphi mamy do dyspozycji 19 komponentow m.in. rozpoznawanie mowy i syntezator mowy. Niestety rozpoznawanie mowy oparte jest na jezyku angielskim [dostepny jest tez japonski i chinski uproszczony (!) ]. Obsluga w Delphi jest dziecinnie prosta. i wystarczy np. wstawic warunek gdy powiemy. np. "computer" to ma sie cos tam zdarzyc [np. moze on nam odpowiedziec "Yes, my lord!"]. Rozpoznaje wiekszosc slow, ale nie kryje ze czasmi zle dziala, lub zle slysysz [albo mowie troche nieskladnie]. Wplyw na to co "slyszy komp" ma tez mikrofon [czyli jego jakosc, co wpywa na szumy i pozniejsze bledy]. Zainteresowaych moge odeslac do przeczytania 2 artykulow na www.delphi3000.com w dziale Multimedia pt.
Speech Part 1 - How to Add "Text to Speech" (Speech Synthesis) to your Delphi Apps
Speech Part 2 - How to Add Simple Dictation speech recognition to your Delphi Apps
-------[ Delphi 6 Rulez 4 Ever!, przynajmniej do czasu gdy naucze sie C++ :) ]------

0

pq w dniu 12.3.2002 19:13 napisal:
Wojtasie,
&gt
&gtsieci neuronowe to technika obliczeniowa (byc moze nie jedyna, nie wiem) nadajaca sie do rozpoznawania mowy. Ja mialem na mysli sposob podejscia do samego sygnalu. Spodziewam sie, ze analiza widma czestotliwosci jest nader przydatna. Np. samogloski roznia sie od siebie polozeniem formantow czyli maksimow energii w widmie czestotliwosci. Bodajze niejaki Remez pokazal, ze po sprowadzeniu sygnalu mowy do sumy trzech sygnalow sinusoidalnych ktorych chwilowe czestotliwosci podazaja za czestotliwosciami trzech najsilniejszych formantow otrzymuje sie cos co brzmi bardzo dziwnie ale ludzie sa w stanie to zrozumiec - mimo skrajnego uproszczenia sygnalu. Nie wiem, czy akurat ta technika jest stosowana do automatycznego rozpoznawania mowy, ale mysle ze mozna sprobowac. Dalej: sylaby typu ba, ga, da skladaja sie z trudno definiowalnej spolgloski sensu stricte, 40ms segmentu przejsciowego w ktorym istnieja formanty ale zmieniaja swoje czestotliwosci, i samogloski, gdzie formanty sa stale. Przebieg zmian czestotliwosci formantow w segmencie przejsciowym jest charakterystyczny dla poszczegolnych spolglosek i mozna je po tym odroznic. A na przyklad spolgloske 's' mozna rozpoznac po b. charakterystycznym widmie z duza iloscia energii w wysokich czestotliwosiach (rzedu 10kHz). Proponuje Ci sciagnac program SpectroGram (www.visualizationsoftware.com/gram.html), podlaczyc mikrofon i pogladac jak to wyglada.
&gt
&gtPodsumowujac, chcialem jeszcze raz zwrocic uwage ze techniki programistyczne to nie wszystko, duzo wazniejsza jest wiedza o strukturze sygnalu mowy.
&gt
&gt--
&gtPawel
&gt
&gtDelphi6

zgadzam sie ale nie zaprzeczysz chyba ze aby wykonywac tak skomplikowane obliczenia w czasie rzeczywistym tzreba stosowac zaawansowane techniki obliczeniowe a nie algorytmy genetyczne albo brute-force o zgrozo chociaz stosujac tarnsformate fouriera mozesz wylapac z sygnalu interesujace ci wiadomosci ale wtedy mozesz zapomniec o rozsadnym czasie wykonania calosci zadania

ps dzieki za opis pliku wav

wojta$ --Lets make linux better :-)

0

Nie zaprzecze, skadze. I to nie tylko dlatego ze za malo sie znam na programowaniu zeby czemukolwiek w tej materii kategorycznie zaprzeczac.

Wprawdzie FFT w locie na 'zywym' sygnale nie jest bardzo ciezkie obliczeniowo (co widac po programie wspomnianym przeze mnie powyzej), to oczywiscie na nim sie nie konczy. Tyle, ze od analizy czestotliwosci zapewne warto zaczac. A to co z niej wyjdzie trzeba poddac metodom ktore sa 1. inteligentnie zaprojektowane - zeby wychwycily i ocenily cechy sygnalu istotne dla zrozumienia mowy 2. inteligentnie zaprogramowane - zeby ta ocena zadzialala w rozsadnym czasie na rozsadnym sprzecie. A problemow jest wiele: wezmy chociaz segmentacje - w plynnej wypowiedzi slowa nie sa od siebie oddzielone. Albo to, ze zrozumialosc wypowiedzi dla czlowieka jest w znacznej czesci oparta o redundancje - w tym redundancje znaczeniowa, ktora dla kompa bedzie nie- lub slabo dostepna. Mam oczywiscie na mysli sytuacje, w ktorej czlowiek jest w stanie dzieki kontekstowi domyslec sie niedoslyszanego slowa.

Majac wiec - jakze niepelna - swiadomosc zawilosci problemu, poczulem sie po prostu rozbrojony entuzjastycznym pomyslem autora watku, zeby porownac Wave'y bajt po bajcie...--Pawel

Delphi6

0

Chyba sie zle wyrazilem, ale od samego pocztaku wiedzialem ze metoda bajt po bajcie bedzie nieskuteczna. A tu Od razu &ltno comment&gt ..............-------[ Delphi 6 Rulez 4 Ever!, przynajmniej do czasu gdy naucze sie C++ :) ]------

0

Nie chcialem Cie urazic, sorry! Moje ostatnie slowa w powyzej nie maily byc jakas nagana dla ciebie. Niewiedza to nie zbrodnia, chociaz nalezy jej unikac. Ale za bardzo jestem swiadom swojej niewiedzy w wielu dziedzinach, by nasmiewac sie z czyjejs tylko dlatego ze akurat klka rzezcy wiem. Po prostu poczulem sie jakby ktos o napisaniu Kunst Der Fuge powiedzial: No, trzeba wziac papier w kreski i takie kropki postawiac - i juz! --Pawel

Delphi6

1 użytkowników online, w tym zalogowanych: 0, gości: 1