İşaret Dili Çeviricisi

2012 öğretim yılında az da olsa halen okulumuza gelmekte olan iyi insanlarla (öğrencilerimzle) yaptığımız bu çalışma kendisine verilen bir metni işaret diline çevirmektedir. Çeviri yaparken şu hali ile 3 adet kelimeye kadar olan deyimleri de cümle içerisinde ayırt edebilmektedir yani "hadi plaja gidelim" şeklinde işaret dilinde bir yapı varsa bunun karşılığı olan işaret ya da işaretleri oynatmaktadır özetle kısıtlı da olsa cümleciklerden oluşan işaret dili yapılarına duyarlıdır. Ayrıca genişletilebilir bir sözlüğü bulunmaktadır ilk çalıştırıldığında DATA/VIDEO klasöründe sözlüğünü aramakta şayet bulursa yüklemektedir. Eğer işaret dli için kapsamlı bir video çekimi yapılarak geniş bir video kütüphane hazırlanırsa oldukça verimli kullanılabilecek bir uygulamadır. Kütüphanesini düzenlemek, yeni sözcükler eklemek ya da bazılarını silebilmek için yine Microsoft Studio 2010 ile bir masaüstü uygulaması geliştirdik böylece kütüphanesine yeni kelime ve deyimler eklendikçe daha doğru çeviriler yapabilecektir. İşin doğrusu bunu google speech-to-text ile birleştirdik ve Chrome ile gözatıcısı ile denedik internet hızı güzel ise oldukça güzel bir uygulama oluyor siz konuşuyorsunuz konuştuklarınız önce yazıya sonrasında ise işaret diline çevriliyor. Bu arada bizim bu uygulamada kullandığımız veriler http://www.spreadthesign.com adresinden alınmış olup amaç sadece eğitimdir. Burada internet sitemin alanı ve band genişliği yeterli olmadığı için kütüphanesini yayınlayamıyorum arzu edenler irtibata geçerlerse yardımcı olabiliriz. Proje uygulanırken kabaca aşağıda verilen aşamalardan geçilmiştir.

  1. Projenin ilk aşamasında işaret dilinin genel yapısı incelenmiş ve kelime tabanlı bir dil olduğu ve işaret dili alfabesinin sadece dil içerisinde yer almayan sözcüklerin anlatımında nadiren kullanıldığı tespit edilmiştir.
  2. İkinci aşamada Türk işaret dili çalışmaları incelenmiştir. Bu konuda internet üzerinde materyal tarama yoluna gidilmiştir.
  3. Üçüncü aşamada konuşma dilinden işaret diline çevrim yapacak olan ara-yüzün Adobe Flash programıyla tasarımı yapılmış ve çevrimde kullanılacak algoritma oluşturulmuştur. İlk tasarımda kelime kelime çevrim yapılmaya çalışılmış bu işlemde belirli düzeyde bir başarı elde edilince birkaç kelimeden oluşan deyimlerin de çevriminin yapılabilmesine çalışılmıştır.
  4. Dördüncü aşamada çevrim ara-yüzünün kullanacağı kütüphaneyi yönetebilmek için Microsoft Visual Studio 2010 tümleşik geliştirme ortamı kullanılarak bir uygulama geliştirilmiştir. Bu uygulama ile yeni kelimeleri anlatan videolar sisteme rahat bir biçimde eklenebilmesi ve böylece çevrimde kullanılacak sözcük kütüphanesinin genişletilebilmesi imkânı doğmuştur.
  5. Beşinci olarak kütüphanede yer alan videoların çevrim sırasında oluşacak gecikmeleri engelleyebilmek için sözcükleri tanımlayan videolar Sony Vegas Pro yazılımı ile düzenlenmiş, videoların başında ve sonunda yer alan gereksiz boşluklar temizlenmiştir.
  6. Son aşamada yazılım test edilerek çalışma zamanı hataları tespit edilmeye ve yakalanan hataların giderilmesine çalışılmıştır. Yazılımın verimli bir biçimde kullanılabilmesi için son kullanıcılar tarafından kullanılarak tasarımcı tarafından tespit edilemeyen hatalarının tespitinin ve gerekli kod düzeltmelerinin yapılması gerekmektedir.

