Dr. Volkan Tunalı'nın Kişisel Blogu

Bilgisayar, Teknoloji, Bilim, Sanat

Archive for the ‘konuşma tanıma’ tag

Yapay Zeka Nedir?

leave a comment

Yapay Zeka kavramını her zamankinden çok duymaya başladık. Yapay Zeka içermeyen bir yazılım, bir sistem neredeyse yok gibi. Peki nedir bu Yapay Zeka, ve ne değildir? Bu yazımda, soru-cevap şeklinde Yapay Zeka ile ilgili anlaşılır bilgiler vermeye çalışacağım. Bu yazımın içeriği aslında 24 Eylül 2016 tarihinde TRT Kent Radyo İzmir, Bilişim Gündemi Programı‘nda Mustafa Özhan Kalaç ile yaptığımız söyleşinin derli toplu bir halidir. Söyleşiyi dinlemek isterseniz https://www.youtube.com/watch?v=pnQbISa9Z5I adresini ziyaret edebilirsiniz.

1. Yapay Zeka nedir?

Yapay Zeka ile ilgili belki de en zor şeylerden biri bana göre Yapay Zeka’yı tanımlamak, onun ne olduğunu açıklamak. Popüler kültürde muhtemelen bu konudaki roman ve filmlerin de etkisiyle, insan gibi düşünebilen, akıl yürütebilen, hatta insan gibi duyguları dahi olabilen, genellikle robot şeklinde, hatta insana çok benzer görünümde varlıklar akla geliyor. Tabi ki gerçek bundan biraz farklı.

Yapay Zeka alanında yapılan çalışmalar bu kavramın ortaya atıldığı ve başladığı 1950’lerden bugüne çok farklı yönlerde ilerlediği için farklı beklentiler ve amaçlar nedeniyle Yapay Zeka’nın farklı tanımlamaları mevcut. Ancak ben günümüzde Yapay Zeka çalışmalarının ağırlıklı olarak yöneldiği taraftan, modern ve daha anlamlı bir tanımlama yaparak başlamak istiyorum.

Yapay Zeka’nın genel kabul görmüş, modern tanımı şu şekilde: Yapay Zeka, insanlarda ve hayvanlarda zeki davranışın ne olduğunu inceleyen ve insan yapımı aygıtların nasıl zeki davranışlar sergileyebileceğini  araştıran, zeki davranışlar sergileyen aygıtlar geliştirmeye çalışan bir bilim dalıdır.

Burada önemli olan insan gibi düşünebilmek değil, ya da yalnızca düşünebilmek değil, zeki ve rasyonel yani akılcı davranışı anlamak ve makinelerin yani bilgisayarların bu akılcı davranışı sergilemesini sağlamak.

Akılcı davranış demek,

  • problemi anlamak,
  • çözüm stratejisi geliştirmek
  • ve sonra bu stratejiyi uygulayarak yani davranışta bulunarak problemi çözmek demek.

Bu sayede, günlük hayatta karşılaştığımız çok çeşitli problemlere bilgisayarlar aracılığıyla çözüm bulmaya çalışıyoruz.

Biz bunu aslında şimdiye kadar programlama yoluyla basitçe yapıyorduk. Ancak tabi ki burada amacımız basit, çözüm adımları algoritmik ve net olarak tanımlanmış  problemlerden ziyade mümkün olduğunca akılcı veya insanın sahip olduğu sağduyunun ve sezgilerin işin içine katılmasını gerektiren türde karmaşık ve zor problemlerin çözümünde Yapay Zeka’dan faydalanmak.

2. Peki, Yapay Zeka kullanılarak çözüm bulunan problemler neler? Yapay Zeka ne gibi alanlarda kullanılıyor?

