Sıra geldi uygulamayı yapmaya. Bunun için daha önce bahsettiğim gibi Voicebox ve H2M toolbox’larını kullanacağız. Güncel sürümlerini bulup kullanabilirsiniz. İsterseniz aşağıdaki adreslerden benim kullandığım sürümlerini indirebilirsiniz. Bu toolbox’ları indirin ve açın; bunların bulunduğu klasörleri Matlab’ın path’ine ekleyin. Matlab arayüzünden klasöre sağ tıklayıp “Add to path” komutunu çalıştırmanız da geçici olarak yeterli olabilir. Bu konuda ayrıntıya girmeyeceğim, Matlab ortamını tanıyor olduğunuzu varsayıyorum. Ben Matlab 7.9.0 (R2009b) sürümünü kullandım bu uygulamayı yazarken ancak bu kodların Matlab 6 sürümünde de çalıştığını kesin olarak biliyorum, tezimi yazarken 6 sürümünü kullanmıştım.
www.vtunali.com/download/voicebox.zip
www.vtunali.com/download/h2m.zip
Training – Sistemin Eğitimi
Konuşma Tanımayla (daha genel olarak Örüntü Tanımayla) ilgilenenlerin bileceği gibi, önce sisteme bilinen sözcükleri tanıtacağız. Bu aşama genel olarak Training olarak isimlendiriliyor. Bunun için şu iki Matlab fonksiyonunu yazacağız:
- train_word: parametre olarak verdiğimiz wav dosyasını işleyip HMM model parametrelerini üretir ve hmm_model_files klasörüne kaydeder.
- train_all_words: train_word fonksiyonunu kullanarak sisteme tanıtacağımız tüm sözcükleri işlemden geçirir. Çalışmayı kolaylaştırmak ve anlatımı basitleştirmek için kullandım.
Şimdi bu fonksiyonların içine bakalım ve üzerinden adım adım geçelim:
train_all_words.m
function train_all_words
warning('off','MATLAB:dispatcher:InexactCaseMatch');
numStates = 5;
% Train word 1 - ALAN
train_word('alan', numStates);
% Train word 2 - BİZİM
train_word('bizim', numStates);
% Train word 3 - KALAN
train_word('kalan', numStates);
% Train word 4 - MERKEZ
train_word('merkez', numStates);
% Train word 5 - ZAMAN
train_word('zaman', numStates);
end
Burada numStates değişkeni HMM durum makinasında (state machine) kullanılmasını istediğimiz durumların sayısını ifade ediyor. Teorisini okursanız daha anlamlı gelir. Genellikle konuşma tanımada bir sözcük için 5 durum efektif sonuç veriyor. Biz de bu nedenle 5 kullanıyoruz örneğimizde. İsterseniz farklı değerler vererek sonucu deneyebilirsiniz.
Eğitim için ben sabit olarak 5 farklı sözcük için yapmış olduğum kayıtları kullandım. Siz bu kısmı kendi uygulamanızın gereksinimlerine göre düzenleyebilirsiniz. Şimdi train_word fonksiyonuna bakalım.
train_word.m
function train_word( wordName, numStates ) disp(['Training word: ' wordName]); % read wav file and generate cepstrum wav_file_name = ['training_words/' wordName '.wav']; [y, fs] = wavread(wav_file_name); observationVector = melcepst(y, fs, '', 22, floor(3*log(fs)), 128, 32); % Training parameters DIAG_COV = 1; % Force use diagonal covariance matrices QUIET = 1; % Make training routines silent N = numStates; % Number of states per word model % Transition matrix is more or less arbitrary and will not be estimated (too % few utterances are available) A = sparse(0.85*diag(ones(1,N))+0.15*diag(ones(1,N-1),1)); A(N,N) = 1; NIT = 10; % Number of EM iterations p = size(observationVector, 2); X = []; st = []; st = [st; size(X,1)+1]; X = [X; observationVector]; T = size(X,1); % Training. Because there is very few available training data, the covariance % matrices are diagonal and shared by all states of the word model (ie. all % states have the same covariance matrix given by Sigma) [my_mu,Sigma] = hmm_mint(X, st, N, DIAG_COV,QUIET); Sigma = ones(N,1)*mean(Sigma); % Shares covariance logl = zeros(1, NIT); for n = 1:NIT % Expectation step of the EM algorithm [tmp, logl(n), gamma] = hmm_mest(X, st, A, my_mu, Sigma, QUIET); % Unconstrained Maximization step of the EM algorithm [my_mu, Sigma] = mix_par(X, gamma, DIAG_COV, QUIET); % Modification of the EM Maximization due to the constraint that all % covariance matrices are identical Sigma = ones(N,1)*(sum((sum(gamma)'*ones(1,p)).*Sigma)/T); end my_sigma = Sigma(1,:); % Write a separate mat file for each words model in subdirectory data eval(['save hmm_model_files/' wordName ' my_mu my_sigma']); end
Koddaki bazı yorumlar bana ait değil. H2M toolbox’ında örnek bir kod vardı, oradan aldığım bölümlerdeki yorumları da aynen bıraktım lazım olur diyerek. Şimdi eğitim için adım adım ne yaptığımıza bakalım:
% read wav file and generate cepstrum wav_file_name = ['training_words/' wordName '.wav']; [y, fs] = wavread(wav_file_name); observationVector = melcepst(y, fs, '', 22, floor(3*log(fs)), 128, 32);
Kodun ilk bölümünde sisteme tanıtmak ve HMM model parametrelerini oluşturmak istediğimiz sözcüğün training_words klasöründe yer alan wav dosyasını okuyoruz ve voicebox toolbox’ında yer alan MELCEPST fonksiyonu ile bu sözcüğün Öznitelik Vektörlerini (Feature Vector) oluşturuyoruz. Yani, ses sinyalinden tanıma için yararlanabileceğimiz, bir sözcüğü diğerinden ayrıştırabilmemizi sağlayan öznitelik vektörünü elde ediyoruz. Bu vektörün adı değişik kaynaklarda Observation Vector olarak da geçer. Melcepst fonksiyonunun çeşitli parametreleri var, bunlar hakkında ayrıntıya girmeyeceğim ama mesela 22 ile oluşacak vektörün 22 boyutlu olmasını istediğimizi belirtiyoruz. Bu sayıda denemeler yapabilirsiniz, 12′den daha düşük bir sayı tanıma başarımını düşürebilir. Diğer parametreler ise sinyal üzerinde uygulanacak pencereleme ve pencerelerin üst üste binme (overlap) ayarlamaları için gerekiyor.
Bu fonksiyonun sonraki bölümü ise elde ettiğimiz öznitelik vektörünü kullanarak sözcük için HMM model parametrelerini üretiyor. Burada Expectation Maximization olarak adlandırılan bir teknik uygulanıyor. Bu işlemin sonucunda elimize 2 parametre geçiyor: my_mu ve my_sigma. Bu iki değişkeni hmm_model_files klasörü altında sözcükle aynı isimde bir MAT dosyasına saklıyoruz. Bu MAT dosyaları sistemin tanıma aşamasında kullanılacaklar. Gördüğünüz gibi, sisteme tanıttığımız sözcük için öznitelik vektörünü saklamıyoruz, bunun yerine HMM model parametrelerini saklıyoruz. Öznitelik vektörünü saklayıp tanıma aşamasında tekrar model parametrelerini oluşturabilirdik, ama bu durumda tanıma sırasında sisteme gereksiz bir yük getirmiş olurduk ve tanıma süresini uzatırdık.
Testing – Tanıma Aşaması
Bu aşamada, sisteme yeni bir sözcüğü vererek daha önce tanıttıklarımız arasından en benzerini bulmasını isteyeceğiz. Örnekte tanıttığımız 5 sözcük için bu kez farklı bir kayıt yaparak tanımasını isteyeceğiz. Eğitim için kullandığımız dosyanın aynısını test için kullanmayacağız, bu zaten mantıksız olur.
test_word.m
function test_word( wordName, numStates )
% List of words we have already trained and have
% HMM model files in hmm_model_files directory.
trainedWords = {'alan';
'bizim';
'kalan';
'merkez';
'zaman'};
% read testing wav file and generate cepstrum
wav_file_name = ['testing_words/' wordName '.wav'];
[y, fs] = wavread(wav_file_name);
observationVector = melcepst(y, fs, '', 22, floor(3*log(fs)), 128, 32);
% HMM Viterbi search
N = numStates;
A = sparse(0.85*diag(ones(1,N))+0.15*diag(ones(1,N-1),1));
A(N,N) = 1;
numIter = 10;
numberOfFiles = length(trainedWords);
for w=1:numberOfFiles
fileName = trainedWords{w};
modelFileName = ['hmm_model_files/' fileName '.mat'];
load(modelFileName);
Sigma = ones(N,1) * my_sigma;
% make viterbi search and obtain a similarity score
score(w) = hmm_vit(observationVector, A, [1 zeros(1,N-1)], my_mu, Sigma, 1);
end % for w=3:num...
% Word with max score is the best recognized word.
result = find(score >= max(score));
disp(['Recognized word is ' trainedWords{result}]);
end
Sisteme daha önce tanıttığımız sözcükleri ben sabit olarak bir diziye yazdım. Siz uygulamanızda bu kısmı daha farklı düşünebilirsiniz. Tanıtılan sözcükleri ilgili klasörden okuyarak vs. kullanabilirsiniz.
Bu fonksiyonun ilk kısmı tanıdık geliyor. Burada da sistemin tanımasını istediğimiz sözcüğü önişlemeden geçirip öznitelik vektörünü elde ediyoruz. Bu öznitelik vektörünü sonraki aşamada HMM Viterbi Search işleminde kullanıyoruz.
for w=1:numberOfFiles
fileName = trainedWords{w};
modelFileName = ['hmm_model_files/' fileName '.mat'];
load(modelFileName);
Sigma = ones(N,1) * my_sigma;
% make viterbi search and obtain a similarity score
score(w) = hmm_vit(observationVector, A, [1 zeros(1,N-1)], my_mu, Sigma, 1);
end % for w=3:num...
Gördüğünüz gibi çok basit bir döngüde, daha önce sisteme tanıttığımız sözcükler için model parametrelerini yüklüyoruz ve ardından hmm_vit fonksiyonu ile sistemin tanımasını istediğimiz sözcük için bir skor elde ediyoruz.
% Word with max score is the best recognized word.
result = find(score >= max(score));
disp(['Recognized word is ' trainedWords{result}]);
Eğitmiş olduğumuz sözcükler arasından en yüksek skora sahip olanı yani en benzer olanı tanınmış sözcük olarak raporluyoruz.
Nasıl Çalıştıracağız
Fonksiyonları yazdık ama nasıl deneyeceğiz? Hazırlık aşaması olarak:
- Öncelikle yukarıda kodlarını verdiğim 3 adet .m dosyasını bir klasörde toplayın (train_all_words.m, train_word.m, test_word.m).
- Aynı klasör içinde şu 3 klasörü oluşturun: training_words, testing_words, hmm_model_files.
- Voicebox ve H2M toolbox’larının Matlab work path’ine eklenmesi gerektiğini tekrar hatırlatayım.
- Sisteme öğretmek istediğiniz sözcükler için kısa ve temiz ses kayıtları yapıp training_words klasörüne koyun. Bu kayıtların mono olması ve 22 Khz olmasına dikkat edin.
- Sistemin tanımasını istediğiniz sözcükler için de aynı şekilde kayıtlar yaparak testing_words klasörüne koyun.
- test_all_words fonksiyonunda değişiklik yaparak kendi sözcükleriniz için model oluşturulmasını sağlayın.
Şimdi Matlab komut satırından deneme yapabiliriz:
>> train_all_words
Training word: alan
Training word: bizim
Training word: kalan
Training word: merkez
Training word: zaman
>> test_word('alan', 5);
Recognized word is alan
>> test_word('benim', 5);
Recognized word is bizim
>> test_word('kadar', 5);
Recognized word is kalan
train_all_words satırı ile tüm eğitim sözcükleri için model parametrelerinin oluşturulmasını sağladık. test_word(‘alan’, 5); satırı ile tanımasını istediğim “alan” sözcüğünü denedim ve sonuçta daha önce bu sözcüğü tanıtmış olduğum için yine en benzer olarak kendisini buldu. Aynı şeyi “benim” sözcüğü için denediğimde bu sözcüğe en yakın eğitim sözcüğü olan “bizim” sonucunu aldım. Yine daha önce tanıtmadığım “kadar” sözcüğünü denediğimde tanıtmış olduğum “kalan” sonucunu aldım. Gördüğünüz gibi, sistem sözcükler için oldukça efektif ve başarılı. Siz eğer en benzer sözcüğün sonuç olarak getirilmesini istemezseniz, elde edilen skor değerlerinden belli bir eşiğin üzerinde skorla benzer olanların doğru tanıma olarak kabul edilmesi şeklinde bir mantık uygulayabilirsiniz.
Umarım bu örnek uygulama bu alanda çalışmak isteyenlere fikir verir ve uygulama geliştirme aşamasında yardımcı olur. “Şu .m dosyalarına da bağlantı verseydiniz” dediğinizi duyar gibiyim. Özellikle bunu yapmadım, kodları bu sayfadan çıkartmaya ve açıklamalarımı okumaya üşenmeyin. Konuyla ilgili sorularınız olursa e-posta ile sormak yerine bu yazıya yorum bırakarak sorun, böylece vereceğim cevaplar ve gelişecek diyaloglar sonradan gelecekler için de yararlı olacaktır. Sorularınızı elimden geldiğince yanıtlayacağım ancak şu tür sorular olursa yanıtlamak istemiyorum: “kodu kopyaladım ama çalıştırırken xyz değişkeni bulunamadı diyor, ne yapmalıyım”, “Matlab’da wav dosyası nasıl kaydederim” gibi konu dışı ve Matlab’ın kullanımı ile ilgili sorular lütfen sormayın. Verdiğim kodlarda bir hata tespit ederseniz lütfen paylaşın, birlikte düzeltelim. Buraya çalıştırmadığım hiçbir kod koymadım, bu nedenle anlattığım şekilde uyguladığınızda çalışmaması için bir neden yok.
Konuşma Tanıma alanında çalışacak arkadaşlara başarılar dilerim. Kolay gelsin. Eğer burada yayınladığım bilgiler ve kodlar işinize yaradı ise bilmek isterim, hatta mümkünse bana proje raporunuzu, sunumunuzu, tezinizi vs. gönderirseniz yaptığınız çalışmaları okumaktan memnun olurum.



hocam yardımlarınız için çok teşekkür ederim.yazılarınız gerçekten yol gösterici oldu.
sude altınbaş
9 Ara 10 at 21:29
Hocam merhaba, öncelikle teşkkür ederiz elinize sağlık böyle bir paylaşım yaptığınız için. projeyi gerçekleştirmeye çalıştım, ama tanıma kısmında kelimeyi eşleştiremedi.”Recognized word is” ve is’den sonrasını getirmiyor, uğraştım ama çözemedim, nasıl yardımcı olabilirsiniz?
Gökhan
2 Oca 11 at 21:46
Gökhan, tanıma kodlarında neyi değiştirdiğini de bize göstermen lazım. Eğer eğitim aşamasında bir ya da daha fazla sözcüğü eğitmiş isen, tanıma aşamasında hatalı bile olsa en az 1 tanesini seçecek ve gösterecektir. Bence sorunu eğitim aşamasında aramalısın.
vtunali
2 Oca 11 at 23:15
Tmm hocam matlabda olan bir sorundan kaynaklandı sanırım, çok teşekkür ederim, sağlıcakla kalın.
Gökhan
3 Oca 11 at 23:44
Merhaba Hocam böylesine güzel bilgileri paylatığınız için teşekkr ederim.İlgi alanım olduğu için biraz uğraşmak istedim fakat henüz derleme kısmında
“??? Undefined command/function ‘train_word’. ” hatasını alıyorum Toolbox’ları eklediğim halde. Sorun nerden kaynaklanıyo olabilir acaba??
Neva
27 Mar 11 at 14:46
Hocam bir önceki sorunumu hallettim,derledim sonuna geldim fakat tüm test_word’lere karşılık sürekli “Recognized word is alan” cevabını veriyor.Sorun ses kayıtlarından(Mono&22 Khz) kaynaklanıyor diye ses kayıtlarını da değiştirdim fakat sonuç yine aynı. Ne yapmam gerek??
Neva
27 Mar 11 at 17:29
training_words ve testing_words isimli klasörlerde uygun wav dosyaları var değil mi?
vtunali
27 Mar 11 at 18:55
Evet Hocam aynen yazınızda anlattığınız gibi sesleri kaydettim ama hiç birebir eşleşen olmadı.Ben testing_word’lere farklı kişilerin seslerini kaydetmiştim o yüzden olabilir mi?? Tek bir kişinin sesi üzerinden mi yapmam gerek??
Neva
31 Mar 11 at 11:40
Eğitimde ve test aşamasında aynı kişinin seslendirdiği, sözcük kenarlarında uzun boşluklar yani sessizlik olmayan temiz kayıtlar kullanılmalı. Farklı kişilerin söylediği sözcükleri tanımasını beklemek bu kadar basit bir program ve az sayıda eğitim kaydıyla biraz haksızlık olur
vtunali
31 Mar 11 at 12:10
Volkan Bey Merhaba;
Benim sorum Mel-Frequency Cepstrum Coefficients(MFCC) algoritması hakkında olacak. Melcepst komutu ile bu algoritmayı oluşturuyoruz. Fakat bu “melcepst” komutunun matematiksel alt yapısı nedir? Melcepst fonksiyonu tüm bu aloritmayı barındırıyor mu? Cevaplarsanız çok sevineceğim. Teşekkürler. İyi çalışmalar.
Murat
1 May 11 at 22:09
Melcepst fonksiyonu MFCC değerlerini üretiyor.
MFCC’nin teorisi Mel Scale isimli bir filtreye dayanıyor. Bu filtre, insan ses algılama sisteminin frekansları algılayışına benzeyen bir yapıya sahip. Ayrıntılı bilgiyi Wikipedia’da bulabilirsiniz:
http://en.wikipedia.org/wiki/Mel-frequency_cepstrum
http://en.wikipedia.org/wiki/Mel_scale
vtunali
1 May 11 at 23:09
Merhaba Volkan Bey;
[my_mu,Sigma] = hmm_mint(X, st, N, DIAG_COV,QUIET);
Sigma = ones(N,1)*mean(Sigma);
logl = zeros(1, NIT); %likelihood hesaplanması
for n = 1:NIT
% EM algoritması için tahmin adımı
[tmp, logl(n), gamma] = hmm_mest(X, st, A, my_mu, Sigma, QUIET);
% EM algoritması için serbest maksimum yapma adımı
[my_mu, Sigma] = mix_par(X, gamma, DIAG_COV, QUIET); %Mixture parametrelerinin yeniden kestirimi
% Benzer serbest olmayan bütün kovaryans martislerine bağlı olarak EM maksimumu yapma işleminin modifikasyonu
Sigma = ones(N,1)*(sum((sum(gamma)’*ones(1,p)).*Sigma)/T);
end
my_sigma = Sigma(1,:);
Proramınızın yukarda yazdığım kelimeeğit fonksiyonun içindeki kısımda işlevi nedir?
hmm_mint, hmm_mest , ve mix_par fonksiyonlarının tam olarak ne yaptığını anlayamadım. Bunları bana açıklayabilir misiniz? Zaman ayırdığınız için teşekkürler. İyi çalışmalar.
Murat
22 May 11 at 16:16
HMM ile ilgili toolbox içerisindeki fonksiyonları ayrıntısıyla bilmiyorum; alıntıladığınız kodları ben yazmadım; bu toolbox içerisinde yer alan bir örneği kendi çalışmama uyarladım. Expectation Maximization, istatistiksel bir yöntemdir; belli bir istatiksel modele/dağılıma uygun olduğu bilinen gözlem verileri için bu modelin parametrelerinin tahminine çalışılır. Bu örnekte bu parametreler my_mu ve Sigma’dır. Daha ayrıntılı bilgi veremeyeceğim.
vtunali
22 May 11 at 17:02
Merhaba Volkan Bey;
Ben sizin koddaki melcepst fonksiyonu ile özellikleri çıkarttım. Ancak 672-22 boyutunda bir matris ortaya çıktı. Vektör Nicemleme yaparak yapay sinir ağlarına sokmam bunn için boyutu biraz daha düşürmem gerekli.Acaba sizin attığınız voicebox içinde Vektör nicemleme yapan( elde ettiğimiz özellik vektörünü sıkıştıran) herhangi bir kod var mıdır? Ya da Özellik vektör matrisinin 672 satırının sadece ilk 100 ünü kullanarak bir eğitim yapsam olur mu? Teşekkürler.
Birol
26 May 11 at 14:11
Birol, burada 672 satır olması melcepst fonksiyonuna verdiğin ses sinyalinin süresiyle orantılıdır. Bunun sadece bir kısmını alırsan eksik veri kullanmış olursun. Bunun yerine 2 önerim var:
1) melcepst’i 22 değil mesela 12 parametresiyle çalıştır. Böylece 12 boyutlu olur, çok fazla bir fark olacağını sanmıyorum alacağın sonuçlar açısından.
2) Pencereleme için de parametreler olması lazım, orada pencere boyutlarını biraz daha geniş verirsen aynı sürede daha az pencere olur, yani daha az satır ortaya çıkar, ama bu tanıma performansını olumsuz etkileyebilir.
Kolay gelsin.
vtunali
26 May 11 at 14:17
Merhabalar hocam,
Şu an bir ses tanıma yazılımı üzerinde çalışıyorum.Matlabın voicebox ya da hmm ‘sini kullanmadan ses tanıma yazılımı geliştiriyorum.Yaptığım adımlar
–>sesi kaydetme
–>sesin başını ve sonunu bulma
–>filtreden geçirme
–>pencereleme
–>fft dönüşümü
–>özilişki fonksiyonu sesi bu adımlardan geçirdim ancak tanıma kısmında sorun yaşadım.Tanımada öklid uzaklığı yöntemini kullanıyorum ama sürekli sorun cıkıyor.Tanıma kısmında önerebileceğiniz bişeyler var mı acaba?Zaman ayırdığınız için teşekkür ederim.
sena
31 May 11 at 11:49
Sena,
özilişki fonksiyonu dediğin fonksiyondan çıkan verinin yapısı nasıl, yani matris mi yoksa vektör mü? Öklid uzaklığı dediğine göre tek bir vektör mü çıkıyor ortaya?
Tanıma için Yapay Sinir Ağı da kullanılabilir.
vtunali
31 May 11 at 11:57
Hocam özilişkiden çıkan veri matris ,
Program çalıştıktan sonra elimde sadece 1 tane işlenmiş matris(ses verisi) oluyor.Ayrı ayrı m file’larda programı çalıştırıp iki tane matris elde ediyorum.Daha sonra bu iki ses verilerini alıp aralarındaki uzaklığa göre benzerliklerini bulmaya çalışıyorum.
sena
31 May 11 at 14:24
Matrisler arasındaki uzaklığı satır-satır öklid uzaklığı hesaplama şeklinde yapıyorsan yanlış olur. Farklı bir pattern recognition yöntemi denemelisin. HMM ya da YSA gibi.
Ayrıca her zaman matrislerin aynı boyutlarda mı oluyor? Nasıl bir karşılaştırma yapıyorsun?
vtunali
31 May 11 at 14:27
Genelde aynı boyutta olmuyorlar.Boyutu küçük olan matrise göre karşılaştırma yapıyorum.Hocam benim projemde komutlar sınırlı olduğu için sanırım ysa kullanmam daha iyi olacak.HMM yöntemini anladığım kadarı ile daha çok konuşma tanımada yararlı yani uzun cümlelerde .Benim komutlarım aç ,kapat gibi kısa komutlar olacak.HMM algoritmasını anladığımda pek söylenemez aslında hocam:)
sena
31 May 11 at 14:35
Öncelikle, yanlış yoldasın. Bu şekilde karşılaştırma tabi ki hatalı oluyor.
HMM ile ilgili düşünceni gözden geçirmelisin; benim burada yazdığım o kadar yazıyı ve verdiğim örnek kodları okumadın mı yoksa?
İki öznitelik matrisini bu amaçla karşılaştırabilmek için öklidden daha iyi bir yol denemelisin. Bilgin var ise YSA kullanabilirsin. Önce YSA’yı elindeki mevcut kayıtlarla eğit, sonra da sorgu kaydıyla sorgula, iyi sonuçlar aldığını göreceksin eğer öznitelik çıkarımında başarılı isen.
Kolay gelsin.
vtunali
31 May 11 at 14:49
Merhaba;
Ben de sesi bu adımlardan geçirdim fakat elimdeki veri çok büyük 22 olan parametreyi azalttım ve cerceveleme fonksıyonlarını olabildigince buyuk alıp ses sinyali özelliğini küçültmeye çalıştım. Ses sinyalinin süresini de düşürdüm fakat yine de büyük bir matris çıkıyor. Yapay sinir ağlarında test etme sürem cok uzun süre sürüyor. Bana da bu vektörü küçültmek için bir fonksiyon lazım.Volkan Bey siz de boyle bir komut var mı ya da ses tanıma ile çalışan arkadaşlarda var mıdır acaba?
Murat
31 May 11 at 20:55
Hocam öncelikle vermiş olduğunuz bilgiler için teşekkürler. Bende öznitelik çıkarımı hakkında bilginize başvuracaktım. FFT dönüşümü yapılmış bir ses verisi elimde mevcut fakat öznitelik çıkarımını tam olarak anlayamadım. Öznitelik çıkarımını kendim yapmak istiyorum fakat ne olması gerektiğini çıkaramadım. Bilgi verebilirseniz sevinirim. Teşekkürler…
Mehmet
2 Haz 11 at 01:24
Mehmet,
Ben tezimde bu alanda çok yaygın olarak kullanılan Mel Cepstrum özniteliklerini kullanmıştım. Hesaplanması konusunda Voicebox MATLAB kütüphanesindeki hazır MELCEPST fonksiyonunu kullanmıştım. Ayrıntısını öğrenmek isterseniz tezimde bununla ilgili konuya bakabilir ya da arama motorlarında “mel cepstrum” yazarak tonlarca bilgiye ulaşabilirsiniz. Mesela Wikipedia’da diyor ki:
http://en.wikipedia.org/wiki/Mel-frequency_cepstrum
Yani ilk adımı senin yaptığın şekilde Fouirer dönüşümü. Diğer adımları da bunun formülasyonundan yararlanarak yapabilirsin ya da tahminimce hazır bir kod bulabilirsin bunun için.
vtunali
2 Haz 11 at 03:11
merhaba volkan bey ses tanıma yazılımı geliştiriyoruz; ancak son aşamada sorun yaşıyoruz. Programımız şöyle çalışıyor: veri tabanındaki eğitimli veriler ile test verileri karşılaştırılıyor ve aralarındaki öklid uzaklığı hesaplanıyor. bunlar arasında uzaklığı en az kelime bulunup eşleştirme yapılıyor
örneğin
veri tabanı uzaklık test
a1 7.65 a5
a2 6.070
a3 8.701
a4 4.301
eşleştirme sonucu: test verisi olan a5 ile öklid uzaklığı en az olan veri a4 (4.301) olduğu için bu kelimeyle eşleştirme yapılıyor. sorunumuz her durumda eşleştirme yapılmasıdır; yani test verisi veri tabanında yosa bile en yakın uzaklıkta veri bulunup eşleştirme yapılıyor; ancak programımız sözcük veri tabanında olmadığında en yakın uzaklıktakş veri bulunmamalıdır, eşleştirme yapılmadı diye bizi uyarmalıdır yardımlarınız için şimdiden teşekkür ederiz saygılarımla
muhammed emin
22 Haz 11 at 10:23
Muhammed Bey,
Sorununuzu çok güzel ifade ettmişsiniz, öncelikle teşekkür ederim bu kadar ayrıntılı açıklamanız için.
Örüntü tanımada ya da benzeri sınıflandırma tekniklerinde en yakın sınıfa dahil etme beklenen bir durumdur.
Belki şöyle birşey yapılabilir, çok sayıda deney yaparak, bir eşik seviyesi tespit edebilirsiniz uzaklık değeri için. En yakın olarak a4 bulunmasına rağmen uzaklık değeri eşikten yüksek kaldığı için eşleşme sağlanmadı kabul edilebilir. İşte burada bu eşik seviyesinin tespiti biraz zahmetli olabilir, bazen de hataya neden olabilir ama konuşma tanımayı kullanacağınız sisteme göre böyle birşeyin yapılma imkanı bulunabilir.
Aklıma daha iyi bir fikir gelmiyor. Umarım cevabım hiç olmazsa bir fikir verebilmiştir. Başarılar dilerim.
vtunali
22 Haz 11 at 10:33
peki bu eşik değeri nasıl bulacağımıza dair biraz fikir verebilir misiniz?
muhammed emin
22 Haz 11 at 10:48
Eğitim verileriyle uyumlu testler yaparsınız. Doğru eşleşmelerde ortalama öklit uzaklığını tespit edersiniz. Buna %5-10 tolerans ekleyip bundan daha uzak bulunan eşleşmeleri eşleşme olarak kabul etmezsiniz. Bu basit bir yöntem, işe yarayabilir, benzeri birtakım istatistiksel şeyler de denenebilir.
vtunali
22 Haz 11 at 10:54
Train(veritabanı) —————— test
Aç—————————————– aç
Kapat———————————– - kapat
Masa————————————- masa
Kapı—————————————kuş
Aç için uzaklık verileri
3.9357—–aç (eşleşti)
6.0024—–kapat
6.2660——masa
6.6781—–kapı
Kapat için uzaklık verileri
5.6775——aç
3.9165——kapat (eşleşti)
5.2670—–masa
5.5780—–kapı
Masa için uzaklık verileri
6.4305——aç
5.1407—–kapat
4.0221—–masa (eşleşti)
5.6858—–kapı
Kuş
7.5408——-aç
7.3364—–kapat
7.1334——-masa (eşleşti)
7.2898——kapı
Program çıktısı:
1. Kelime 1. Kelime ile eşleşti
2. Kelime 2. Kelime ile eşleşti
3. Kelime 3. Kelime ile eşleşti
4. Kelime 3. Kelime ile eşleşti
bunlar gibi bir çok deneme yaptık ancak bir çözüme ulaşamadık. uzaklıkların aralarında bir bağlantı bulamıyoruz. aç kelimesi ile kapat ve masa kelimeleri arasındaki uzaklıktan yola çıkarak kapat ile masa arasındaki uzaklığı tahmin etmeye çalıştık ama sonuç çok farklı çıkıyor ayrıca 2 snlik boş ses ile denediğimizde de çok farklı uzaklık değerleri çıktı yani bu uzaklık verilerini neye göre gruplamamız gerekiyor
muhammed emin
22 Haz 11 at 11:26
Genelde eşleşenler için 5′ten küçük uzaklık değerleri elde edilmiş. Buradaki uygulamada eşik değerini 5 verebilirsiniz, böylece son örnekte masa ile kuş eşleşmemiş olur. Bunu gerçek uygulamada da kısıtlı sayıda sözcük tanıma yapılıyorsa benzer şekilde tespit edebilirsiniz sanırım.
vtunali
22 Haz 11 at 11:41
merhaba volkan bey öncelikle verdiğiniz bilgiler için teşekkür ederim yalnız şöyle bir sorunumuz var: bilgisayardaki kayıtlı dosyaları hem eğitim hem de test dizinine atıp test ettiğimizde yukarıdaki gibi düzenli rakalmlar bulmuştuk ve belli bir eşik değieri vererek kelimelerden istemediğimiz kelimeleri tanımasına izn vermemiştik; ancak mikrofonla dışarıdan eğitim için kayıt alıp eğitim dizinine attık, sonra dışarıdan test için kayıtlar alıp bu eğitimli verilerle karşılaştırmaya çalıştık; ancak uzaklık verileri dünkü gibi düzenli çıkmadı maalesef. eğitim verilerini test klasörüne kopyalayıp analiz yaptığımızda düzenli uzaklık verileri elde ediyoruz fakat test için mikrofondan sürekli kayıt almak zorundayız ama her yeni kayıt almamızda çok farklı veriler çıkıyor. örneğin eğitimli verilerdeki aç kelimesine karşılık mikrofonla aç dediğimizde eşiği aşamıyor ve tanınmadı diyor ama çanta dediğimizde eşleştirme yapıyor veya hiç konuşmadığımızda boş sesi bile aç kelimesiyle eşleştiriyor. ayrıca eğitim aşamasındaki ses tonunu da yakalayamıyoruz çoğu zaman. program farklı tonlardaki söyleyişleri ve farklı kişilerin aç demesini eşleştirebilmelidir, ama başka kelimeleri ve boş sesleri eşleştirmemelidir. bu iş için başka bir algoritma var mı veya mikrofonla ses kaydı alırken nelere dikkat etmeliyiz?
muhammed emin
23 Haz 11 at 14:29
Muhammed Bey,
Ben uzun süredir bu alanda teorik de olsa çalışma yapmıyorum ve pratik bir uygulamada bulunmadım. Pratikte bu tür sıkıntılar çıkabileceğini tahmin ediyorum ve uygulama sırasında karşılaşılan durumlar neticesinde elde edilen veriler ışığında birtakım çözümler geliştirmek durumundasınız. Bu da daha fazla veriyi gözden geçirmek ve genel-geçer birtakım kurallar bulmaya çalışmak şeklinde olabilir. Dünkü yorumlarımdaki önerilerim de bu doğrultudaydı. Şu anda aklıma çözüm anlamında size önerebilecek birşey gelmiyor.
Ayrıca bu tür sistemlerde sistemi kullanacak her kişi için ayrı bir eğitim seansı gerekir aksi halde tanıma başarımı çok düşük olabilir. Benim tez çalışmam da bu nedenle konuşmacı bağımlıydı. Birçok meşhur konuşma tanıma yazılımı da bu şekildedir.
Kayıt yaparken tanınması istenen sözcüğün sinyalinin başındaki ve sonundaki boşluk yani sessizlikle geçen kısımların kırpılması belki faydalı olabilir. Bunun için de çeşitli endpoint detection algoritmaları bulunabilir ya da yazılabilir.
Şimdilik söyleyebileceklerim bu kadar. Kolay gelsin. Eğer bu sorunlarınıza güzel çözümler bulursanız bunları bizimle paylaşırsanız çok memnun olurum.
vtunali
23 Haz 11 at 14:44
merhaba volkan bey,
vermiş olduğunuz bilgiler için teşekkür ederim.uygulamanızdaki ses dosyalırını söylediğiniz gibi yaptım ancak eşleştirme kısmında hep aynı sonucu alıyoruz yani şöyle açıklıyım testing_word klasorunde g1,g2,g3 ve training_word klasorlerine g1,g2,g3 adında 3 er wav dosyası koydum ve bunlar testing_word deki her bir wav dosyası training_worddeki wav dosyalarınyla bire bir eş olmasına rağmen programı çalıştırdığımda çıktı şöyle oluyor g1 için g1 regonized
g2 için g1 recognized
g3 için g1 recognized bu hatanın nerden kaylaklandıgı hakkında bilgi verirmisiniz acaba. teşekkürler..
soner
1 Tem 11 at 14:00
* Kayıtlarınız kısa olmalı, yani sadece tek sözcük içermeli
* Kayıtlarda sesli kısımların başında ve sonunda boşluk içeren süreler olmamalı
* Kayıtlar 22 Khz mono olmalı
Bunlara dikkat ettiğiniz ve verdiğim kodları aynen kullandığınız taktirde bu şekilde bir sonuç almamanız gerekir.
g1, g2 ve g3′te seslendirilen sözcükler birbirine çok mu yakın?
Aklıma başka birşey gelmiyor. Verdiğim kodları da yazıyı yazarken birebir deneyip buraya yapıştırdım; yani yıllar önce yazılmış kodlar ve tahmini örnekler vermedim.
Çözüm bulursanız lütfen buradan paylaşın; benzer durum yaşayan arkadaşlar için de faydalı olur.
Kolay gelsin.
vtunali
1 Tem 11 at 14:10
volkan bey merhabalar,
programınızı matlab’da denedim. Gayet güzel çalıştı beklenen sonuçları veriyor. Ancak bana lazım olan ek bir özellik de eğer testler içindeki kayıt trained word’ler içinden değilse kodun bunu bir şekilde anlaması ve söylenilenin trained word’ler içinden olmadığını göstermesi. Böyle bir amaç için ne yapabilirim acaba? Score için bir threshold koymayı düşündüm ancak sanıyorum hmm_vit komutu most-likely’yi bulmaya çalışıp ona göre göreceli bir score çıkardığı için söylenen ses dosyası trained word’lerle ne kadar alakasız bile olsa yüksek score’lar çıkabiliyor. Bu konuyla ilgili bir öneriniz olur mu acaba? Şimdiden teşekkür ederim. İyi günler dilerim.
bulut
13 Kas 11 at 15:16
Bulut,
Benim de ilk aklıma gelen bir eşik değeri kullanmak. Ama söylediğin durumdan dolayı uygun bir eşik bulmak biraz sıkıntılı olabilir.
Sistemin eğitiminde kullanılan her bir sözcük için ayrı bir eşik değeri oluşturmak fikri geldi akkıma. Test için kullandığımız ses kaydına karşılık diyelim ki “abc” sözcüğü için en yüksek skoru elde ettik ama emin olamıyoruz. “abc”yi sisteme öğretirken belki başka birkaç farklı “abc” kaydı yaparak sistemin bunu bulduğunda elde ettiği skora biraz da sapma payı bırakarak “abc” için bir eşik üretebiliriz. test kaydı sonucunda sistem bize “abc” buldum dediğinde “abc” için beklediğimiz eşiğin üzerinde ise bulduğunu kabul ederiz, değil ise tanımadı deriz. Bilmem anlatabildim mi? Ben olsam ilk böyle birşey denerdim.
vtunali
13 Kas 11 at 15:40
Hocam merhaba,
Ben ses tanıma yazılımı gerçekleştiriyorum. Bu konuda mfcc öznitelik vektörü çıkarım yöntemini kullanarak seslerin özelliklerini elde ettim. Burada öncelikle bişey sormak istiyorum. (Ben YSA kullanıyorum.) Öznitelik vektörü çıkarım aşamasından sonra yapmam gereken herhangi bir işlem varmıdır ysaya vermeden önce (verilerin ortalaması, standart sapması, min, max vs.) gibi.
Elimde 200 adet ses verisi var. Toplam 5 kişi kelime söyledi. 4 farklı ses var tanınmasını istediğim. Kişi başı karışık bir sırada 40 adet kelime söylendi bu kişiler tarafından tanınmasını istediğim kelimelerden. YSA uygulaması yapıyorum matlabda hazır tool ile. Verilerin 170 tanesini eğitim için kullanırken 30 adetini test için kullanıyorum. Eğitimden sonra bu 30 test verisi %100 e yakın tanınıyor. Daha sonrasında mikrofondan 1 adet ses kaydı alıyorum. Özniteliklerini çıkarıyorum ve aynı şekilde test ediyorum. Fakat sonuçlar çok uçuk çıkıyor. YSA hariç diğer tüm fonksiyonlar şahsıma ait şu anda. Ayrıca voicebox kütüphanesindeki mfcc ilede test ettim. Onda da çok kötü sonuçlar aldım. Yani anladığım kadarıyla problem ysa da. Bu konu hakkında bilgi verebilirmisiniz. MAtlab toolda nasıl tasarlamalıyım nelere dikkat etmeliyim. Eğer bu konu hakkında bilgi verebilirseniz sevinirim. Teşekkürler…
Mehmet
22 Kas 11 at 02:05
Mehmet,
Test sırasında aldığın kayıtların eğitim sırasında kullandıklarına göre farklılıkları varsa bunları önlemekle işe başlamanı öneririm. Ne gibi farklılıktan bahsediyoum? Mesela test kaydının başında ve sonunda boş geçen uzun süre varsa bunları kırpmadan işlem yapmamalısın. Ya da etkileyebilecek daha başka şeyler var mı? MFCC parametreleri eğitimdekilerle aynı olmalı vs.vs. Bütün bunlarda bir fark yok, herşey ideal durumda diyorsan, YSA konusunda bir yorum yapamayacağım. Matlab’daki YSA toolbox’ını tanımıyorum, YSA konusunda teorik bilgim ve daha önce yaptığım ufak bir çalışmaya dayanarak söylüyorum; ben de YSA’nın iyi sonuç vermesini beklerim açıkçası. Umarım kolay ve işe yarar bir çözüm bulursun. Başarılar.
vtunali
22 Kas 11 at 21:42
Merhabalar volkan bey,
verdiğiniz codeları çalıştırdım gayet iyi sonuç alıyorum fakat bunu gerçek zamanlı olarak gerçekleştirmek istiyorum fakat istenilen sonuç alınamıyor.Bunun mikrofondan olduğu düşüncesindeyim acaba bilginiz varsa bir mikrofon türü önerirmisiniz ,yourumunuz nedir.şimdiden çOk teşekkürler ..
deniz
17 Ara 11 at 17:39
Deniz,
Gerçek zamanlı ama her seferinde bir sözcük tanımaya yönelik bir uygulama yaptığızı düşünerek cevaplandırıyorum.
Mikrofon kalitesi bence ikinci derecede önemli. İlk olarak, gerçek zamanlı yaptığın kaydı tanıma işlemine sokmadan önce kaydın başında ve sonundaki sessiz kısımları yani bilgi içermeyen kısımları temizlediğinden emin ol.
Aklıma başka bir şey gelmiyor. Bu dediğimi denedikten sonra sonuçta bir değişme oluyor mu? Paylaşırsan üzerine devam ederiz.
Kolay gelsin.
vtunali
17 Ara 11 at 19:06
volkan bey,
dediğiniz gibi sessiz kısımlardan kurtuldum ve kayıtları iyi bir mikrofonla yaptım ve her seferinde bir sözcük tanımalı gerçek zamanlı bir uygulama oldu,
emeğiniz için teşekkür ederim …
deniz
27 Ara 11 at 20:39
Deniz,
Bu iyi bir haber. Tebrikler.
vtunali
27 Ara 11 at 21:01