Zainspirowany tym pytaniem z Electronics.SE , oto wyzwanie dla Ciebie:
Napisz program lub podprogram, który pobiera ciąg cyfr dziesiętnych (od 0 do 9) i wypowiada je na głos, bez użycia istniejącego narzędzia do syntezy mowy.
Wejście:
Możesz poprosić o podanie cyfr wejściowych w dowolnym rozsądnym formacie, np. Jako ciąg cyfr ASCII, tablica liczb całkowitych, liczba zakodowana w BCD itp. Jeśli twoje rozwiązanie jest programem wykonywalnym, możesz wziąć dane wejściowe jako parametr wiersza poleceń, przeczytaj go ze standardowego wejścia lub uzyskaj w inny rozsądny sposób.
Twój program musi umieć wymawiać co najmniej osiem cyfr na każde wywołanie. Państwo może zakładać, że pierwsza cyfra nie jest zero, chyba że jest to tylko cyfra.
Wynik:
Twój program może wymawiać liczby bezpośrednio za pomocą urządzenia audio lub może odtwarzać odtwarzany plik dźwiękowy. Plik wyjściowy, jeśli istnieje, może być w dowolnym standardowym formacie audio lub może składać się z surowych próbek danych. Jeśli wyprowadzasz surowe dane przykładowe, zwróć uwagę na odpowiednie parametry do odtwarzania (częstotliwość próbkowania, liczba bitów na próbkę, endianness, podpisany / niepodpisany, liczba kanałów). Preferowane są formaty obsługiwane przez aplikację .
Możesz swobodnie decydować o szczegółach, w jaki sposób będą wypowiadane liczby, ale twój wynik powinien składać się z cyfr w języku angielskim wymawianych w sposób zrozumiały dla typowego anglojęzycznego i powinno być wystarczająco jasne, aby słuchacz mógł dokładnie transkrybować ośmiocyfrowa liczba mówiona. Nie, tylko dźwięk n razy się nie liczy. Nie zapomnij uwzględnić pauz między cyframi.
Punktacja:
Obowiązują standardowe reguły oceniania kodu-golfa : Twój wynik to długość kodu w bajtach lub, jeśli kod jest napisany tekstem Unicode, znakami Unicode. Najniższy wynik wygrywa. Dowolny język.
Ponieważ pierwotne pytanie na temat elektroniki. SE dotyczyło programowania wbudowanego, uznałem, że należałoby rzucić kość autorom używającym języków niskiego poziomu: jeśli twoje rozwiązanie jest napisane w języku skompilowanym, możesz policzyć długość skompilowany plik wykonywalny w bajtach jako wynik. (Tak, prekompilowany kod bajtowy, taki jak .class
plik Java , również jest OK.) Jeśli zdecydujesz się skorzystać z tej opcji, dołącz do swojej kopii kopię skompilowanego pliku wykonywalnego (np. Zrzut heksadecymalny) wraz z kodem źródłowym oraz wersję kompilatora i opcje użyte do jej wygenerowania.
Wyróżnienie , wraz z bounty +50 rep, zostaną przyznane pierwszej odpowiedzi, które również spełnia kryteria oryginalne pytanie , to znaczy jest w stanie działać na osadzonym MCU z 4 KB Flash i 1 kb SRAM.
Ograniczenia:
Nie możesz korzystać z plików lub zasobów sieciowych , które nie są częścią standardowego środowiska uruchomieniowego wybranego przez Ciebie języka, chyba że uwzględnisz długość tych plików lub zasobów jako część wyniku. (Ma to na celu uniemożliwić np. Ładowanie próbek audio z Internetu).
Nie możesz również używać żadnych wcześniej istniejących narzędzi do syntezy mowy, bibliotek lub kompilacji danych audio (chyba że uwzględnisz ich rozmiar jako część wyniku), nawet jeśli są one zawarte w standardowym środowisku uruchomieniowym wybranego języka.
Odpowiedzi:
ruby - 3710 = kod 90 znaków + dane 3620 bajtów
input: pojedynczy argument wiersza poleceń, liczba do odczytania
wyjście: surowe dane dźwiękowe, PCM 8bit / 8kHz
Może to odczytać dowolny ciąg wejściowy, o ile
5e3
koduje pauzę między dwoma słowami. Tutaj 5 próbek ~ = 0,6s. Dostosuj według potrzeb.Teraz trudną rzeczą jest uzyskanie przykładowych plików w rozdzielczości 4K, a jednocześnie możliwość ich łatwej dekompresji i odpowiedniej jakości. Oto jak je dostałem:
Teraz trzeba wybrać częstotliwość próbkowania i kwotę dziesiętną. Za dużo, a dźwięk nie będzie zrozumiały. Za mało, a ty nie pasujesz. Postawiłem na 8kHz / 3b. Oto one: https://github.com/honnza/drops/raw/master/digits.zip
Oto skrypt dziesiętny:
Jeśli chodzi o oryginalne wyzwanie: jest 476 bajtów miejsca na kod i tablicę plików. Może to być nieco za dużo w zależności od tego, jak małe możemy uzyskać dzięki bibliotece DEFLATE. W razie potrzeby możemy wyciąć kilka rogów tu i tam, przycinając próbki audio nieco bardziej agresywnie.
[fo:r]
lub[o:]
tak naprawdę nie ma znaczenia, ale oszczędza bajty. Byłem nieco życzliwy, kiedy przycinałem liczby. Pomocny może być również inny schemat dziesiętny lub poświęcenie części dziesiętnej dla próbkowania w dół - później się z nimi bawię. Ponadto upuszczenie nagłówków DEFLATE może zaoszczędzić niewielką ilość miejsca.Łączenie próbek dźwięku jest dość łatwe, ale 4K jest trochę ciasne. Jeśli nie jesteś związany przestrzenią 4k, sugeruję mniejsze zdziesiątkowanie. 4 bity na próbkę faktycznie wypadają całkiem dobrze i są tylko nieznacznie większe.
źródło