Günümüzde Yapay Zeka çalışmalarında geliştirilen yöntemlerin kullanılmadığı alan neredeyse yok gibidir. Çok büyük sistemlerden çok ufak cihazlara kadar pek çok alanda Yapay Zeka’dan yararlanılmaktadır. Örneğin,

  • Proje planlama, kaynak planlama, fabrikalarda üretim planlama, araç rota planlama gibi optimizasyon gerektiren büyük çaplı planlama işlerinin bugün Yapay Zeka uygulanmadan yapılması düşünülemez.
    • Bu işlerde basit algoritmik yaklaşımlarla etkili çözümler elde etmek mümkün olmuyor ya da tahammül edilemeyecek kadar çok zaman alıyor. İşin içine zekice birşeyler katmanız ya da doğada çeşitli canlılarda görülen problem çözme davranışlarını katmanız gerekiyor.
  • Satranç ve Go gibi stratejiye dayalı oyunların geliştirilmesinde de Yapay Zeka teknikleri çokça kullanılmaktadır.
  • Yapay Zeka çalışmalarının önemli bir bölümü ise Machine Learning yani Makine Öğrenmesi veya Yapay Öğrenme dediğimiz, öğrenebilen sistemler geliştirmeyle ilgilenmektedir.
  • Bu sistemler sayesinde, günümüzde
    • son derece gelişmiş konuşma tanıma sistemleri var.
    • Benzer yaklaşımı yüz tanıma,
    • iris tanıma,
    • el yazısı tanıma,
    • imza tanıma ve doğrulama gibi sistemlerde başarıyla kullanıyoruz.
    • Daha ileri ve yeni bir örnek olarak, herhangi bir resimdeki varlıkların ne olduğunu, bu varlıkların özelliklerini, rengini, o anda ne yapmakta olduğunu, nerede bulunduğunu tanıyabilen sistemler geliştirilmiş durumda.
  • Akıllı telefonlardaki bir diyalog uygulaması
    • sizin ne dediğinizi yani konuşmanızı tanıyor,
    • metne dönüştürüyor,
    • bunu anlamlandırıp aslında sizin ne istediğinize karar veriyor,
    • son olarak da ekrana yazı yazarak ya da ilgili bir uygulamayı açarak isteğinize uygun bir karşılık veriyor.
    • Bu kadar karmaşık bir işlem dizisinde çok çeşitli Yapay Zeka tekniklerinin bir arada kullanıldığını söyleyebiliriz.
  • Yine, akıllı telefonlardaki Navigasyon uygulamalarının önemli bir Yapay Zeka ürünü olduğunu söyleyebiliriz.

3. Yapay Zeka çalışmalarının ulaştığı durum nedir? Dikkat çekici başarı örnekleri verebilir misiniz?

Biraz klasik olacak ve belki de eski kalmış örnekler olacak ama IBM’in Yapay Zeka alanındaki çalışmaları oldukça dikkate değer. İlk olarak, 1997’de IBM’in DeepBlue isimli bilgisayarı dünya satranç şampiyonu Garry Kasparov’u satranç oyununda 3 buçuğa 2 buçuk skorla yenmişti.

IBM’in Watson isimli bilgisayarı ise 2011’de Jeopardy (bizde eski Riziko, yenilerde Selçuk Yöntem’in sunduğu Büyük Risk) yarışmasında önceki iki şampiyona karşı yarışmış ve büyük ödül 1 milyon dolar kazanmıştı. Bu yarışmanın özelliği ise soruların doğal dil ile sorulması ve Watson’ın cevapları yine doğal dil ile yani düzgün cümleler halinde vermesiydi. Bu bakımdan önemli bir gelişmedir.

Geçtiğimiz aylarda Yine IBM’in Watson’ının desteğiyle, yapay zeka konulu bir filmin fragmanı 24 saat gibi kısa bir sürede oluşturuldu. Normalde bu işlemin 7 ila 20 gün arasında sürdüğü belirtiliyor.

Daha yakın tarihli bir örnek olarak Google’ın ve onu takip eden çeşitli firmaların sürücüsüz otomobil çalışmalarını göstermek mümkün. Böyle bir otomobil yapabilmek için Yapay Zeka kapsamına giren pek çok teknolojinin bir arada çalışması gerekiyor.

Ağustos ayında sürücüsüz taksi uygulaması Singapur’da pilot bir bölgede başlatıldı. Açıkçası, bu çok ciddi bir gelişme. Sürücüsüz otomobil kavramını çok ileriye taşıyan bir şey bu.

