İçindekiler:

Özel Mutfak Ses Tanımlayıcısı: 4 Adım
Özel Mutfak Ses Tanımlayıcısı: 4 Adım

Video: Özel Mutfak Ses Tanımlayıcısı: 4 Adım

Video: Özel Mutfak Ses Tanımlayıcısı: 4 Adım
Video: FİLMLERDE BÖYLE ÖPÜŞÜYORLARMIŞ! (Film Ses Efektleri Nasıl Yapılıyor?) 2024, Kasım
Anonim
Image
Image
Özel Mutfak Ses Tanımlayıcısı
Özel Mutfak Ses Tanımlayıcısı

Bu bahar etkileşimli sistemler kursundaki son projemiz için Destek-Vektör Makinesi sınıflandırmasını kullanarak mutfakta yaygın olan sesleri tanımlamak ve görselleştirmek için gerçek zamanlı bir sistem oluşturduk. Sistem, ses örnekleme/sınıflandırma için bir dizüstü bilgisayar ve görselleştirme için bir Arduino/dot matrix ekrandan oluşur. Aşağıda, kendi mutfağınızdan gelen sesler için bu sistemin kendi versiyonunuzu oluşturmanız için bir kılavuz bulunmaktadır.

Orijinal kullanım durumumuz, sağır ve işitme güçlüğü çeken bir bireyin mutfağı için bir cihazdı, ancak bu sistem teorik olarak çeşitli bağlamlarda bir dizi sesi tanımlamak için uyarlanabilir. Nispeten sessiz olma eğiliminde olduğu ve makul miktarda basit, farklı sesler içerdiği için mutfak başlamak için ideal bir yerdi.

Bu proje için bir GitHub deposu burada bulunabilir.

Gereçler

  • Başlıklı Arduino Leonardo Mikrodenetleyici
  • Arduino için KEYESTUDIO 16x16 Nokta Vuruşlu LED Ekran
  • Breadboard atlama teli
  • Mikro USB - USB 2.0 kablosu
  • Jupyter Notebook'lu bir dizüstü bilgisayar (Anaconda kurulumu)

    Jupyter Notebook'a yeni başlayanlar için bir rehber burada bulunabilir

  • Sistemin muhafazası için önemli miktarda uyumsuz LEGO tuğlası

    (Ama gerçekten bunları istediğiniz herhangi bir DIY yapı malzemesiyle değiştirebilirsiniz!)

Adım 1: Mutfak Ses Örneklerini Toplama

Mutfak Ses Örneklerini Toplama
Mutfak Ses Örneklerini Toplama

Yukarıdaki Şekil: Bu toplama işlemi kullanılarak bir çatal ve bıçağın birbirine kükremesi kaydından alınan ses verileri

Gerçek zamanlı sesleri tanımlamak için makine öğrenme modelimize karşılaştırma için kaliteli örnekler sağlamamız gerekiyor. Bu işlem için buradan veya projemizin GitHub deposundan erişilebilen bir Jupyter not defteri oluşturduk. Depo ayrıca test amaçlı iki farklı mutfaktan örnek koleksiyonlar içermektedir.

Adım 1.1: CollectSamples.ipynb not defterini çalışan Jupyter Notebook dizininize kopyalayın ve açın.

Adım 1.2: Başlıklarda verdiğimiz notlara dikkat ederek her hücreyi tek tek çalıştırın. "Örnek Kayıt" başlıklı birine ulaştığınızda durun.

NOT: Bu not defterinde birkaç Python kitaplığı kullanılmaktadır ve her birinin projeye başarıyla aktarılabilmesi için yüklenmesi gerekir. Bunu manuel olarak yapabilirsiniz, ancak Jupyter Notebook içinde kitaplık kurulumu için bir kılavuz burada bulunabilir.

Adım 1.3: Bu proje için çalışma dizininizde örneklerinizi saklamak için boş bir dizin oluşturun.

Adım 1.4: "Örnek Kayıt" hücresindeki SAMPLES_LOCATION değişkenini boş dizininizin konumuyla eşleşecek şekilde düzenleyin.

Adım 1.5: SOUND_LABELS değişkenine istediğiniz kadar ses ekleyin veya çıkarın.

Örnek kayıt kodunun çalışması için bu değişkenin her satırı bir virgülle ve aşağıdaki biçimde ayrılmalıdır:

'ts':Ses("HedefliSound", "ts")

Adım 1.6: Tüm etiketler eklendikten sonra "Numune Kaydı" hücresini değerlendirerek numune toplama işlemini başlatın. Hücrenin çıktısında, etiketlerdeki her sesle ilişkilendirdiğiniz kısa kodu girmeniz istenir (yani, TargetedSound için "ts"). Bunu henüz yapma.

Adım 1.7: Dizüstü bilgisayarınızı mutfağa götürün ve bitmiş sistemi yerleştirme olasılığınız en yüksek olan alana yerleştirin. Bu konum, iyi ses toplama için merkezi olmalı ve elektroniklerinizi korumak için kuru ve olası dökülmelerden uzak olmalıdır.

Adım 1.8: İlk hedeflenen sesi hazırlayın. Bu bir fırın zamanlayıcısı bip sesiyse, bir sonraki adıma geçmeden önce zamanlayıcıyı bir dakikaya ayarlayabilir ve 20 saniyeye kadar geri saymasını bekleyebilirsiniz.

Adım 1.9: İsteme etiket kodunu yazın (yani, "ts") ve Enter/Return'e basın.

Sistem, odanın ortam gürültüsünden farklı bir ses olayını dinlemeye başlayacaktır. Bu ses olayını algıladıktan sonra, odadaki sesin ortam seviyelerine döndüğünü algılayana kadar kayda başlayacaktır. Ardından sesi 16 bitlik bir WAV dosyası olarak SAMPLES_LOCATION içinde tanımlanan dizine şu biçimde kaydeder:

TargetedSound_#_captured.wav

Bu dosya adının # kısmı, topladığınız hedeflenen sesin örneklerinin sayısına karşılık gelir. WAV dosyası kaydedildikten sonra, hücrenin tek bir uygulamasında aynı sesin birkaç örneğini toplamanıza izin veren istem tekrarlanacaktır.

Bu dosya adını DEĞİŞTİRMEYİN. Bir sonraki adım için önemlidir.

Adım 1.10: Her sesten 5-10 örnek toplayana kadar 1.8 ve 1.9 adımlarını tekrarlayın.

Adım 1.11: Tamamlandığında, yürütmeden çıkmak için "x" girin.

UYARI: Hücreden bu şekilde çıkılmaması Notebook'un çökmesine neden olabilir. Bu durumda, Defter çekirdeği sıfırlanmalı ve her hücre üstten yeniden çalıştırılmalıdır.

Adım 1.11 (İsteğe bağlı): İstediğiniz tüm bilgileri yakaladığınızdan emin olmak için "Hızlı Ses Görselleştirme" hücresindeki tek tek dosyaların WAV verilerini kontrol edin.

