Sorun Açıklaması
Ses tanımayı, tamamen kendi içinde olmasını istediğim bir donanım projesinin parçası olarak kullanmak istiyorum (Arduino ve Raspberry Pi'nin, Kinects vb.Gibi düşük hızlı, düşük hızlı cihazlar kullanıyorum, geleneksel bilgisayar kullanmıyorum Bir işletim sistemi söz konusudur, bu yüzden kapalı / müstakil bir proje).
Ses tanıma, istediğiniz karmaşıklık düzeyine bağlı olarak çok karmaşık olabilir. Ben inanıyorum ne nispeten basit bir dizi gereksinimleri var. Sadece kendi sesimi tanımak istiyorum ve tanımak istediğim 20 kadar kelimeden oluşan küçük bir sözlüğüm var. Bu nedenle, karmaşık konuşma-metin ve ses tanıma kütüphanelerine veya İnternet arama motorları aracılığıyla bulduğum mükemmel 3. taraf yazılımlardan herhangi birine ihtiyaç duymuyorum (bunların sıkıntısı yok!). Gereksinimlerimin kendi çözümümü kodlayabileceğim "yeterince basit" olduğuna inanıyorum. Herkesin kendi süreçlerini böyle yazıp yazmadığını merak ediyorum ve yöntemim büyük ölçüde kusurlu mu? Yüksek bir matematik seviyesi gerektirmeden veya karmaşık bir algoritma yazmak zorunda kalmadan bunu yapmanın daha iyi bir yolu var mı? Aşağıda düşünmeye çalıştığım çözüm bu.
Çözüm Tanımı
Bunu C dilinde yazacağım, ancak sürecin kendiliğine odaklanan bir dil agnostik sürecini tartışmak istiyorum. Yani, eğer yapabilirsek, görmezden gelelim.
1. Konuşulanlarla eşleştirmek için kelimeler sözlüğümü önceden kaydedeceğim. 20 farklı kelimemin 20 kaydını ya da belki iki ya da üç kelimeden oluşan kısa cümleleri ya da cümleleri yazabileceğimizi hayal edebiliriz. Bunun, iki kayıt dosyasını gerçekten sesi metne dönüştürmekten ve iki dizeyi karşılaştırmaktan daha kolay hale getirdiğine inanıyorum.
2. Kodumu çalıştıran donanım aygıtıma bir mikrofon bağlı. [1]. Kod, örneğin sabit uzunluktaki numuneleri, örneğin 10msn uzunluğunda sürekli olarak alıyor ve örneğin birbirini izleyen 10 örneği dairesel bir kayıt tarzında saklıyor. [2]. (Bu rakamları kafamın üstünden icat ediyorum, bu yüzden sadece süreci tanımlamak için örnekler).
[1] Bu, muhtemelen kaydedilen ve toplanan ses örneklerini daha küçük tutmak için sözlük kayıtlarında olduğu gibi bir bant geçiren filtre ve op-amp ile bağlanacaktır.
[2] Tam olarak nasıl bir örnek alacağımdan emin değilim, 10msec'lik bir örneğin (belki bir CRC değeri) sesini temsil eden sayısal bir rakam (tamsayı / float / double) üretmiş olsam da bir yöntem bulmam gerekiyor veya ses örneğinin MD5 toplamı vb.) veya bir şekil akışı (belki de frekansların ses okumaları akışı). Sonuçta bir "örnek" sayısal bir rakam veya rakamlar olacaktır. Bu bölüm çok daha fazla donanım içerecek, bu yüzden burada tartışmak için değil.
3. Kod, ardışık 10 örnek depolanmış olarak bakar ve bir kelime veya kelime öbeğinin söylendiğini (sessizlikten kopuş) belirtmek için hacim artışı arar ve sonra artış, örneğin 500 örnek demek için art arda örnek toplamadır. Bu, 10 msn'lik örneklerde 5 saniyelik ses yakaladığı anlamına gelir.
Kaydedilen ses ve yakalanan ses arasında karşılaştırılan bu örnekler veya "dilimler" dir. Yakalanan örneklerin yeterince yüksek bir yüzdesi eşdeğer saklananlarla eşleşirse, kod aynı kelimeyi varsayar.
The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence
Incoming Sample No | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value | | | |20|27|38|46|16|59|77|200|78|
4. Kod tam bir örnek akışı topladıktan sonra, aşağıdaki ses kaydını üretmek için başlangıçtaki boşluk örneklerini keser. Ayrıca saklanan örnekle daha iyi hizalamak için örnek setini birkaç yer ileri ve geri hareket ettirebilir.
Bu, aşağıdaki gibi bir örnek set üretir:
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming Sample No |-1| 1| 2| 3| 4| 5| 6| 7| 8|
Incoming Sample Value |20|27|38|46|16|59|81|201|78|
5. Her örneğin ne kadar yakın olması gerektiğine dair bir yüzde değerine sahip olacağına göre, örnek 7,% 1'den az olan 1 değerine ve örnek eşleştirme yüzdesi içinde olması gereken toplam örnek sayısı için yüzde değerine göre değişir. , kodun kolayca ayarlanabilen bir doğruluk seviyesi vardır.
Daha önce hiç böyle bir şey sesle yapmadım, çok fazla iş olabilirdi. Bu yüzden bu soruyu soruyorum, belki de bu sorunun cevabını açık olarak biliyorsan (bu cevap ne olursa olsun). Kullanacağım donanımın bir kısmı düşük sn şeyler olacağından, bu işlemin büyük bir görev olmayacağını umuyorum. Megahertz yüzlerce (Belki de bir saat Rasp Pi kullanarak 1 Ghz). Bu, daha düşük hesaplama gücü kullanarak ses örneklerini eşleştirmek için oldukça kaba bir yoldur. Anında sonuçlar almayı değil, iyi bir konsept kanıtı için 30 saniyeden az bir süre hedefliyorum.
PS Bunu "ses", "ses tanıma", "ses", "ses tanıma" gibi yeni bir etiketle etiketleyecek temsilcim yok.