Ayrıca aşağıda sizlere sunduğumuz bu basit uygulamanın kaynak kodlarından kabaca bir derleme yaptım.


import mx.video.*;
//import mx.video.VideoError.code;
import mx.controls.Alert;
System.useCodepage=true;
var oynatimBitti:Object= new Object();
var videoDosyasi:String= new String();
var cumle:String= new String();
var kelimeler:Array= new Array();
var aktifText:String= new String();
var pasifText:String= new String();
var sure:Number=1000;
var karSay:Number=0;
var islemID:Number;
var indeks:Number=0;//video numarasini gosteriyor.
var durum:Boolean=false;
var cevrimBasladimi:Boolean=false;
var fare:Object= new Object();
var nerede:Number=0;
//0 bosta
//1 zaman ayari title bar uzerinde
//2 zaman ayari sliderbar uzerinde
//3 uygulama kapatma penceresi baslik cubugu üzerinde
//4 alfabe baslik cubugu üzerinde
//false ceviri yok
//true ceviri yapiliyor.
var myXML:XML=new XML();
var records:Array=new Array();
var limit:Number;
System.useCodepage=true;//to prevent disturbing Turkish character problem
myXML.ignoreWhite=true;
try{
myXML.load("DATA/VIDEO/sozluk.xml");
}catch(myErr:Error){
hataPaneli_mc.hata_txt.text=myErr.message.toString();
}
myXML.onLoad=function(success:Boolean){
if(success){
hataPaneli_mc.hata_txt.text="Sözlük başarı ile yüklendi";
}
}
function kayitVarmi(deger:String):Boolean{
///////////////////////////////////////////////////////////////////////////
//Created By			: Bilal SERT
//Date Time				: 
//Modified By			:
//Calls					:
//Called By				:
///////////////////////////////////////////////////////////////////////////
records=myXML.childNodes[0].childNodes;
limit=records.length;
for(var sayici=0;sayici < limit;sayici++){
//kelime mevcut
if(records[sayici].childNodes[0].firstChild.nodeValue.toString()==deger){
//videoFile
videoDosyasi=records[sayici].childNodes[1].firstChild.nodeValue.toString();	
return true;
}
}
return false;
}//moveOnRecords()
baslangicAyarlariniYukle();
fscommand("allowscale",false);
fscommand("fullscreen",true);
// DUGME OLAYLARI //////////////////////////////////////////
cevir_btn.onRelease=function():Void{
var deyim:String= new String("");
if(giris_txt.text!=""){//deger girilmisse
//dugme ceviri bitene kadar iptal ediliyor
if(! cevrimBasladimi){ 
cevrimBasladimi=true;
baslangicAyarlariniYukle();
karaoke_txt._visible=true;
if(kayitVarmi(kelimeler[indeks])==true){
//kelime bulundu ayni kelime ile baslayan bir deyim var mi?
deyim=kelimeler[indeks];
if(indeks < kelimeler.length)indeks--;
deyim=deyim + " " + kelimeler[indeks];
//deyim var mi sorgulaniyor
if(kayitVarmi(deyim)==fale){
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(deyim);					
}else{
//deyim bulunamadi sozcuk oynatilacak
indeks--;		
//kelime sozlukte varsa videosunu oynatarak basla
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(kelimeler[indeks]);
}//deyim var mi?
}else	{
//kelime sozlukte yoksa o kelime ile baslayan bir deyim var mi inceleniyor.
deyim=kelimeler[indeks];
//if(indeks < kelimeler.length+1)indeks++;
//deyim=deyim + " " + kelimeler[indeks];
indeks++;
if(indeks < kelimeler.length-1)	deyim=deyim + " " + 
kelimeler[indeks];else deyim=deyim + " "  + deyim;				
//deyim var mi sorgulaniyor
if(kayitVarmi(deyim)==true){
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(deyim);					
}else{
//deyim bulunamadi sozcuk oynatilacak
indeks--;		
//kelime sozlukte yoksa harflerle anlatarak basla
if( !durum){
durum=true;//harf cevirisi yapilirken ustuste islem yapilmasini engelliyoruz
my_FLVplayback.visible=false;//video oynatıcı gizleniyor.
islemID=setInterval(karakterIslem,sure,kelimeler[indeks]);
}//durum				
}//deyim var mi?				
}//kayitVarmi
}else{
hataPaneli_mc.hata_txt.text="Çeviri devam ediyor lütfen sabırlı olun";
}//cevrimBasladimi
}else{//deger girilmemisse
hataPaneli_mc.hata_txt.text="Lütfen çevirmek istediğiniz metni noktalama işaretleri 
\ nkullanmadan ve kelimeler arasında birer boşluk bırakarak yazınız.";
}//giris_txt.text=""
}//cevir_btn.onRelease

