Garfield
YZF Admin
İşlevsel bir ses tanıma sistemi kurmak için önce ses akışını alır, bu sesi tanıma motoruna gönderir, dönen metni temizler ve uygulamanın kullanacağı sonuca dönüştürürsünüz. En küçük çalışan prototip tarayıcıdaki Web Speech API ile kurulabilir; üretim ortamında ise gürültü, mikrofon izinleri, gecikme, hata yönetimi ve kişisel verilerin korunması ayrıca tasarlanmalıdır. Aşağıdaki örnek, mikrofondan konuşmayı alıp ekranda metne dönüştürür.
Bu nedenle ilk aşamada tarayıcı prototipiyle veri akışını doğrulayıp daha sonra doğruluk, gecikme ve gizlilik gereksinimlerine göre motoru değiştirmek pratik bir yaklaşımdır. Prototipin çalışması, seçilen motorun her ortamda aynı doğrulukta çalışacağını kanıtlamaz.
Basit bir JavaScript denetimi şöyle olabilir:
Bu örnekte beklenen sonuç,
Tanıma motoru bir cümleyi başarıyla döndürdüğünde bu, cümlenin anlamının doğru olduğu, konuşmacının doğrulandığı veya verilen komutun güvenli olduğu anlamına gelmez. Kritik işlemlerde yapılandırılmış doğrulama, yetkilendirme ve kullanıcı onayı ekleyin. Ses üçüncü taraf bir hizmete gönderiliyorsa hangi verinin ne kadar süreyle işlendiğini, aktarımın hangi koşullarda yapıldığını ve kayıt tutulup tutulmadığını kullandığınız hizmetin güncel belgelerine göre belirleyin.
Üretim aşamasına geçerken tanıma motorunu değiştirebilecek şekilde ayrı bir katman tasarlayın: arayüz yalnızca “metin geldi”, “hata oluştu” ve “tanıma bitti” gibi uygulama olaylarını kullansın. Böylece tarayıcı tabanlı prototipten sunucu veya cihaz içi modele geçerken komut işleme kodunu baştan yazmanız gerekmez.
Ses tanıma sisteminin temel akışı
Bir ses tanıma sistemi genellikle şu parçaları içerir:- Ses kaynağı: Mikrofon, yüklenmiş ses dosyası veya canlı ses akışı.
- Ön işleme: Gürültü azaltma, ses düzeyini düzenleme ve gerekirse konuşma bölümlerini ayırma.
- Tanıma motoru: Ses sinyalini yazıya çeviren yerel ya da çevrim içi model.
- Metin işleme: Noktalama, komut ayıklama, dil bilgisi düzeltme veya anahtar sözcük analizi.
- Uygulama çıktısı: Metin kutusuna yazma, komut çalıştırma, altyazı üretme veya veritabanına kaydetme.
Kullanılacak yöntemi seçme
Küçük bir arayüz prototipi için tarayıcı tabanlı yöntem yeterli olabilir. Daha fazla denetim, çevrim dışı çalışma veya özel alan sözcükleri gerekiyorsa bir sunucuya ya da cihaza kurulan tanıma modeli tercih edilir. Sesin üçüncü taraf bir hizmete gönderilmesi, gecikme ve veri işleme koşulları özellikle değerlendirilmelidir.| Yöntem | Uygun olduğu durum | Dikkat edilmesi gereken |
|---|---|---|
| Tarayıcı API'si | Hızlı arayüz prototipi ve kısa komutlar | Tarayıcı, işletim sistemi ve ağ davranışı değişebilir |
| Sunucu tabanlı model | Merkezi işleme, kayıt ve ölçekleme | Ses aktarımı, maliyet, gecikme ve veri güvenliği |
| Cihazda çalışan model | Çevrim dışı kullanım ve daha fazla veri denetimi | Model boyutu, işlemci kullanımı ve doğruluk |
Tarayıcıda çalışan en küçük prototip
Ön koşul olarak mikrofonu olan bir bilgisayar veya mobil cihaz ve güvenli bir çalışma ortamı gerekir. Mikrofon erişimi, tarayıcı tarafından engellenirse kod doğru olsa bile ses alınamaz. Aşağıdaki örnek varsayımsaldır; tarayıcının ilgili API'yi desteklemesi gerekir.- Bir HTML dosyası oluşturun. Dosyayı
ses-tanima.htmladıyla kaydedin. Kod, bir başlatma düğmesi, durum alanı ve sonuç metni içerir. - Tanıma nesnesini başlatın. Kod, tarayıcıda bulunan
SpeechRecognitionveya satıcı ön ekli eşdeğerini arar. Hiçbiri yoksa kullanıcıya bu ortamda özelliğin kullanılamadığı bildirilir. - Dil ayarını belirleyin. Türkçe konuşma için
tr-TRkullanılır. Uygulamanız farklı dilleri destekleyecekse bu değeri kullanıcı seçimine bağlayın. - Sonuç olayını işleyin. Tanıma motorundan gelen metin, sonuç alanına yazılır. Geçici sonuçları göstermek istiyorsanız kesinleşmiş ve geçici metni ayrı tutun.
- Hata ve bitiş olaylarını yönetin. Mikrofon izni reddedildiğinde, ses alınamadığında veya tanıma sona erdiğinde durum alanını güncelleyin.
- Dosyayı güvenli bir ortamda çalıştırın. Tarayıcı mikrofon erişimini engellerse dosyayı uygun bir yerel geliştirme sunucusundan açın; doğrudan dosya açma yöntemi her ortamda aynı davranmayabilir.
HTML:
<!doctype html>
<html lang="tr">
<head>
<meta charset="utf-8">
<title>Ses Tanıma Denemesi</title>
</head>
<body>
<button id="baslat">Konuşmayı başlat</button>
<p id="durum">Hazır</p>
<textarea id="metin" rows="8" cols="60"></textarea>
<script>
const Recognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const baslat = document.querySelector("#baslat");
const durum = document.querySelector("#durum");
const metin = document.querySelector("#metin");
if (!Recognition) {
baslat.disabled = true;
durum.textContent = "Bu tarayıcıda ses tanıma API'si bulunamadı.";
} else {
const tanima = new Recognition();
tanima.lang = "tr-TR";
tanima.continuous = false;
tanima.interimResults = false;
baslat.addEventListener("click", () => {
baslat.disabled = true;
try {
tanima.start();
durum.textContent = "Dinleniyor...";
} catch (hata) {
baslat.disabled = false;
durum.textContent = "Tanıma başlatılamadı: " + hata.message;
}
});
tanima.addEventListener("result", (olay) => {
const sonuc = olay.results[0][0].transcript;
metin.value = sonuc;
durum.textContent = "Metin alındı.";
});
tanima.addEventListener("error", (olay) => {
durum.textContent = "Tanıma hatası: " + olay.error;
});
tanima.addEventListener("end", () => {
baslat.disabled = false;
if (durum.textContent === "Dinleniyor...") {
durum.textContent = "Tanıma sona erdi; yeni kayıt için düğmeye basın.";
}
});
}
</script>
</body>
</html>
Örneğin girdisi ve beklenen çıktısı
Kullanıcı mikrofona varsayımsal olarak “Toplantıyı yarın saat onda başlat” dediğinde, başarılı bir tanıma sonucunda metin alanında buna yakın bir cümle görünür. Bu çıktı yalnızca sesin yazıya çevrildiğini gösterir; sistemin tarihi doğru yorumladığını veya toplantı oluşturduğunu göstermez. Komut çalıştırılacaksa metin ayrıca ayrıştırılmalı, tarih ve saat doğrulanmalı, kullanıcıdan gerekirse onay alınmalıdır.Tanıma sonucunu uygulama komutuna dönüştürme
Ses tanıma çıktısını doğrudan kritik bir işlemi çalıştırmak için kullanmayın. Önce beklenen kalıpları sınırlayın ve belirsiz sonuçları reddedin. Örneğin yalnızca “not ekle” komutu desteklenecekse, tanınan metnin bu komutla başlayıp başlamadığını kontrol edebilir, kalan bölümü not içeriği olarak ayırabilirsiniz.Basit bir JavaScript denetimi şöyle olabilir:
JavaScript:
function komutuAyristir(metin) {
const temiz = metin.trim().toLocaleLowerCase("tr-TR");
const baslangic = "not ekle ";
if (!temiz.startsWith(baslangic)) {
return { tur: "belirsiz", icerik: null };
}
const icerik = metin.trim().slice(baslangic.length).trim();
if (!icerik) {
return { tur: "eksik", icerik: null };
}
return { tur: "not-ekle", icerik };
}
console.log(komutuAyristir("Not ekle Sunucu yedeklerini kontrol et"));
Bu örnekte beklenen sonuç,
tur alanının not-ekle ve icerik alanının “Sunucu yedeklerini kontrol et” olmasıdır. “Not ekle” ile başlamayan bir ifade işlem başlatmaz. Bu sınırlama, yanlış tanınan bir cümlenin doğrudan eyleme dönüşmesini önlemeye yardımcı olur; tek başına güvenlik doğrulaması değildir.Doğruluk ve hata durumlarını değerlendirme
Sonuç metni boşsa önce mikrofon iznini, seçili giriş aygıtını ve tarayıcının tanıma desteğini kontrol edin. Metin sürekli yanlışsa konuşma dili, mikrofon uzaklığı, arka plan gürültüsü ve kullanılan modelin alan sözcüklerine uygunluğu incelenmelidir. Noktalama veya özel ad hataları, sesin hiç alınamadığı anlamına gelmez; bunlar metin işleme aşamasında ayrıca düzeltilebilir.Tanıma motoru bir cümleyi başarıyla döndürdüğünde bu, cümlenin anlamının doğru olduğu, konuşmacının doğrulandığı veya verilen komutun güvenli olduğu anlamına gelmez. Kritik işlemlerde yapılandırılmış doğrulama, yetkilendirme ve kullanıcı onayı ekleyin. Ses üçüncü taraf bir hizmete gönderiliyorsa hangi verinin ne kadar süreyle işlendiğini, aktarımın hangi koşullarda yapıldığını ve kayıt tutulup tutulmadığını kullandığınız hizmetin güncel belgelerine göre belirleyin.
Üretim aşamasına geçerken tanıma motorunu değiştirebilecek şekilde ayrı bir katman tasarlayın: arayüz yalnızca “metin geldi”, “hata oluştu” ve “tanıma bitti” gibi uygulama olaylarını kullansın. Böylece tarayıcı tabanlı prototipten sunucu veya cihaz içi modele geçerken komut işleme kodunu baştan yazmanız gerekmez.
Son düzenleme: