0 ile 9 arasındaki rakamları yüksek sesle konuş


15

Elektronikteki bu sorudan esinlenen SE , işte size bir meydan okuma:

Ondalık hane (0 9) bir dizi alır ve, yüksek sesle konuşan bir program veya alt rutin Yazın olmadan mevcut bir konuşma sentez alet.

Giriş:

Giriş basamaklarının herhangi bir makul formatta sunulmasını isteyebilirsiniz, örneğin ASCII basamak dizisi, tamsayı dizisi, BCD kodlu numara vb. Gibi. Çözümünüz yürütülebilir bir programsa, girişi aşağıdaki gibi alabilirsiniz bir komut satırı parametresi kullanabilir, standart girişten okuyabilir veya makul bir şekilde elde edebilirsiniz.

Programınız gerekir konuşabilmeli en az sekiz basamak çağrı başına. Sen olabilir ilk basamak sıfır olmadığını sadece haneli olmadığı sürece, varsayalım.

Çıktı:

Programınız numaraları doğrudan bir ses aygıtı kullanarak söyleyebilir veya çalınabilir bir ses dosyası verebilir. Çıktı dosyası, varsa, herhangi bir standart ses biçiminde olabilir veya ham örnek verilerinden oluşabilir. Ham örnek verileri çıkarırsanız, lütfen oynatma için uygun parametreleri not edin (örnekleme hızı, örnek başına bit sayısı, endianness, imzalı / imzasız, kanal sayısı). Oyun tarafından desteklenen formatlar tercih edilir.

Rakamların nasıl konuşulacağına dair ayrıntılara karar vermekte özgürsünüz, ancak çıktınız tipik bir İngilizce konuşmacının anlayacağı şekilde konuşulan İngilizce dil rakamlarından oluşmalı ve dinleyicinin doğru bir şekilde yazıya dökebilmesi için yeterince açık olmalıdır. sekiz haneli rastgele bir sayı. Hayır, sadece n kere bip sesi sayılmaz. Rakamlar arasına duraklama eklemeyi unutmayın.

puanlama:

Standart puanlama kuralları geçerlidir: Puanınız kodunuzun bayt cinsinden uzunluğudur veya kodunuz Unicode metninde yazılmışsa, Unicode karakterlerdir. En düşük puan kazanır. Herhangi bir dil geçer.

Elektronik hakkındaki orijinal soru olarak, gömülü programlama hakkındaydı, düşük seviyeli diller kullanan yazarlara bir kemik atmanın uygun olacağını hissettim: çözümünüz derlenmiş bir dilde yazılmışsa, uzunluğunu saymayı seçebilirsiniz. yürütülebilir dosyayı puanınız olarak bayt cinsinden derledi . (Evet, Java .classdosyası gibi önceden derlenmiş bayt kodu da sorun değil.) Bu seçeneği kullanmayı seçerseniz, lütfen kaynak kodunuzla birlikte yanıtınıza derlenmiş yürütülebilir dosyanın bir kopyasını (örn. Onaltılık döküm) ekleyin. ve derleyici sürümünü ve oluşturmak için kullandığınız seçenekleri.

Bir mansiyon , bir 50 rep lütuf ile birlikte aynı zamanda kriterlerini karşıladığını birinci cevaba verilecek asıl soruya , yani flaş 4 kb ve SRAM 1 kb ile gömülü MCU üzerinde çalışan kapasitesine sahiptir.

Kısıtlamalar:

