Prosta/niezaawansowana heurystyka na długość wymawianego słowa.

0

Cześć!

Od razu mówię, że nie szukam nic zaawansowanego ani kozackiego, musi być po prostu bardzo proste/banalne.

Mamy sobie jakieś zdanie/zdania, składające się z dowolnej ilości słów, powiedzm.

quick brown fox jumps over the lazy dog.

Chciałbym napisać prostą heurystykę, tego jak długo wymawia się dane słowo, nie musi być dokładna liczba, wystarczy mi stosunek słowa do zdania.

Pierwszy sposób to po prostu policzyć znaki. Całe zdanie ma 32 znaki, pierwsze słowo ma 5 znaków, czyli bardzo prosty algorytm powiedziałby że pierwsze słowo wymawia się 5/32ich. I to jest spoko.

Ale są słowa które są dłuższe, ale wymawia się je szybko, np angielskie queue wymawia się tak samo szybko jak po prostu q. Noi też są dwuznaki, jak "sz", "cz", "ch", "rz" oraz litery nieme, np hacer po hiszpańsku wymawia się dokładnie tak samo jak acer.

Ma ktoś jakiś pomysł?

0

Do wszystich języków to czy tylko do angielskiego?
Czy będziesz też uwzględniać różnicę między krótkimi i długimi samogłoskami? (Hasło Iloczas)
Kiedyś czytałem że samogłosi trwają dużo dłużej niż spółgłostki, ale teraz nie moge znaleźć nic na ten temat

0
KamilAdam napisał(a):

Do wszystich języków to czy tylko do angielskiego?
Czy będziesz też uwzględniać różnicę między krótkimi i długimi samogłoskami? (Hasło Iloczas)
Kiedyś czytałem że samogłosi trwają dużo dłużej niż spółgłostki, ale teraz nie moge znaleźć nic na ten temat

Tak, dobrze byłoby do wielu języków.

0

W google translator jest funkcjonalność czytania wpisanego zdania. Może można go wykorzystać i w jakis sposób pobierać czasy poszczególnych zdań/słów?

0
Yarilo napisał(a):

W google translator jest funkcjonalność czytania wpisanego zdania. Może można go wykorzystać i w jakis sposób pobierać czasy poszczególnych zdań/słów?

Ja potrzebuję tą funkcjonalność offline i bez żadnego przetwarzania audio.

0
Yarilo napisał(a):

Coś w tym stylu ci chodzi? https://www.textconverter.io/speech-time/

Tak, tylko z open-source'ową imlementacją, żeby dało się ją zportować, i z większą dokładnością niż co do sekundy (np do 10ms byłoby okej).

Działa nawet dobrze, bo queue queue queue queue daje taki sam czas jak q q q q. O to chodziło.

2
Riddle napisał(a):

Ale są słowa które są dłuższe, ale wymawia się je szybko, np angielskie queue wymawia się tak samo szybko jak po prostu q.

W angielskim każde słowo mówi się inaczej. Czasami nawet ta sama zbitka liter może być czytana tak, czy inaczej, w zależności od znaczenia. np. live (może być czytane jako liw i lajw w zależności od tego, które znaczenie mamy na myśli). No i też wersja języka (US/UK etc.) też zmienia wymowę. Plus niektóre zwroty się czyta inaczej w potocznej wymowie "I'm going to" => "I'm gonna" (po polsku też można by takie przykłady podać). Plus wspomniany iloczas.

We francuskim i duńskim zaś zjadają z połowę liter przy wymowie.

Ma ktoś jakiś pomysł?

Być może są jakieś biblioteki, które to robią? Może można użyć albo zobaczyć, jakich używają algorytmów?

0
LukeJL napisał(a):
Riddle napisał(a):

Ale są słowa które są dłuższe, ale wymawia się je szybko, np angielskie queue wymawia się tak samo szybko jak po prostu q.

W angielskim każde słowo mówi się inaczej. Czasami nawet ta sama zbitka liter może być czytana tak, czy inaczej, w zależności od znaczenia. np. live (może być czytane jako liw i lajw w zależności od tego, które znaczenie mamy na myśli). No i też wersja języka (US/UK etc.) też zmienia wymowę.