Boston Dynamics tarafından üretilen, genellikle görünüş olarak köpeğe benzeyen, her tür yeryüzü koşulunda hareket edebilen, düştüğünde kalkabilen robotları da örnek olarak vermek mümkündür.

Son olarak, bir dilden başka bir dile çeviri sistemleri giderek daha başarılı olmaya başladı. Yapay Zeka için belki de en zor problemlerden biri doğal dil anlama ve çeviri yapma. İleride Türkçe’yi daha iyi anlayan sistemler görmeyi umuyoruz.

4. Yapay Zeka’nın sınırlılıkları var mı? Yapay Zeka ile yapılamayan, ulaşılamayan şeyler nedir?

Evet, maalesef Yapay Zeka ile ilgili başarı olarak değerlendirebileceğimiz gelişmeler genellikle sınırlı problemlere getirilmiş sınırlı çözümlerdir. Örneğin, konuşma tanıma için eğitilmiş ya da öğrenmiş bir sistemi hiç değiştirmeden yüz tanıma için kullanamıyoruz. Ya da aynı zamanda yüz tanıma için de eğitelim ve iki işi de yapabilsin diyemiyoruz. Veya, bir problem alandaki çözümü benzer veya değil başka alanlardaki problemlerin çözümü için genelleyemiyoruz. Yani YAPAY GENEL ZEKA’ya henüz ulaşmış değiliz, muhtemelen daha çok uzağındayız.

5. Gerçekten ZEKİ bilgisayarları ya da filmlerdeki gibi zeki robotları ne zaman göreceğiz? Robotlar dünyayı ele geçirecek mi?

Herkeste “tümüyle insanlarınkine benzer bir zeka”, hatta insanüstü bir yapay zeka ve bu zekaya sahip robotlar beklentisi var. Bu robotların bir gün dünyayı istila edeceği, insan ırkının tehlikeye gireceği çok yaygın bir tema.

Mart 2016’da yapılan bir araştırmada, Yapay Zeka alanında çalışan 193 araştırmacının fikri sorulmuş.

  • %8’i gelecek 10 ila 25 yıl içinde
  • %68’i 25 yıldan daha uzun bir zaman sonra
  • %25’i ise asla olamayacağını belirtmiştir.

Ancak, maalesef şu anda insan zekası hakkında, bu beklentileri karşılayacak makineler yapabilmemizde işimize yarayacak pek bir şey bilmiyoruz. Dolayısıyla, bana göre bir Skynet ya da Cylon’lar beklemek için çok erken. Şimdiye kadar geliştirilen en zeki sistem bile insandaki zeka ve bilinç ve anlama yeteneğinden çok uzakta, yalnızca mekanik kurallara göre çalışan bir sistem.

6. Yapay Zeka’nın sosyal etkileri konusunda ne gibi beklentiler var? Toplumlar, Yapay Zeka çalışmalarından nasıl etkilenecek? Sorun yaşanacak mı?

Evet, aslında robotların dünyayı ele geçirip geçirmeyeceğinden daha önemli  sorular ve sorunlar var. Bildiğiniz gibi, bütün teknolojik gelişmeler toplumlarda mutlaka değişime neden olur. Özellikle de geçiş dönemlerinde, insan emeğinin yerini teknoloji almaya başladıkça işsizlik sorunu gündeme gelir. Belli bir kesim işini kaybeder.

Bilindiği gibi Endüstri devrimiyle birlikte el işinin yerini makineler aldı. Fabrikadaki üretim hatlarında insan yerine robot kollar montaj yapmaya başladı. Bunun gibi, Yapay Zeka sayesinde eskiye nazaran daha fazla şey otomatize edilebilecek. Dolayısıyla, bazı meslekler zamanla azalacak ve kaybolacak. Ancak, geçiş döneminin ardından geriye dönülmeyeceğine göre, tamamen farklı ve yeni iş sahalarının ve pazarların oluşması da söz konusu. Elbette ki her meslek dalı aynı derecede etkilenmeyecektir, her şeyi aynı derecede otomatikleştirmek mümkün olamaz. Yapay Zeka bazı alanlarda insanın uzmanlığını destekleyen yardımcı unsur olarak yer alacaktır.

Singapur’daki sürücüsüz taksi denemelerini bu durumun ilk örneklerinden biri olarak düşünebiliriz. Özellikle taşımacılık sektöründe Uber, Google ve Tesla gibi şirketler sürücüsüz araç konusuna yoğun ilgi gösteriyorlar. Taksi sürücülerinin ve kamyon şoförlerinin bu durumdan etkileneceği düşünülebilir. Yeni rastladığım bir haberde 2021 itibariyle Amerika’daki işlerin %6’sının robotlar tarafından yapılır duruma geleceği belirtiliyor. Özellikle de müşteri hizmetleri personeliyle kamyon ve taksi sürücülerinin işlerinde. Elbette bu sistemlerin geliştirilmesi ve bakımı gibi yeni iş alanlarının oluşacağı da düşünülüyor ama işsiz kalanların kolayca transfer edilebileceği işler olmayacaktır.

İşsizliğin çok önemli sosyal sorunlara yol açtığı biliniyor. Hatta, taksi sürücülerinin Uber uygulaması nedeniyle yaşadıkları iş kaybını dünya çapında protestoları da biliniyor. Kaldı ki tümüyle işsiz kaldıklarında taksi sürücülerinin daha ciddi tepkiler göstereceğini beklemek yanlış olmaz.

İşsizlik dışında oluşabilecek başka sorunlar da var. Mesela, sürücüsüz bir aracın bir kazaya karışması durumunda sorumluluk kime ait olacak? Ya da bir makine tarafından yapılan bir tıbbi müdahalede yaşanan bir hatada ve olumsuzlukta sorumluluk kimde olacak? Hukuki düzenlemeler daima olayların çok gerisinden gelir. Dolayısıyla, bu noktada da ciddi sorunlar doğması muhtemel.

7. Son cümleler?

Yapay Zeka hızla gelişmeye devam eden bir alan. Yapay Zeka’nın kullanıldığı daha fazla uygulamayı görmeyi bekleyebiliriz. Yapay Zeka elbette getirdiği kolaylıklar ve konforun yanı sıra toplumsal sorunlara da yol açabilecektir. Bunu çok beklemeye gerek kalmadan göreceğiz muhtemelen. Ancak, distopya filmlerindeki gibi dünyayı ele geçiren, insanlığı yok eden robotlardan şimdilik korkmamıza gerek olmadığını düşünüyorum.

Not: Bu yazının tamamı ya da büyük bir kısmı izin alınmaksızın başka sitelerde veya ortamlarda yayınlanamaz. Kaynak gösterilerek ve bu sayfaya açık bir bağlantı verilerek kısmen yayınlanması mümkündür.

Matlab ile Örnek Bir Konuşma Tanıma Uygulaması – Sonuç

7 comments

Matlab kullanarak örnek bir Konuşma Tanıma uygulamasının nasıl yapılabileceğine ilişkin Giriş ve Gelişme başlıklı iki yazı yazmıştım. Bu yazılara şu bağlantılardan ulaşabilirsiniz:

Matlab ile Örnek Bir Konuşma Tanıma Uygulaması – Giriş
Matlab ile Örnek Bir Konuşma Tanıma Uygulaması – Gelişme

Şimdi bu yazı serisini bir Sonuç yazısı ile sonlandırmak istiyorum.

Giriş ve Gelişme yazılarımdan sonra beklediğim gibi, bana bu konuda e-posta ile ulaşanların sayısı sıfıra yaklaştı. Umarım gerçekten yararlı olmuştur; bu konuda geri bildirim gelmediği için bilgim yok. Keşke bu yazılardan yararlananlar yaptıkları çalışmalar hakkında kısaca bilgi verseler, bu alanda yapılan çalışmaları bilmek gerçekten hoşuma gider. Nadiren de olsa konuşma tanımayı kullanan değişik uygulamalar (cihaz denetimi vb.) yapmayla ilgili bilgi ve fikir almak için e-posta ile ulaşanlar oluyor, bu da bana örnek uygulamanın deneyenler tarafından kullanılabilir olduğunu ve işe yaradığını gösteriyor.