Söz konusu dosyaların veya kaynakların uzunluğunu puanınızın bir parçası olarak saymadıkça, seçtiğiniz dilin standart çalışma zamanı ortamının parçası olmayan hiçbir dosyayı veya ağ kaynağını kullanamazsınız. (Bu, örneğin web'den ses örnekleri yüklemeye izin vermemek içindir.)

Seçtiğiniz dilin standart çalışma zamanı ortamına dahil edilmiş olsalar bile , önceden var olan konuşma sentezi araçlarını veya kitaplıklarını veya ses verilerinin derlemelerini (boyutunuzu puanınızın bir parçası olarak saymazsanız) kullanamazsınız .


Ps. Eğer gerçekten anlaşılabilir bir şey üretmeyi başarırsam, daha sonra kendi çözümümü gönderebilirim. Yine de kendinizinkini göndermekten çekinmeyin; bu noktada, herhangi bir cevap iyi bir cevaptır.
Ilmari Karonen

1
Sözlü rakamlardan oluşan bir veritabanı indirmemize (ve puanına göre boyutunu saymamıza) izin verilir mi yoksa kendi sesimizi kaydetmeliyiz? Konuşma örneklerini algoritmik olarak oluşturabildiğimden şüpheliyim.
John Dvorak

umm ... "çıktı" bölümü konuşma örnekleri çıkarmamız gerektiğini belirtmiyor. On kez bip sesi çıkarmamıza izin var mı?
John Dvorak

@PeterTaylor: Boyutlarını puanınızın bir parçası olarak sayarsanız, sorun değil. Ben sadece standart çalışma zamanı ortamında bir yerde gömülü basamak ses örnekleri olan bazı sistem olabilir diye endişelendim.
Ilmari Karonen

3
Soruyu sonuna kadar okumayan ve ağır kütüphanelerin etrafındaki önemsiz paketleyicileri düzenli olarak aktaran insanlar olduğu için, "Kendin yap" yönüne daha fazla vurgu yapmak düzenlemeye değer olabilir.
Peter Taylor

Yanıtlar:


10

yakut - 3710 = 90 karakter kodu + 3620 bayt veri

require'zlib'
$><<$*[0].chars.map{|x|Zlib::Inflate.inflate File.open(x).read}.join(?0*5e3)

input: tek bir komut satırı argümanı, okunacak sayı

çıkış: ham ses verileri, PCM 8bit / 8kHz

Bu, sürece herhangi bir girdi dizesini okuyabilir

  • yalnızca geçerli dosya adları olan karakterler içerir. sadece dört karakter için, bu seti tüm karakterlere genişletebilirsiniz.
  • gerekli dosyalara sahipsiniz.
  • Neden oh uzay dee oh en kesme işareti tee alan em i en dee uzay tee aitch i dönem

5e3iki sözcük arasındaki duraklamayı kodlar. Burada, 5 numune ~ = 0.6s. İstediğiniz gibi ayarlayın.

Şimdi, zor kısım örnek dosyaları 4K olarak elde etmek ve yine de bunları kolayca ve yeterli kalitede açabilmek. İşte onları nasıl buldum:

Şimdi, bir numune oranı ve belirleme miktarı seçilmelidir. Çok fazla ve ses anlaşılır olmayacak. Çok az ve uymuyorsun. 8kHz / 3b'ye yerleştim. İşte: https://github.com/honnza/drops/raw/master/digits.zip

  • 8KHz * 4b / örnek ve daha yüksek kalite - çok büyük
  • 8KHz * 3b / örnek - düşük kalite, ancak 4K'ya sığar
  • 8KHz * 2b / örnek - kch kchhhhhhhhh [anlaşılmaz]
  • 2KHz * 8b / örnek - çok büyük
  • 2KHz * 3b / örnek - kch kchhhhhhhhh
  • 1KHz * 8b / örnek - kch kchhhhhhhhh

İşte decimation betiği:

require'zlib'
Dir.glob "*.raw" do |fname|
  File.open fname[/\d/], "wb" do |out|
    File.open fname do |input|
      bytes = input.bytes.to_a
      bytes.map! {|x|x&0xE0}
      dfl = Zlib::Deflate.deflate(bytes.pack("C*"),9)
      dfl.each_byte do |byte|
        out.print byte.chr
      end
      puts "done #{fname}: #{dfl.size}"
    end
  end
end

Orijinal meydan okumaya gelince: kod ve dosya tablosu için 476 bayt alan var. Bu, bir DEFLATE kütüphanesi ile ne kadar küçük olabileceğimize bağlı olarak biraz fazla olabilir. Gerekirse, ses örneklerini biraz daha agresif bir şekilde kırparak burada ve orada birkaç köşe kesebiliriz. [fo:r]ya [o:]da gerçekten önemli değil ama bayt tasarrufu sağlıyor. Sayıları kırparken biraz hayırsever oldum. Ayrıca, farklı bir decimation şeması veya aşağı örnekleme için bazı decimation feda etmek yardımcı olabilir - daha sonra bunlarla oynayacağım. Ayrıca, DEFLATE başlıklarını bırakmak çok az yer kaplayabilir.

Ses örneklerini birleştirmek oldukça kolaydır, ancak 4K biraz sıkışıktır. 4 k boşlukla bağlı değilseniz, daha az decimation öneririz. Örnek başına 4 bit aslında oldukça iyi sonuç verir ve sadece biraz daha büyüktür.


+1, fena değil. Netlik oldukça marjinal, ancak: Birkaç rastgele sayı yazmayı denedim ve yaklaşık% 70 başarı oranı aldım. (Ben yakın% 99 için bir şey umuyordum.) Hala da mansiyon şey hakkında çit biraz değilim: Eğer 4K oldukça iyi bir argüman yaptık ederken olabilir bu şekilde ulaşılabilir olması, görmedin aslında gösterdi. C için yakut atmış olsanız bile (ki bu yeterince kolay görünüyor; inanç üzerine o parçayı almaya istekli olurum), kalan flaş alanına gerçekten bir DEFLATE dekoderi sığabilir misiniz ? Ayrıca, belirttiğim gibi, ses kalitesi oldukça kötü.
Ilmari Karonen

Ps. Daha iyi sıkıştırma hakkında birkaç ipucu: Tüm örnekleri boş baytlarla (iyi sıkıştırılması gereken) sabit bir uzunluğa doldurabilir ve bunları sıkıştırılmış bir dosyada birleştirebilir, daha sonra sıkıştırıp dilimleyebilirsiniz. Ayrıca, bu cevabın KZIP numarası size daha iyi DEFLATE sıkıştırma sağlayabilir. Son olarak, eşdeğer fonemleri tam kopyalarla değiştirmek için birleştirilmiş ses dosyasını düzenlemeyi deneyin.
Ilmari Karonen

orijinal ses örnekleri de IMO'nun tam olarak anlaşılabilir değildi - altörnekleme buna çok az zarar verdi. Bildiğim en küçük DEFLATE kütüphanesi - wikipeda ile bağlanan ilk kütüphane - yaklaşık 500b ağırlığında. Açıkçası, şişiriciyi söz konusu cihaza taşımamı ister misiniz? Aslında bunu anlayabilirim, ama daha önce ARM için hiç kod yazmadım.
John Dvorak

% 70 başarı oranına çok şaşırdım - rakamların anlaşılması kolay buldum. En çok hangi rakamları karıştırdınız?
John Dvorak

Bir Cortex M0'a taşımak muhtemelen sormak için biraz fazla (bunu yapabilirseniz, bu harika olurdu!), Ancak tek başına bir ikili (varsa, + veri dosyaları) 4k makul bir gösteri gibi görünüyordu. (Katıştırılmış bir cihazda buna ihtiyacınız olmayacağından, ancak DEFLATE kodunun mutlaka sayılması gerektiğinden, G / Ç dosyası için libc'de statik olarak bağlantı kurmanıza gerek yoktur.) Temel olarak, orijinal soruya cevap olarak gönderebileceğiniz bir şey SE ve güvenle "bunu cihazınız için derlerseniz, uygun olacağına eminim" deyin.
Ilmari Karonen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.