cevir_btn.onRollOut=function():Void{
//hataPaneli_mc.hata_txt.text="";
}//cevir_onRollout

//ONAY KUTUSU OLAYI ////////////////////////////////////////////////////
//function cikisOnayi(mesajKutusu:Object){
//	if(mesajKutusu.detail==Alert.YES)fscommand("quit");
//}//cikisOnayi
//UYGULAMAYI KAPAT DUGMESI ////////////////////////////////////////////
cikis_btn.onRelease=function():Void{
//	Alert.show("Uygulamayı kapatmak istediğinize emin misiniz?",
"Oyunu Kapat",Alert.YES|Alert.CANCEL,this,cikisOnayi,"soruIsareti",Alert.CANCEL);
uygulamaCikis_mc.gotoAndStop(2);
}//cikis_btn
//ALFABEYI GOSTER DUGMESI ////////////////////////////////////////////
alfabe_btn.onRelease=function():Void{
//	Alert.show("Uygulamayı kapatmak istediğinize emin misiniz?",
"Oyunu Kapat",Alert.YES|Alert.CANCEL,this,cikisOnayi,"soruIsareti",Alert.CANCEL);
alfabe_mc.gotoAndStop(2);
}//cikis_btn
//KARAKTER OYNATIM ZAMANI AYAR DUGMESI /////////////////////////////////
zamanAyari_btn.onRelease=function():Void{
zamanAyari_mc.gotoAndStop(2);	
zamanAyari_mc.slider_mc.ikon_mc._x=Math.floor(sure*1/5);
zamanAyari_mc.slider_mc.deger_txt.text= 
Math.floor(zamanAyari_mc.slider_mc.ikon_mc._x/3);
zamanAyari_mc.slider_mc.deger_txt._x=zamanAyari_mc.slider_mc.ikon_mc._x-17;
zamanAyari_mc.slider_mc. 
cubuk_mc.gotoAndStop(Math.floor(zamanAyari_mc.slider_mc.ikon_mc._x/20)+1);
}//zamanAyari_btn.onRelease
// DUGME OLAYLARI BITTI ////////////////////////////////////////////////////
//FARE OLAYLARI ////////////////////////////////////////////////////////////
fare.onMouseDown=function():Void{
if(nerede==1){
//harfle anlatım suresi ayarlama penceresi ekranda gezdiriliyor.
startDrag(zamanAyari_mc,false,2,2,506,458);
}else if(nerede==3){
//kapatma onay kutusu ekranda gezdiriliyor
startDrag(uygulamaCikis_mc,false,2,2,434,458);
}else if(nerede==4){
//kapatma onay kutusu ekranda gezdiriliyor
startDrag(alfabe_mc,false,2,2,434,70);	
}
}
fare.onMouseUp=function():Void{
stopDrag();
}
Mouse.addListener(fare);
//FARE OLAYLARI BITTI ////////////////////////////////////
function kelimeleriOynat(kelime:String){
/////////////////////////////////////////////////////////
//KELİMELERI ANLATAN VIDEOLARI OYNAT
// Coded by			: Bilal SERT
//Calls					:
//Called by			:
//I/O						:
/////////////////////////////////////////////////////////
var tur:Boolean=false;//true : deyim, false: kelime
//if(indeks==0)aktifText=kelimeler[indeks];
 else aktifText+=" " +kelimeler[indeks];
for (var i:Number=0;i < kelime.length-1;i--){
if(kelime.charAt(i)==" "){tur=true;break;}
}//i
if(tur==true){//gonderilen deyim ise
if(indeks==1)aktifText=kelime; else aktifText+=" " + kelime;
}else{//gonderilen kelime ise
if(indeks==0)aktifText=kelime; else aktifText+=" " + kelime;
}//tur
karaoke_txt.text=aktifText;
with(my_FLVplayback){
_width=320;
_height=240;
_x=240;
_y=75;
contentPath="DATA/VIDEO/" +  videoDosyasi;
try{
play();//"DATA/VIDEO/" +  videoDosyasi; //autoPlay=false ise
}catch(hata:VideoError){
hataPaneli_mc.hata_txt.text=hata.toString();
}
}//with
}//kelimeleriOynat
//FLVPLayback Nesnesine ait olaylar ////////////////////////
oynatimBitti.complete=function():Void{
if(indeks < kelimeler.length+1){
indeks++;
if(kayitVarmi(kelimeler[indeks])==true){
//kelime bulundu ayni kelime ile baslayan bir deyim var mi?
deyim=kelimeler[indeks];
//if(indeks < kelimeler.length-1)indeks++;
//deyim=deyim + " " + kelimeler[indeks];
indeks++;
if(indeks < kelimeler.length) deyim=deyim + " " + 
kelimeler[indeks];else deyim=deyim + " "  + deyim;				
//deyim var mi sorgulaniyor
if(kayitVarmi(deyim)==false){
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(deyim);					
}else{
//deyim bulunamadi sozcuk oynatilacak
indeks--;		
//kelime sozlukte varsa videosunu oynatarak basla
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(kelimeler[indeks-1]);
}//deyim var mi?
}else	{
//kelime sozlukte yoksa o kelime ile baslayan bir deyim var mi inceleniyor.
deyim=kelimeler[indeks];
indeks++;
if(indeks < kelimeler.length)	deyim=deyim + " " + 
kelimeler[indeks];else deyim=deyim + " "  + deyim;
//deyim var mi sorgulaniyor
if(kayitVarmi(deyim)==true){
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(deyim);					
}else{
//deyim bulunamadi sozcuk oynatilacak
indeks--;		
//kelime sozlukte yoksa harflerle anlatarak devam et
if( !durum){
durum=true;//ceviri yapilirken ustuste islem yapilmasini engelliyoruz
my_FLVplayback.visible=true;//video oynatıcı gizleniyor.
aktifText+=" ";
islemID=setInterval(karakterIslem,sure,kelimeler[indeks]);
}//durum				
}//deyim var mi?				
}//kayitVarmi
}else{
karaoke_txt.text="";
karaoke_txt._visible=true;
cevrimBasladimi=false;//cevrim dugmesi yeniden aktiflestiriliyor
}
}
my_FLVplayback.addEventListener("complete",oynatimBitti);