Tak, dlatego nie zależy mi na prawdziwym czasie, a jedynie na heurystyce. Czymś kapkę lepszym niż głupie liczenie znaków. Wiadomo że nie będzie to zawsze idealne.

Plus niektóre zwroty się czyta inaczej w potocznej wymowie "I'm going to" => "I'm gonna" (po polsku też można by takie przykłady podać). Plus wspomniany iloczas.

Te mnie nie interesują.

LukeJL napisał(a):

We francuskim i duńskim zaś zjadają z połowę liter przy wymowie.

Noi chciałbym to jakoś ugryść.

LukeJL napisał(a):

Być może są jakieś biblioteki, które to robią?

Nie, to powinien być w miare prosty sposób.

2

Nie wiem, w czym to piszesz, ale w przeglądarkowym JS masz wbudowany syntezator mowy:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API
można by go użyć i sprawdzić eksperymentalnie ile będzie mówił dane słowo (łapiąc określone eventy).

Jeśli nie w przeglądarce, to w systemie operacyjnym być może znajduje się syntezator (na macOS się znajduje pod komendą say).

Tym sposobem bez użycia dodatkowych bibliotek mógłbyś sprawdzić, ile czasu się to wymawia (chociaż byłbyś zależny od API syntezatora mowy na danej platformie)

0

Za czasów króla ćwieczka było takie coś jak Soundex, chodziło o przybliżone porównywanie podobnie wymawianych słów angielskich.
Do dziś to zawierają niektóre bazy.
https://pl.wikipedia.org/wiki/Soundex

Disclaimer: nie mam o tym pojęcia. Wiem, że jak trafiało mi przed oczy, to świat był nieco zamknięty, i w PL nie było najmniejszego powodu spelowac po angielsku.

0

W polskim, całkiem niezłe rezultaty byś pewnie miał licząc samogłoski, ale PL, to "barbarzyński" język, w którym właściwie wszystko się czyta tak jak jest napisane. Wydaje mi się, że niezły i darmowy rezultat mógłbyś osiągnąć licząc sylaby. A słowniki, czy tam mechanizmy do liczenia sylab da się znaleźć, bo jest sporo darmowego i opensource oprogramowania, które potrzebuje np. przenośić słowa do nowej linii.

0

Wo.. Wo... Wo.. Wołga! FKSKFJFJUFFJFJFJRJR

Fajny temat na zbudowanie jakiegoś modelu ML.

Skąd wziąć dane do nauki modelu? Można przyjąć, że taka wartość dla słowa się nie zmienia i można stablicować, przepuszczając słownik przez jakiś open text 2 speech i mierząc dla każdego słowa długość wygenerwanej ścieżki dźwiękowej.

0
yarel napisał(a):

Wo.. Wo... Wo.. Wołga! FKSKFJFJUFFJFJFJRJR

Fajny temat na zbudowanie jakiegoś modelu ML.

Skąd wziąć dane do nauki modelu? Można przyjąć, że taka wartość dla słowa się nie zmienia i można stablicować, przepuszczając słownik przez jakiś open text 2 speech i mierząc dla każdego słowa długość wygenerwanej ścieżki dźwiękowej.

Czego z "proste rozwiązanie" nie zrozumiałeś?

1

IMO powinieneś policzyć sylaby.
Liczenie samogłosek jest bliskie sylabom.
Można też zbudować tablicę sylab i ich szacowanej długiości.

2

Ale w zasadzie czemu wszyscy o tym generowaniu dzwięku piszą. To co potrzeba to słownik wymowy danego słowa. Czyli coś co jest normalnie w każdym słowniku książkowym do nauki języków. Trzeba tylko znaleźć wersję cyfrową. A mając ilość znaczków w takim słowniku to juz można sobie policzyć ile to potrwa.
Jedyny problem to to że @Riddle chce taki słownik dla wszystkich języków świata i to bez podania języka. Ciekawe co ze słowami które występują w wielu językach a mają różną wymowę. Można tu przytoczyć np przez pewien czas słynne chuja party (maj nadzieję że za tą nazwę nie dostanę bana XD )

UPDATE Chociaż to akurat słąby przykład bo jest dalej taka sama ilość głosek :(
Może Silesia wymawiane jako Sajlezja jest lepszy przykładem <zamyślony />

0
Riddle napisał(a):

Czego z "proste rozwiązanie" nie zrozumiałeś?

Rozumiem, że część zbudowania lookup table może Cię przerażać, ale której części idei lookup(slowo) -> dlugoscWymowy nie zrozumiałeś?

0
KamilAdam napisał(a):

Ale w zasadzie czemu wszyscy o tym generowaniu dzwięku piszą. To co potrzeba to słownik wymowy danego słowa. Czyli coś co jest normalnie w każdym słowniku książkowym do nauki języków. Trzeba tylko znaleźć wersję cyfrową. A mając ilość znaczków w takim słowniku to juz można sobie policzyć ile to potrwa.
Jedyny problem to to że @Riddle chce taki słownik dla wszystkich języków świata i to bez podania języka. Ciekawe co ze słowami które występują w wielu językach a mają różną wymowę.

Nie musi być dla wszystkich. Mogę spokojnie zahardkodzić taki słownik dla kilku wspieranych języków, i sprawdzać długość wymawianego słowa podając język.

MarekR22 napisał(a):

IMO powinieneś policzyć sylaby.
Liczenie samogłosek jest bliskie sylabom.
Można też zbudować tablicę sylab i ich szacowanej długiości.

A to zadziała dla przypadku q oraz queue?

2

Nie da się za bardzo. W angielskim i innych językach masz coś takiego jak redukcje - w skrócie ludzie nie wypowiadają niektórych słów lub zbitek słów w całości w naturalnej mowie (nawet oficjalnej). Jedynie roboty używają słownikowej wymowy. W dodatku w mowie kładzie się nacisk / akcent na niektóre słowa wypowiadając je wolniej, nie mówiąc już nawet o tym że każdy mówi w swoim tempie. Nawet wygenerowanie dźwięku i policzenie długości nie będzie lepsze niż zgadywanie po ilości liter.

W przypadku "queue" - mamy słowo na 5 znaków, wypowiada się jak 1 znak, ale w rzeczywistości wypowiada się to jak 3 głoski, lub nawet 4 bo ostatnia jest lekko przeciągnięta. Spokojnie można więc ten przypadek pominąć. W zdaniu "quick brown fox jumps over the lazy dog" niemal każde słowo wypowiada się tyle samo czasu niezależnie czy mają 3 czy 5 liter. Moim zdaniem większe znaczenie niż głoski / sylaby mają pauzy. W przypadku dłuższych zdań większość zrobi pauzę na wdech lub oddzielenie reszty zdania - tutaj prawdopodobnie większość zrobi większą przerwę po "fox".

Moja rada: po prostu przyjmij stały czas trwania każdej litery i pauzy - będzie to tak samo niedokładne jak każdy inny sposób na który wpadniesz i w przypadku niektórych zdań pewnie bardziej zbliżone rzeczywistości niż najbardziej wymyślne metody.

3

Proponuję model:

bierzemy koszt a1 za samodzielną spółgłoskę (niech startowo będzie 1)
i koszt a2 za każdą następną spółgłoskę (w ciągu następujących po sobie spółgłosek) (niech startowo będzie 0.2)
bierzemy koszt b1 za samogłoskę (niech startowo będzie 2)
i koszt b2 za każdą następującą samogłoskę ( w ciągu samogłosek) (niech startowo będzie 0.6)

Czyli queue to będzie a1 + b1 + b2 +b2 +b2 + b2 (czyli startowo 5.4)

Teraz bierzesz jakiś 1000 przykładów (np. z syntezatora mowy), w 10 językach indoeuropejskich (bo inne nie mają tu sensu) i optymalizujesz/ kalibrujesz b1,b2,a1,a2.
(poniekąd jest to ML)

Są jeszcze takie problemy jak to, że w różnych językach niektóre litery są samogłoskami, a w innych spółgłoskami, a w innych trochę pomiędzy.
(np.r,j,s,l). Więc może być przydatna trzecia kategoria (c1 + c2???)

Model wymyśliłem przed chwilą w kiblu. Więc pewnie jest dobry.

3
piotrpo napisał(a):

W polskim, całkiem niezłe rezultaty byś pewnie miał licząc samogłoski, ale PL, to "barbarzyński" język, w którym właściwie wszystko się czyta tak jak jest napisane.

No niezupełnie. Reguł w polskim jest sporo, tylko że są dość konsekwentne – zwykle jest tylko jeden sposób przeczytania wyrazu.

Co do liczenia samogłosek – są jakby dwa rodzaje języków: takie w których akcent wyrazowy nie jest zbyt silny (polski, hiszpański) przez co sylaby akcentowanie nie różnią się specjalnie od nieakcentowanych, i takie w których akcent jest bardzo silny (angielski, rosyjski) powodując redukcję nieakcentowanych samogłosek. Są na to zjawisko mądre nazwy ale ich teraz nie pamiętam.

W polskim liczenie samogłosek jeszcze może się sprawdzić (ale trzeba wziąć pod uwagę zasady pisowni - litera i często nie oznacza samogłoski: słowo „nie” czytamy [ńe] i nie ma w nim [i]) ale w angielskim więcej sensu ma liczenie tylko sylab akcentowanych. Co będzie trudniejsze.

Liczenie po prostu znaków może działać dobrze jeśli język nie ma wielu dwu- i trójznaków, ale kompletnie nie nada się do japońskiego, który ma ekstremalnie zmienną „prędkość tekstu”: jeden znak może oznaczać np. trzy sylaby a zaraz trzy znaki składają się na jedną sylabę.

0

@Azarien: Ja nie twierdzę, że to idealny sposób. Zależy jak długa próbka tekstu ma zostać zmierzona i z jaką dokładnością. W PL, liczba samogłosek, to ~liczba sylab. tak, są takie składanki jak ni, si, ci, które składają się na pojedynczą głoskę, ale zakładając jakieś zadanie typu dostosowywanie wyświetlania tekstu do długości jego czytania na głos (np. teleprompter) może wystarczyć, bo w większośći przypadków to się zrównoważy. Gdzie nam do angielskiego queue, yacht itp. potworków.

0

@Azarien: to co proponujesz?

1

Można by spróbować wziąć jakiś otwarty dataset, taki, jak na te, na których trenuje się systemy TTS (np. LJSpeech) i spróbować zrobić jakąś statystykę, iloznakowe słowa mniej więcej ile trwają. Całkowicie średnio to oni tam mają 86 117 sekund nagrań i 1 308 678 znaków, co daje 0,065 sekundy na znak. Na szybko przetestowałem na słowie "character" i powinno mieć 0,585 sekundy, a ma jakieś 0,6-0,8, zależy, jak wymawiam.

Tylko problem jest taki, że to jest bardzo zależne od języka.

Do dokładniejszych zabaw prawdopodobnie potrzebujesz zacząć od przetworzenia tekstu na fonemy. Jak z <queue> uzyskasz [kjuː], a z <chrząszcz> uzyskasz [xʃɔ̃w̃ʃʧ̑] to można cokolwiek ekstrapolować, bo zapis ortograficzny jest w niektórych językach bardzo ułomny. Istnieje sobie gruut do robienia fonemizacji (translacji ortografia-IPA) dla kilku języków, dla języka polskiego nie ma. I ja w sumie nie znam czegoś takiego dla języka polskiego.

0

Mógłbym pociachać słowa na litery/dwuznaki albo na sylaby, i potem policzyć średnią długość takiej litery/dwuznaku/sylaby w słowie. Pytanie czy takie liczenie średniej po literach/sylabach będzie statystycznie bliżej prawdy niż po prostu policzenie liter.

0
Azarien napisał(a):

a dopuszczasz w tekście liczby? bo najpierw musiałbyś pozamieniać wszystkie liczby na zapis słowny.

Powinienem.

0

Może coś z tego:
https://www.google.com/search?q=estimate+reading+time+algorithm
https://dev.to/michaelburrows/calculate-the-estimated-reading-time-of-an-article-using-javascript-2k9l
https://www.cssscript.com/estimated-reading-time/

Jak masz całą długość tekstu to można potem obliczyć czasy do tego słowa i od tego słowa odjąć od sumy i powinien wyjść czas słowa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1