Yazımı Konuşma Tanıma alanında çalışan herkese başarılar dileyerek bitirmek istiyorum. Kolay gelsin.

Written by vtunali

Nisan 4th, 2011 at 1:55 am

Matlab ile Örnek Bir Konuşma Tanıma Uygulaması – Gelişme

65 comments

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.

Written by vtunali

Aralık 5th, 2010 at 2:48 am

Matlab ile Örnek Bir Konuşma Tanıma Uygulaması – Giriş

9 comments

Konuşma Tanıma alanında proje yapmak isteyen öğrenciler sanıyorum ki sıklıkla benim tezimle ilgili sayfaya ulaşıyorlar ve benden bu konuda yardım istiyorlar. Genellikle de konuyla ilgili yardım istekleri şu şekilde oluyor:

  • Nereden başlayalım?
  • XYZ programlama diliyle yapmayı düşünüyorum, ne dersiniz?
  • Şöyle bir uygulama gerekiyor, yapılabilir mi?
  • Tezinizin Türkçe’si var mı?

Çok fazla zaman ayıramasam da bana ulaşan kimseyi yanıtsız ve yardımsız bırakmamak için en azından görüşlerimi paylaşıp yönlendirici bilgiler vermeye çalışıyorum. Genellikle de isteyen olursa tezimin Matlab kodlarını ve kullandığım Voicebox ve HMM toobox’larını veriyorum. Kodlardan ne kadar yararlanılabildi bu güne kadar pek bilemiyorum ama zaman zaman kodlardan da bir çıkış yolu ya da başlangıç noktası bulamayanlar oluyor. Bu nedenle ben de bu toolbox’ların nasıl kullanılabileceğini, basit bir konuşma tanıma uygulamasının nasıl yapılabileceğini örnek yaparak göstermeye karar verdim. Böylece pek çok kişi için başlangıç aşamasında daha büyük bir yardım sağlamış olurum diye düşünüyorum. Umarım bu, kopyala-yapıştır proje yapma meraklılarını fazla heveslendirmez.

Örnek uygulamayı kısa süre içerisinde hazırlayıp yayınlayacağım ve adım adım anlatacağım. Ancak, bunun öncesinde, özellikle konuşma tanıma alanında proje hazırlamayı düşünen arkadaşlarıma yönelik değinmek istediğim şeyler var.

Bazen lisans bitirme tezi, bazen de bir dersin dönem projesi olarak konuşma tanıma ile ilgili uygulamalar yapmak isteyenleri görüyorum. Şunun bilinmesini isterim ki basit, birkaç sözcük tanıması yeterli olan bir sistemi yapmak nispeten kolay, ama işin kapsamı genişledikçe, uygulamadan beklenen şeylerin çapı arttıkça zor bir yola girilmekte. Bu nedenle bu tür bir projeyi seçmeden önce buna dikkat edilmesini öneririm. Hatta, eğer akademik hayatınızın ileriki dönemlerinde benzer bir alanda çalışmayı düşünmüyorsanız bence yolun başındayken ileride de çalışmak isteyebileceğiniz başka bir konu seçin. Çok ciddiyim.

Matlab, sadece konuşma tanıma alanında değil, çok çeşitli bilim ve mühendislik alanlarında hızlı prototip geliştirme ve çabuk deneme yapma olanağı sağlayan mükemmel bir araç (hiç abartmıyorum). Yüksek lisans tezimi yaparken Matlab kullandım ve bunun çok avantajını gördüm. Sonrasında da pek çok projemde ve çalışmamda sıkça kullandım, halen doktora tezimle ilgili çalışmalarda da yoğun bir biçimde kullanmaktayım. Eğer başka bir dil kullanarak proje yapmanız gerekiyorsa biraz zorlanabilirsiniz, ses sinyali işleme ve örüntü tanıma (pattern recognition) alanında hazır kütüphanelere ihtiyacınız olacak. Eğer bir kısıtlamanız yoksa Matlab’ı tercih etmenizi öneririm. Herhangi bir programlama dilini biliyorsanız, Matlab’da program yazmayı birkaç örnek yaparak işinize yarayacak ölçüde öğrenebilirsiniz.