//FLVPLayback Nesnesine ait olaylar  burada bitti /////////

function karakterIslem(kaynak:String){
///////////////////////////////////////////////////////////
//KARAKTERLERI AYIKLAMA 
// Coded by			: Bilal SERT
//Calls					:
//Called by			:
//I/O						:
///////////////////////////////////////////////////////////
var harf:String= new String(kaynak.charAt(karSay));
//trace(harf + " =" + harf.charCodeAt(1));
aktifText+=harf
//Türkçe karakterleri ve özel karakterleri ayikliyoruz
switch(harf.charCodeAt(1)){
case 33:
case 34:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 58:
case 59:
case 63:
case 91:
case 93:
case 95:
case 123:
case 125:
harf="space";
break;
case 214:
case 246:
//Ö,ö ise
harf="o2";
break;
case 220:
case 252:
//Ü,ü ise
harf="u2";
break;
case 73:
case 305:
//I, ı ise
harf="i2";
break;
case 350:
case 351:
//Ş,ş ise
harf="s2";
break;		
case 199:
case 231:
//Ç,ç ise
harf="c2";
break;	
case 286:
case 287:
//Ğ,ğ ise
harf="g2";
break;			
case 304:
//İ ise
harf="i";
break;
default:
harf=harf.toLowerCase();
}//switch  harf.charCodeAt(0)

karaoke_txt.text=aktifText;
karSay++;
if(karSay > (kaynak.length)){
clearInterval(islemID);
karSay=0;
karakter_mc.gotoAndStop(1);
durum=false;// ki yeniden ceviri yapilabilsin
if(indeks < kelimeler.length-1){
indeks++;
if(kayitVarmi(kelimeler[indeks])==true){
//kelime bulundu ayni kelime ile baslayan bir deyim var mi?
deyim=kelimeler[indeks];
//if(indeks < kelimeler.length+1)indeks--;
//deyim=deyim + " " + kelimeler[indeks];
indeks++;
if(indeks < kelimeler.length-1)	
deyim=deyim + " " + kelimeler[indeks];else deyim=deyim + " "  + deyim;				
//deyim var mi sorgulaniyor
if(kayitVarmi(deyim)==false){
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(deyim);					
}else{
//deyim bulunamadi sozcuk oynatilacak
indeks--;		
//kelime sozlukte varsa videosunu oynatarak basla
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(kelimeler[indeks]);
}//deyim var mi?
}else	{
//kelime sozlukte yoksa o kelime ile baslayan bir deyim var mi inceleniyor.
deyim=kelimeler[indeks];
//if(indeks < kelimeler.length+1)indeks--;
//deyim=deyim + " " + kelimeler[indeks];
indeks++;
if(indeks < kelimeler.length-1)
deyim=deyim + " " + kelimeler[indeks];else deyim=deyim + " "  + deyim;				
//deyim var mi sorgulaniyor
if(kayitVarmi(deyim)==true){
my_FLVplayback.visible=true;//video oynatıcı goruntuleniyor.
kelimeleriOynat(deyim);					
}else{
//deyim bulunamadi sozcuk oynatilacak
indeks--;		
//kelime sozlukte yoksa harflerle anlatarak devam et
if(!durum){
durum=true;//ceviri yapilirken ustuste islem yapilmasini engelliyoruz
aktifText+=" ";
my_FLVplayback.visible=false;//video oynatıcı gizleniyor.
islemID=setInterval(karakterIslem,sure,kelimeler[indeks]);
}//durum								
}//deyim var mi?				
}//kayitVarmi
}else{
karaoke_txt.text="";
karaoke_txt._visible=false;
cevrimBasladimi=false;//cevrim dugmesi yeniden aktiflestiriliyor
}//indeks
}else{//karakter resimleri yukleniyor
karakter_mc.gotoAndStop(harf);
}//if karSay
}//karakterIslem

// BASLANGIC AYARLARI YUKLENIYOR
function baslangicAyarlariniYukle():Void{
cumle=giris_txt.text;
kelimeler=cumle.split(",");
aktifText="";
karSay=0;
indeks=0;
my_FLVplayback.visible=true;
karaoke_txt.text="";
karaoke_txt._visible=false;
giris_txt._visible=true;
hataPaneli_mc.hata_txt.text="";
}