Bazı ipuçları:

  • Mutfağınız sessiz olduğunda kaydedin.
  • Aynı anda yalnızca bir ses kaydedin. Sistem, seslerdeki örtüşmeyi ayırt edemez.
  • Her bir ses denemesini mümkün olduğunca tutarlı hale getirmeye çalışın. Bu, tanımlamanın doğruluğuna yardımcı olacaktır.
  • Kayıt hücresinin yeniden değerlendirilmesi, dosya adındaki # değerini sıfırlayacak ve bu # ile eşleşen mevcut dosyaların üzerine yazacaktır. Bir sesin tüm örneklerini aynı anda kaydetmenin en kolay yolunu bulduk ve ardından Kayıt hücresini durdurduk.
  • Sistem hedeflenen sesi almıyorsa, EŞİK değerini düşürmeyi deneyin (başlatmak için 30'a ayarlayın) ve hücreyi yeniden değerlendirin.
  • Kayıt, hedeflenenin dışındaki diğer sesler tarafından tetiklenirse, EŞİK değerini yükseltmeyi deneyin (başlatmak için 30'a ayarlayın) ve hücreyi yeniden değerlendirin.

Adım 2: Arduino/Matrix Ekranını Hazırlama

Arduino/Matris Ekranını Hazırlama
Arduino/Matris Ekranını Hazırlama
Arduino/Matris Ekranını Hazırlama
Arduino/Matris Ekranını Hazırlama
Arduino/Matris Ekranını Hazırlama
Arduino/Matris Ekranını Hazırlama

Ardından, Arduino Leonardo ve KEYESTUDIO 16x16 LED nokta vuruşlu ekran kullanarak görselleştirme sistemini kuracağız. Bu, sınıflandırma modelinin algılanan seslerin tahminini çıkarmak içindir. Daha önce olduğu gibi, gerekli tüm dosyaları hem burada hem de projenin GitHub deposunda sağladık.

Adım 2.1: Arduino ve LED matrisini yukarıdaki şemaya göre bağlayın. KEYESTUDIO, nokta matrislerine bağlanmak için teller içerir, ancak bu telleri Arduino'ya bağlamak için devre tahtası atlama telleri gerekecektir.

Adım 2.2: Ardunio IDE kullanarak "arduino_listener.ino" dosyasını açın ve Leonardo'ya yükleyin. Doğru şekilde kablolanmışsa, yukarıdaki resimde gösterildiği gibi "dinleme" simgesini (Wi-Fi'ye benziyor) görmelisiniz.

Adım 2.3: Hedef seslerinizin her biri için göstermek istediğiniz simgeleri hazırlayın. Hangi LED'lerin yanacağını bilmek için, simgenin Arduino'dan matrise bir bayt dizisi olarak gönderilmesi gerekir. Örneğin, kahve fincanı simgemiz (yukarıdaki resimde) matrise şu biçimde gönderilir:

{

0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xbb, 0x5b, 0xeb, 0xfb, 0xfb, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf, 0xf, 0xf7, 0xfb, 0xf7, 0x0f, 0xdf, 0x1f, 0xff, 0xff };

Simgelerimizi Dot2Pic çevrimiçi aracını kullanarak, 16 sütun, 16 satır ve açılır menüden seçilen "monokromatik, bayt başına 8 piksel, dikey ayar" ile çizdik. Bizimkiler "sample_icon_bytes.txt" dizisinde bulunabilir.

NOT: Yüklenen dosyalarla bunu otomatik olarak yapabilen çevrimiçi araçlar da olabilir.

Adım 2.4: Her simgeyi çizin. Çizimi tamamladığınızda, "Dizeye Dönüştür" seçeneğini seçin.

Adım 2.5: "arduino_listening.ino" kodunun başında tanımlanan gereksiz simgeleri istediğiniz gibi değiştirin. Hangisinin hangisi olduğunu hatırlamak için simgeyi açıklayan bir yorum eklediğinizden emin olun!

Adım 2.6: Yeni kodu Arduino'ya yükleyin. Dosyayı henüz kapatmayın, bir sonraki adım için ona ihtiyacımız olacak.

Adım 3: Sınıflandırıcıyı Çalıştırma ve Sesleri Tanımlama

Sınıflandırıcıyı Çalıştırma ve Sesleri Tanımlama
Sınıflandırıcıyı Çalıştırma ve Sesleri Tanımlama
Sınıflandırıcıyı Çalıştırma ve Sesleri Tanımlama
Sınıflandırıcıyı Çalıştırma ve Sesleri Tanımlama

Şimdi sistemi bir araya getirme zamanı. Sınıflandırma ardışık düzeni, Arduino iletişimi ve canlı ses yakalama, burada sağlanan veya projemizin GitHub deposundan erişilebilen tek bir Arduino not defteri aracılığıyla yapılır.

Adım 3.1: FullPipeline.ipynb not defterini çalışan Jupyter Notebook dizininize kopyalayın ve açın.

Adım 3.2: Başlıklarda verdiğimiz notlara dikkat ederek her hücreyi tek tek çalıştırın. Herhangi bir çıktı beklenmiyor. "Eğitim Verilerini Yükle" başlıklı hücreye ulaştığınızda durun.

Adım 3.3: "Eğitim Verilerini Yükle" hücresindeki SAMPLES_LOCATION_ROOT değişkenini önceki örnek dizininizin konumunun üst dizinine düzenleyin. Ardından, SAMPLES_DIR_NAME değişkenini dizininizin adıyla değiştirin. Öyleyse, CollectSamples.ipynb'deki konumu şu şekilde ayarladıysanız:

SAMPLES_LOCATION = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/NewDir"

Şimdi bu değişkenleri şu şekilde ayarlarsınız:

SAMPLES_LOCATION_ROOT = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/"SAMPLES_DIR_NAME = "NewDir"

Bunu, yanlışlık durumlarında sınıflandırıcıda hızlı değişikliklere izin vererek yaptık. Verilerinizi ayarlamak için farklı örnek koleksiyonlar arasında geçiş yapabilirsiniz.

Adım 3.4: Hücreyi değerlendirin. Her koleksiyonun başarıyla yüklendiğini görmelisiniz.

Adım 3.5: Başlıklarda verdiğimiz notlara dikkat ederek her hücreyi tek tek çalıştırmaya devam edin.

Adım 3.6: "Messaging Arduino" hücresine ulaştığınızda durun. Arduino ile iletişim için bilgisayarınızın kullanacağı seri portu PORT_DEF değişkeninde tanımlayın. Bu, Arduino IDE'de ve Araçlar> Bağlantı Noktası'na giderek bulunabilir.

Daha fazla bilgi burada bulunabilir.

Adım 3.8: Arduino IDE'nizi yeniden açın. Simgelerde değişiklik yaptığınız yerlerde, dizi değerinin yanındaki harfi not edin, ancak DEĞİŞTİRMEYİN. Aşağıdaki örnekte, bu "g"dir.

// çöp atmaconst imzasız char g[1][32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf7, 0xf7, 0xfb, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x27, 0xc3, 0x03, 0xc3, 0x27, 0x2f, 0xff, 0xef, 0xdf, 0xbf, 0xff, 0xff, };

Adım 3.7: (Defter'ın "Messaging Arduino" hücresine dönüş) Self.sounds sözlüğündeki etiketleri, örneklerinizi kaydederken kullandığınız etiketlerle eşleşecek şekilde değiştirin, her etiketin bir öncekinde not ettiğiniz tek harfe karşılık geldiğinden emin olun. adım. "Kayıt" ve "Dinleme", temel sistem işlevselliğinin bir parçasıdır ve değiştirilmemelidir. Arduino kodunda birkaç ekstra değişiklik yapmaktan emin olmadığınız sürece ikinci harfi DEĞİŞTİRMEYİN, aksi takdirde Arduino/matris ile iletişimi bozacaktır.

Adım 3.8: Ana işlevi çalıştırın! Kod, eğitim verilerini alacak, temel özelliklerini çıkaracak, bunları ardışık düzene besleyecek, bir sınıflandırma modeli oluşturacak ve ardından ses olaylarını dinlemeye başlayacaktır. Birini algıladığında, matrisin bir kayıt sembolüne (içinde daire olan kare) dönüştüğünü göreceksiniz ve bu verileri bölümlere ayıracak ve modele besleyecektir. Modelin öngördüğü her şey birkaç saniye sonra matris ekranında görünecektir.

Aşağıdaki hücrenin çıktısını takip edebilirsiniz. Ne kadar doğru elde edebileceğinizi görün!

Adım 4: Bir LEGO Muhafazası Oluşturma

LEGO Muhafazası Oluşturma
LEGO Muhafazası Oluşturma
LEGO Muhafazası Oluşturma
LEGO Muhafazası Oluşturma
LEGO Muhafazası Oluşturma
LEGO Muhafazası Oluşturma

Bu eğlenceli kısım! Tüm ciddi makine öğrenimi adımlarını tamamladınız ve tüm uçtan uca sistemi çalıştırdınız ve şimdi ödül olarak LEGO'larla oynamaya başlıyorsunuz. Burada detaylandırılacak çok fazla bir süreç yok. Genel tasarım hakkında çok fazla endişelenmeden burada ve orada sevdiğimiz blokları ekledik ve sonuçtan memnun kaldık.

Resimlerimizin, mutfağınıza özgü kendi yaratıcı konutunuz için bir ilham kaynağı olmasına izin verin. Arduino'yu ve kabloların çoğunu oyuk bir kasaya yerleştirdik, ardından yukarıdaki matris ekranını çıkıntılarla sabitledik. Simgeleri daha net hale getirdiğini düşündüğümüz ışığı biraz dağıtmak için ekranın üzerine biraz kağıt ekledik.

Önerilen: