281 lines
22 KiB
Python
281 lines
22 KiB
Python
# Copyright 2022 Mycroft AI Inc.
|
||
#
|
||
# This program is free software: you can redistribute it and/or modify
|
||
# it under the terms of the GNU Affero General Public License as published by
|
||
# the Free Software Foundation, either version 3 of the License, or
|
||
# (at your option) any later version.
|
||
#
|
||
# This program is distributed in the hope that it will be useful,
|
||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
# GNU Affero General Public License for more details.
|
||
#
|
||
# You should have received a copy of the GNU Affero General Public License
|
||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
#
|
||
"""Utility methods for Mimic 3"""
|
||
import hashlib
|
||
import re
|
||
import typing
|
||
import unicodedata
|
||
|
||
import numpy as np
|
||
|
||
# Wildcard character for voice keys (e.g., en_US/*)
|
||
WILDCARD = "*"
|
||
|
||
# Language code to native/English language name
|
||
LANG_NAMES = {
|
||
"bn": ("বাংলা", "Bengali"),
|
||
"af_ZA": "Afrikaans",
|
||
"da_DK": ("Dansk", "Danish"),
|
||
"de_DE": ("Deutsch", "German"),
|
||
"en_UK": "English (UK)",
|
||
"en_US": "English (US)",
|
||
"el_GR": ("Ελληνικά", "Greek"),
|
||
"es_ES": ("Español", "Spanish"),
|
||
"fa": ("فارسی", "Persian"),
|
||
"fi_FI": ("Suomi", "Finnish"),
|
||
"fr_FR": ("Français", "French"),
|
||
"gu_IN": ("ગુજરાતી", "Gujarati"),
|
||
"ha_NE": "Hausa",
|
||
"hu_HU": ("Magyar Nyelv", "Hungarian"),
|
||
"it_IT": ("Italiano", "Italian"),
|
||
"jv_ID": ("Basa Jawa", "Javanese"),
|
||
"ko_KO": ("한국어", "Korean"),
|
||
"ne_NP": ("नेपाली", "Nepali"),
|
||
"nl": ("Nederlands", "Dutch"),
|
||
"pl_PL": ("Polski", "Polish"),
|
||
"ru_RU": ("Русский", "Russian"),
|
||
"sw": "Kiswahili",
|
||
"te_IN": ("తెలుగు", "Telugu"),
|
||
"tn_ZA": "Setswana",
|
||
"uk_UK": ("украї́нська мо́ва", "Ukrainian"),
|
||
"vi_VN": ("Tiếng Việt", "Vietnamese"),
|
||
"yo": ("Èdè Yorùbá", "Yoruba"),
|
||
}
|
||
|
||
# Sample text sent with /api/voices JSON
|
||
SAMPLE_SENTENCES = {
|
||
"bn": """রংধনু বা রামধনু বা ইন্দ্রধনু হল একটি দৃশ্যমান ধনুকাকৃতি আলোর রেখা যা
|
||
বায়ুমণ্ডলে অবস্থিত জলকণায় সূর্যালোকের প্রতিফলন এবং প্রতিসরণের ফলে ঘটিত হয়।
|
||
সাধারণত বৃষ্টির পর আকাশে সূর্যের বিপরীত দিকে রামধনু দেখা যায়। রংধনুতে সাতটি
|
||
রঙের সমাহার দেখা যায়। দেখতে ধনুকের মতো বাঁকা হওয়ায় এটির নাম রংধনু।""",
|
||
"af": """'n Reënboog is 'n boog van gekleurde lig wat ontstaan wanneer die
|
||
son teen 'n waterdruppel skyn en die wit lig dan deur middel van
|
||
ligbreking in die volledige kleurspektrum opgebreek word. Die middelpunt
|
||
van die reënboog staan reg teenoor die son en die boog het 'n straal van
|
||
ongeveer 42°. Die kleure van die reënboog is, van buite na binne, rooi,
|
||
oranje, geel, groen, blou, indigo en violet.""",
|
||
"da": """En regnbue er et optisk fænomen; en "lyseffekt", som skabes på
|
||
himlen, når lys fra Solen rammer små vanddråber i luften, f.eks.
|
||
faldende regn. Sådanne svævende vanddråber har facon omtrent som en
|
||
kugle – jo mindre de er, desto mere perfekt kugleform har de. Disse
|
||
kuglerunde dråber bryder, eller "afbøjer" lyset på samme måde som et
|
||
optisk prisme ved en proces, der kaldes refraktion. Og derudover opfører
|
||
indersiden af dråbernes overflader sig til en vis grad som små spejle,
|
||
(et fænomen der kaldes for intern refleksion), der kaster lyset tilbage
|
||
i nogenlunde den retning, det kom fra – det er derfor, man altid ser
|
||
regnbuer i retningen direkte væk fra solen.""",
|
||
"de": """Der Regenbogen ist ein atmosphärisch-optisches Phänomen, das als
|
||
kreisbogenförmiges farbiges Lichtband in einer von der Sonne
|
||
beschienenen Regenwand oder -wolke wahrgenommen wird. Sein radialer
|
||
Farbverlauf ist das mehr oder weniger verweißlichte sichtbare Licht des
|
||
Sonnenspektrums. Das Sonnenlicht wird beim Ein- und beim Austritt an
|
||
jedem annähernd kugelförmigen Regentropfen abgelenkt und in Licht
|
||
mehrerer Farben zerlegt.""",
|
||
"en": """A rainbow is a meteorological phenomenon that is caused by
|
||
reflection, refraction and dispersion of light in water droplets
|
||
resulting in a spectrum of light appearing in the sky. It takes the form
|
||
of a multi-colored circular arc. Rainbows caused by sunlight always
|
||
appear in the section of sky directly opposite the Sun.""",
|
||
"el": """Οι επιστήμονες μελετούν ακόμη το ουράνιο τόξο. Ο Καρλ Μπ. Μπόγιερ
|
||
παρατηρεί: «Μέσα σε μια σταγόνα βροχής η αλληλεπίδραση της ενέργειας του
|
||
φωτός με την ύλη είναι τόσο στενή ώστε οδηγούμαστε κατευθείαν στην
|
||
κβαντομηχανική και στη θεωρία της σχετικότητας. Αν και γνωρίζουμε αρκετά
|
||
πράγματα για το πώς σχηματίζεται το ουράνιο τόξο, λίγα είναι αυτά που
|
||
έχουμε μάθει για το πώς γίνεται αντιληπτό».""",
|
||
"es": """Un arcoíris o arco iris es un fenómeno óptico y meteorológico que
|
||
consiste en la aparición en el cielo de un arco de luz multicolor,
|
||
originado por la descomposición de la luz solar en el espectro visible,
|
||
la cual se produce por refracción, cuando los rayos del sol atraviesan
|
||
pequeñas gotas de agua contenidas en la atmósfera terrestre.""",
|
||
"fa": """برای دیگر کاربردها رنگینکمان (ابهامزدایی) را ببینید. رنگینکمان
|
||
دوتایی و رنگینکمانهای اضافی در درون کمان اصلی. سایهٔ سر عکاس مرکز دایرهٔ
|
||
رنگینکمان را مشخص میکند (نقطهٔ پاد خورشیدی). رنگینکمان پدیدهای نوری و
|
||
قیاسی است که زمانی که خورشید به قطرات نم و رطوبت جو زمین میتابد باعث
|
||
ایجاد طیفی از نور در آسمان میشود. این پدیده به شکل یک کمان رنگین در
|
||
میآید.""",
|
||
"fi": """Sateenkaari on spektrin väreissä esiintyvä ilmakehän optinen ilmiö.
|
||
Se syntyy, kun valo taittuu pisaran etupinnasta, heijastuu pisaran
|
||
takapinnasta ja taittuu jälleen pisaran etupinnasta. Koska vesipisara on
|
||
dispersiivinen, valkoinen valo hajoaa väreiksi muodostaen
|
||
sateenkaaren.""",
|
||
"fr": """Un arc-en-ciel est un photométéore, un phénomène optique se
|
||
produisant dans le ciel, visible dans la direction opposée au Soleil
|
||
quand il brille pendant la pluie. C'est un arc de cercle coloré d'un
|
||
dégradé de couleurs continu du rouge, à l'extérieur, au jaune au vert et
|
||
au bleu, jusqu'au violet à l'intérieur.""",
|
||
"gu": """મેઘધનુષ આકાશમાં ખાસ કરીને ચોમાસા દરમિયાન જોવા મળે છે. વરસાદના વાદળ પર
|
||
પડતાં સૂર્યના કિરણોને કારણે આકાશમાં અર્ધગોળાકાર તેમ જ સાત રંગોનું મેઘધનુષ રચાય છે.
|
||
મેઘધનુષમાં સૌથી ઉપર જાંબલી રંગ, પછી નીલો રંગ, પછી વાદળી રંગ, પછી લીલો રંગ, પછી
|
||
પીળો રંગ, પછી નારંગી રંગ તેમ જ છેલ્લે લાલ રંગ એમ સાત રંગો જોવા મળે છે. ગોળાકાર
|
||
હોવાથી તે ધનુષ જેવું દેખાય છે અને આ ગોળાકાર આકાર પૃથ્વીના ગોળ હોવાને કારણે સર્જાય
|
||
છે.""",
|
||
"ha": """Rainbow wani muhimmin haske ne da yake bayyana a cikin giza-gizai a
|
||
sararin samaniya wanda zaka ga yayi lankwasa kamar misalin baka ya
|
||
dangana daga kusurwa zuwa kusurwa. A turance ana kiransa Rainbow. Shi dai
|
||
wannan abu yana dauke da kaloli daban-daban har kusan guda bakwai, mafi
|
||
akasari yana bayyana ne lokacin da hadari ya taso, cikin ikon Allah da
|
||
zarar bakan gizo ya bayyana, nan take zaka ga hadarin ya lafa ma'ana zai
|
||
washe zuwa wani dan lokaci daga nan kuma sai Ruwa ya kece. Amma mafi
|
||
akasari wani lokacin sam baza ma ayi ruwan ba.""",
|
||
"hu": """A szivárvány olyan optikai jelenség, melyet eső- vagy páracseppek
|
||
okoznak, mikor a fény prizmaszerűen megtörik rajtuk és színeire bomlik,
|
||
kialakul a színképe, más néven spektruma. Az ív külső része vörös, míg a
|
||
belső ibolya. Előfordul az ún. dupla szivárvány is, amelynél egy másik,
|
||
halványabb ív is látható fordított sorrendű színekkel.""",
|
||
"it": """In fisica dell'atmosfera e meteorologia l'arcobaleno è un fenomeno
|
||
ottico atmosferico che produce uno spettro quasi continuo di luce nel
|
||
cielo quando la luce del Sole attraversa le gocce d'acqua rimaste in
|
||
sospensione dopo un temporale, o presso una cascata o una fontana. Lo
|
||
spettro elettromagnetico dell'arcobaleno include lunghezze d'onda sia
|
||
visibili sia non visibili all'occhio umano, queste ultime rilevabili
|
||
attraverso uno spettrometro.""",
|
||
"jv": """Kluwung, kuwung, wangkawa utawa éndracapa iku pratanda optik lan
|
||
météorologi wujud cahya manéka warna jinèjèr mlengkung ing langit utawa
|
||
papan liyané. Ing langit, kluwung katon kaya gandéwa cahya kang pucuké
|
||
ngarah ing horizon nalika udan riwis-riwis. Kluwung uga bisa katon ing
|
||
sacedhaké grojogan. Racaké udan anané ing wektu soré, saéngga kluwung
|
||
katon ing sisih wétan. Déné menawa ésuk, kluwung katon ing kulon,
|
||
diarani téja.""",
|
||
"ko": """무지개(문화어: 색동다리)는 하늘에 보이는 호(弧)를 이루는 색 띠를
|
||
말한다. 색 경계가 분명하지 않아 각 문화권마다 색의 개수가 다르게
|
||
인식되기도 한다. 대부분 지표로부터 하늘에 걸쳐서 나타나는 반원형 고리
|
||
모양으로 나타난다. 공기 중에 떠 있는 수많은 물방울에 햇빛이나 달빛
|
||
이닿아 물방울 안에서 굴절과 반사가 일어날 때, 물방울이 프리즘과 같은
|
||
작용을 하여 분산되어 나타나는 현상이다. 세계에서 가장 오랫동안 관측된
|
||
무지개는 2017년 11월 27일 중화민국 타이베이에서 관측된 것으로, 9시간
|
||
내내 무지개가 떠올랐다.""",
|
||
"ne": """इन्द्रेणी वा इन्द्रधनुष प्रकाश र रंगबाट उत्पन्न भएको यस्तो घटना हो जसमा रंगीन
|
||
प्रकाशको एउटा अर्धवृत आकाशमा देखिन्छ। जब सूर्यको प्रकाश पृथ्वीको वायुमण्डलमा भएको
|
||
पानीको थोपा माथि पर्छ, पानीको थोपाले प्रकाशलाई परावर्तन, आवर्तन र डिस्पर्सन
|
||
गर्दछ। फलस्वरुप आकाशमा एउटा सप्तरङ्गी अर्धवृताकार प्रकाशीय आकृति उत्पन्न हुन्छ। यो
|
||
आकृतिलाई नै इन्द्रेणी भनिन्छ। इन्द्रेणी देखिनुको कारण वायुमण्डलमा पानीका कणहरु हुनु नै
|
||
हो। वर्षा, झरनाबाट उछिट्टिएको पानी, शीत, कुहिरो आदिको इन्द्रेणी देखिने प्रक्रियामा
|
||
महत्त्वपूर्ण भूमिका हुन्छ। इन्द्रेणीमा सात रंगहरु रातो, सुन्तला, पहेंलो, हरियो, आकाशे
|
||
निलो, गाढा निलो र बैजनी रंग क्रमैसँग देखिन्छ। यसमा सबैभन्दा माथिल्लो छेउमा रातो रंग
|
||
र अर्को छेउमा बैजनी रंग देखिन्छ। इन्द्रेणी पूर्ण वृत्ताकार समेत हुन सक्ने भए पनि साधरण
|
||
अवलोकनकर्ताले जमिन माथि बनेको आधा भाग मात्र देख्न सकिन्छ ।""",
|
||
"nl": """Een regenboog is een gekleurde cirkelboog die aan de hemel
|
||
waargenomen kan worden als de, laagstaande, zon tegen een nevel van
|
||
waterdruppeltjes aan schijnt en de zon zich achter de waarnemer bevindt.
|
||
Het is een optisch effect dat wordt veroorzaakt door de breking en
|
||
weerspiegeling van licht in de waterdruppels.""",
|
||
"pl": """Tęcza, zjawisko optyczne i meteorologiczne, występujące w postaci
|
||
charakterystycznego wielobarwnego łuku powstającego w wyniku
|
||
rozszczepienia światła widzialnego, zwykle promieniowania słonecznego,
|
||
załamującego się i odbijającego wewnątrz licznych kropli wody mających
|
||
kształt zbliżony do kulistego. Rozszczepienie światła jest wynikiem
|
||
zjawiska dyspersji, powodującego różnice w kącie załamania światła o
|
||
różnej długości fali przy przejściu z powietrza do wody i z wody do
|
||
powietrza.""",
|
||
"pt": """Um arco-íris, também popularmente denominado arco-da-velha, é um
|
||
fenômeno óptico e meteorológico que separa a luz do sol em seu espectro
|
||
contínuo quando o sol brilha sobre gotículas de água suspensas no ar. É
|
||
um arco multicolorido com o vermelho em seu exterior e o violeta em seu
|
||
interior. Por ser um espectro de dispersão da luz branca, o arco-íris
|
||
contém uma quantidade infinita de cores sem qualquer delimitação entre
|
||
elas.""",
|
||
"ru": """Ра́дуга, атмосферное, оптическое и метеорологическое явление,
|
||
наблюдаемое при освещении ярким источником света множества водяных
|
||
капель. Радуга выглядит как разноцветная дуга или окружность,
|
||
составленная из цветов спектра видимого излучения. Это те семь цветов,
|
||
которые принято выделять в радуге в русской культуре, но следует иметь в
|
||
виду, что на самом деле спектр непрерывен, и его цвета плавно переходят
|
||
друг в друга через множество промежуточных оттенков.""",
|
||
"sv": """En regnbåge är ett optiskt, meteorologiskt fenomen som uppträder som
|
||
ett fullständigt ljusspektrum i form av en båge på himlen då solen lyser
|
||
på nedfallande regn. Regnbågen består färgmässigt av en kontinuerlig
|
||
övergång från rött via gula, gröna och blå nyanser till violett innerst;
|
||
ofta definieras antalet färger som sju, inklusive orange och indigo.""",
|
||
"sw": """Upinde wa mvua ni tao la rangi mbalimbali angani ambalo linaweza
|
||
kuonekana wakati Jua huangaza kupitia matone ya mvua inayoanguka. Mfano
|
||
wa rangi hizo huanza na nyekundu nje na hubadilika kupitia rangi ya
|
||
chungwa, njano, kijani, bluu, na urujuani ndani. Rangi hizi na ufuatano
|
||
ni sehemu ya spektra ya nuru. Upinde wa mvua huundwa wakati mwanga
|
||
umepinda ukiingia matone ya maji, umegawanyika kuwa rangi tofauti, na
|
||
kurudishwa nyuma. Hapa spektra ya nuru inayoonekana ambayo sisi tunaona
|
||
kwa macho kama nyeupe tu.""",
|
||
"te": """ఇంద్ర ధనుస్సు దృష్టి విద్యా సంబంధమయిన వాతావరణ శాస్త్ర సంబంధమయిన దృగ్విషయం. అది
|
||
నీటిబిందువులపై కాంతి పరావర్తనం, వక్రీభవనం ద్వారా సంబవిస్తుంది. అది ఆకాశంలో రంగురంగుల చాపం
|
||
రూపంలో ఉంటుంది. ఈ చర్య వల్ల రశ్మి వాతావరణం లోని నీటి బిందువులతో అంతఃపరావర్తనం చెంది,
|
||
వర్ణానుసారం విచ్ఛిన్నమయి ఏడు రంగులుగా మారుతుంది. అది ఒక అర్ధవృత్తాకారంలో రెండు అంచులూ భూమిలో
|
||
ఉన్నట్టు, వృత్తాకారం ఆకాశం వైపుకున్నట్టు గోచరిస్తుంది. సూర్యరశ్మి ద్వారా తయారయ్యే ఇంద్రధనుస్సు,
|
||
ఎల్లపుడూ సూర్యునికి వ్యతిరేక దిశలోనే కనిపిస్తుంది. ఇక రంగుల అమరికను బట్టీ ఇంద్రధనుస్సుని
|
||
రెండు రకాలుగా చెప్పొచ్చు. ఒకటి - ప్రాథమిక ఇంద్రధనుస్సు; రెండు ద్వితీయ ఇంద్రధనుస్సు. మొదటి
|
||
ఇంద్రధనుస్సులో వృత్తం పై భాగంలో ఎరుపు,, లోపలి భాగంలో ఊదా రంగులో ఉంటాయి.""",
|
||
"tn": """Batho botlhe ba tsetswe ba gololosegile le go lekalekana ka seriti
|
||
le ditshwanelo. Ba abetswe go akanya le maikutlo, mme ba tshwanetse go
|
||
direlana ka mowa wa bokaulengwe.""",
|
||
"uk": """Весе́лка, також ра́йдуга оптичне явище в атмосфері, що являє собою
|
||
одну, дві чи декілька різнокольорових дуг (або кіл, якщо дивитися з
|
||
повітря), що спостерігаються на тлі хмари, якщо вона розташована проти
|
||
Сонця. Червоний колір ми бачимо з зовнішнього боку первинної веселки, а
|
||
фіолетовий — із внутрішнього.""",
|
||
"vi": """Cầu vồng hay mống cũng như quang phổ là hiện tượng tán sắc của các
|
||
ánh sáng từ Mặt Trời khi khúc xạ và phản xạ qua các giọt nước mưa. Ở nhiều
|
||
nền văn hóa khác nhau, cầu vồng xuất hiện được coi là mang đến điềm lành cho
|
||
nhân thế.""",
|
||
"yo": """E̟nì kò̟ò̟kan ló ní è̟tó̟ láti kó̟ è̟kó̟. Ó kéré tán, è̟kó̟ gbo̟dò̟ jé̟ ò̟fé̟ ní
|
||
àwo̟n ilé-è̟kó̟ alákò̟ó̟bè̟rè̟. E̟kó̟ ní ilé-è̟kó̟ alákò̟ó̟bè̟rè̟ yìí sì gbo̟dò̟ jé̟ dandan. A
|
||
gbo̟dò̟ pèsè è̟kó̟ is̟é̟-o̟wó̟, àti ti ìmò̟-è̟ro̟ fún àwo̟n ènìyàn lápapò̟. Àn fàní tó
|
||
dó̟gba ní ilé-è̟kó̟ gíga gbo̟dò̟ wà ní àró̟wó̟tó gbogbo e̟ni tó bá tó̟ sí.""",
|
||
}
|
||
|
||
|
||
def audio_float_to_int16(
|
||
audio: np.ndarray, max_wav_value: float = 32767.0
|
||
) -> np.ndarray:
|
||
"""Normalize audio and convert to int16 range"""
|
||
audio_norm = audio * (max_wav_value / max(0.01, np.max(np.abs(audio))))
|
||
audio_norm = np.clip(audio_norm, -max_wav_value, max_wav_value)
|
||
audio_norm = audio_norm.astype("int16")
|
||
return audio_norm
|
||
|
||
|
||
def wildcard_to_regex(template: str, wildcard: str = "*") -> re.Pattern:
|
||
"""Convert a string with wildcards into a regex pattern"""
|
||
wildcard_escaped = re.escape(wildcard)
|
||
|
||
pattern_parts = ["^"]
|
||
for i, template_part in enumerate(re.split(f"({wildcard_escaped})", template)):
|
||
if (i % 2) == 0:
|
||
# Fixed string
|
||
pattern_parts.append(re.escape(template_part))
|
||
else:
|
||
# Wildcard separator
|
||
pattern_parts.append(".*")
|
||
|
||
pattern_parts.append("$")
|
||
pattern_str = "".join(pattern_parts)
|
||
|
||
return re.compile(pattern_str)
|
||
|
||
|
||
def file_sha256_sum(fp: typing.BinaryIO, block_bytes: int = 4096) -> str:
|
||
"""Return the sha256 sum of a (possibly large) file"""
|
||
current_hash = hashlib.sha256()
|
||
|
||
# Read in blocks in case file is very large
|
||
block = fp.read(block_bytes)
|
||
while len(block) > 0:
|
||
current_hash.update(block)
|
||
block = fp.read(block_bytes)
|
||
|
||
return current_hash.hexdigest()
|
||
|
||
|
||
def to_codepoints(s: str) -> typing.List[str]:
|
||
"""Split string into a list of codepoints"""
|
||
return list(unicodedata.normalize("NFC", s))
|