Konuşma Tanıma ile ilgili çalışacakların en başında şu 2 temel alandan bilgiler edinmeleri çok yararlı olacaktır:

  • Ses Sinyali İşleme: Temel bilgilere sahip olmanız çalışmanız ve araştırmanız sırasında karşılacağınız terimleri, yazıları, örnekleri daha rahat anlamanızı sağlar. Frekans, pencereleme, spektrum vs. bilinmesinde fayda var.
  • Örüntü Tanıma ve Sınıflandırma (Pattern Recognition & Classification): Genellikle Yapay Zeka başlığı altında incelenen bu konuda çok çeşitli yöntemler/algoritmalar geliştirilmiştir. Örneğin, HMM, Yapay Sinir Ağları, vs. Efektif olması ve hazır toolbox’a sahip olduğum için ben HMM kullanmayı tercih ettim. Konuşma Tanıma alanda çalışacakların bu konularda en azından ön bilgi sahibi olması çok yerinde olur.

Son olarak, benim tezim 2005 yılındaydı. O günden bugüne Türkçe veya değil, konuşma tanımayla ilgili pek çok tez yapıldığını tahmin ediyorum. Ben hiç takip etme fırsatı bulamadım ve zaten tamamen başka bir alanda çalışıyorum. YÖK’ün tez tarama sayfalarından mutlaka araştırma yapılmalı ve ilgili tezler incelenmeli. Hatta bu tezlerin sahipleriyle de iletişim kurularak bilgi alınması yararlı olabilir, akıl akıldan üstündür, yeni teknikler geliştirilmiş olabilir. Ayrıca, benim tezimin referanslar bölümünde çok yararlı kitaplar ve tezler yer alıyor, onlara bakılmasını da tavsiye ederim. Bundan 5-6 sene önce kitap bulmak zordu ama şimdi rahatlıkla pek çok kitabı e-book olarak bulabilirsiniz. Bulamadığınız olursa, ben Boğaziçi Üniversitesi’nin kütüphanesinden çok yararlanmıştım, oraya bakabilirsiniz. Tezimin Türkçe hali yok, orijinali İngilizce.

Bu yazdıklarımın Konuşma Tanıma alanında çalışmak isteyenlere az da olsa fikir verebildiğini umarım. Herkese çalışmalarında başarılar dilerim.

Not: Sorusu olan arkadaşlar, burada yorum bırakarak sorarlarsa, yapacağımız diyaloglar sonradan gelecek arkadaşlara da yararlı olabilir.

Written by vtunali

Aralık 3rd, 2010 at 12:29 am

Konuşma Tanıma Mı Konuşmacı Tanıma Mı?

4 comments

Konuşma Tanıma ile ilgili benim yüksek lisans tezim ve Konuşmacı Tanıma ile ilgili Ozan Mut’un yüksek lisans tezini sitemde yayınlamaya başladığım günden bu yana sıklıkla üniversite öğrencilerinden ve bazen de profesyonellerden bu iki konuyla ilgili çok sayıda bilgi talebi ve proje için yardım isteği alıyorum. Bugüne kadar bana ulaşan hiç kimseyi geri çevirmedim. İş ve doktora çalışmalarımın yoğunluğu nedeniyle fazlaca yardımcı olamadıysam bile en azından fikir vermeye çalıştım, isteyen herkese de yüksek lisans projemin Matlab kodlarını olduğu gibi gönderdim. Bu konularda yardıma ihtiyacı olan herkese yine elimden geldiğince yardımcı olmaya devam edeceğim.

Bu yazıyı yazmaya neden ihtiyaç duyduğuma gelince. Bana bilgi ve yardım için ulaşanların çok az bir kısmı hangi amaçla, ne kadar kapsamlı ve ne tür bir proje yapmakta olduğunu, ne tür bir yardıma ihtiyacı olduğunu belirtiyor. Büyük çoğunluk ise sanıyorum ki iki farklı tez yayınladığımdan dolayı yanılgıya düşerek benim projemle ilgisi olmayan Konuşmacı Tanıma’yla ilgili bir çalışma için yardım istiyor. Gelen isteklerin bir bölümü de teslim gününe çok az kalmış okul projeleri için çalışan örnek kod şeklinde oluyor.

Öncelikle şunu iyi ayırdetmek lazım. Konuşmacı Tanıma (yani Speaker Recognition) sisteminin amacı konuşan kişiyi tanımlamak, sisteme tanıtılmış bir grup kişinin sesi arasından test edilen sesin kime ait olduğunu ortaya çıkartmaktır. Konuşma Tanıma (yani Speech Recognition) sistemi ise belirli bir kişi tarafından söylenmiş olan bir ifadenin metin karşılığını elde etmeye çalışır. Ses sinyalinin işlenmesi vb. temel prensiplerde benzer olsalar da bu ikisi birbirinden çok farklı amaçları ve çalışma prensipleri olan sistemlerdir.

Benim yüksek lisans tezim Konuşma Tanıma ile ilgilidir. Bu konuda çalışacak kişilere elimdeki her türlü kaynak kitap, makale, Matlab toolbox’ları ve projemin kaynak kodlarını memnuniyetle verebilirim [28.10.2010 Ek bir açıklama yapayım: Tezimin referanslarında yer alan kitapları sanıyorum ki artık e-book olarak bulmak mümkün. E-book bulamazsanız, orijinal kitapları ben Boğaziçi Üniversitesi'nin kütüphanesinden temin etmiştim. Eğer oradan da bulma imkanınız olmazsa ben elimdeki fotokopi halindeki kitapları kısa süreli olarak ödünç verebilirim].

Konuşmacı Tanıma konusunda yardıma ihtiyacı olanların Ozan Mut’a ulaşmasını rica ediyorum. Eğer iletişim kuramıyorsanız bana ihtiyaç duyduğunuz şeyleri ayrıntılı olarak yazarsanız Ozan Mut’a iletmeye çalışırım. [06.02.2012 Ek açıklama: Ozan Bey uzun süredir bu alanla ilgilenmediği ve işlerinin yoğunluğu nedeniyle bu konudaki soru ve istekleri kendisine yönlendirmememi istedi, dolayısıyla lütfen bu konuda benden istekte bulunmayın].

Bilgi ve yardıma ihtiyaç duyduğunuz konuda lütfen şunları belirtmeyi unutmayın:

  • Hangi okul ve bölümde öğrencisiniz?
  • Hangi amaçla bir proje yapıyorsunuz? Dönem projesi mi? Bitirme projesi mi? Yüksek Lisans projesi mi?
  • Projenizi hangi ortamda geliştiriyorsunuz? Matlab mı? C++ mı? Başka birşey mi?
  • Şu ana kadar yaptığınız çalışmada hangi noktaya geldiniz ve o nokta itibariyle nasıl bir yardıma ihtiyacınız var?
  • Projeniz için teslim zamanı nedir? Son dakikada birşeyler yapıp teslim etme derdinde misiniz? Yoksa makul bir sürede ciddi bir çalışma üzerinde misiniz?

Bu bilgiler verilmediği zaman yardımcı olabilmek için bu bilgileri istemek üzere karşılıklı bir e-posta trafiği başlatmak zorunda kalıyorum. Bu da iki taraf için ciddi bir zaman kaybı oluyor.

Şu anda tamamen farklı bir alanda doktora çalışması yaptığım için yüksek lisans projemin Matlab kodlarıyla ilgili ayrıntılı bilgi verebilecek, uzun açıklamalar yapabilecek ve çarçabuk basit ve çalışan bir örnek çıkartabilecek durumda değilim. Tezimde yeterince ayrıntı var. Bir miktar Matlab bilgisiyle kodlar üzerinden epeyce şey öğrenilebilir.

Bu alanların birinde çalışma yapan herkese başarılar diliyorum. Kolay gelsin.

Written by vtunali

Ocak 24th, 2010 at 1:53 am