Add sample text for voices

This commit is contained in:
Michael Hansen 2022-05-10 14:11:27 -04:00
commit de0097c034
4 changed files with 244 additions and 11 deletions

View file

@ -18,6 +18,7 @@ import asyncio
import dataclasses
import json
import logging
import re
import typing
from pathlib import Path
from queue import Queue
@ -36,7 +37,7 @@ from quart import (
from swagger_ui import api_doc
from mimic3_tts import DEFAULT_VOICE, Mimic3Settings, Mimic3TextToSpeechSystem
from mimic3_tts.utils import LANG_NAMES
from mimic3_tts.utils import LANG_NAMES, SAMPLE_SENTENCES
from ._resources import _DIR, _PACKAGE
from .args import _MISSING
@ -234,6 +235,11 @@ def get_app(args: argparse.Namespace, request_queue: Queue, temp_dir: str):
# Add more fields to voices
for voice_dict in voice_dicts:
voice_lang = voice_dict["language"]
# en_US => en
short_lang = voice_lang.split("_", maxsplit=1)[0]
# en_US => English (US)
lang_name = LANG_NAMES.get(voice_lang, voice_lang)
if isinstance(lang_name, str):
@ -246,6 +252,10 @@ def get_app(args: argparse.Namespace, request_queue: Queue, temp_dir: str):
voice_dict["language_native"] = native_lang
voice_dict["language_english"] = english_lang
sample_text = SAMPLE_SENTENCES.get(short_lang, "")
sample_text = re.sub(r"\s+", " ", sample_text)
voice_dict["sample_text"] = sample_text
return jsonify(voice_dicts)
@app.route("/process", methods=["GET", "POST"])

View file

@ -235,6 +235,7 @@
<!-- Bootstrap core JavaScript -->
<script>
var voicesInfo = {}
var isUserText = false
function q(selector) {return document.querySelector(selector)}
q('#text').focus()
@ -378,6 +379,12 @@
)
}
var textArea = q('#text')
if ((textArea.value.length == 0) || !isUserText) {
textArea.value = voice.sample_text
isUserText = false
}
// Update inference settings
if (voice.properties) {
q('#length-scale').value = voice.properties.length_scale || 1.0
@ -433,18 +440,22 @@
})
}
function copyVoiceKey() {
var voiceName = q('#voice-name')
var speakerList = q('#speaker-list')
function copyVoiceKey() {
var voiceName = q('#voice-name')
var speakerList = q('#speaker-list')
var voiceKey = voiceName.options[voiceName.selectedIndex].value
if (speakerList.options.length > 1) {
voiceKey += '#' + speakerList.options[speakerList.selectedIndex].value
}
var voiceKey = voiceName.options[voiceName.selectedIndex].value
if (speakerList.options.length > 1) {
voiceKey += '#' + speakerList.options[speakerList.selectedIndex].value
}
navigator.clipboard.writeText(voiceKey)
}
navigator.clipboard.writeText(voiceKey)
}
function textChanged() {
isUserText = true
}
window.addEventListener('load', function() {
loadVoices()
@ -453,6 +464,7 @@
q('#voice-name').addEventListener('change', nameChanged)
q('#copy-voice').addEventListener('click', copyVoiceKey)
q('#text').addEventListener('change', textChanged)
})
</script>

View file

@ -21,8 +21,10 @@ 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",
@ -53,6 +55,209 @@ LANG_NAMES = {
"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 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. Dazwischen wird es an der Tropfenrückseite
reflektiert. Das jeden Tropfen verlassende Licht ist in farbigen
Schichten konzentriert, die aufeinandergesteckte dünne Kegelmäntel
bilden. Der Beobachter hat die Regenwolke vor sich und die Sonne im
Rücken. Ihn erreicht Licht einer bestimmten Farbe aus Regentropfen, die
sich auf einem schmalen Kreisbogen am Himmel befinden. Der Winkel, unter
dem der Regenbogen gesehen wird, ist gleich wie der Winkel der
Kegelmäntel, in dem diese Farben beim Austritt am Regentropfen
konzentriert sind.""",
"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. Es un arco
compuesto de arcos concéntricos de colores, sin solución de continuidad
entre ellos, con el rojo hacia la parte exterior y el violeta hacia el
interior. A altitud suficiente, por ejemplo cuando se viaja en avión, el
arcoíris se puede observar en forma de círculo completo.""",
"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. Devido à necessidade humana de classificação dos fenômenos da
natureza, a capacidade finita de distinção de cores pela visão humana e
por questões didáticas, o arco-íris é mais conhecido por uma
simplificação criada culturalmente que resume o espectro em sete cores
na seguinte ordem: vermelho, laranja, amarelo, verde, azul, anil e
violeta. Tal simplificação foi proposta primeiramente por Isaac Newton,
que decidiu nomear apenas cinco cores e depois adicionou mais duas
apenas para fazer analogia com as sete notas musicais, os sete dias da
semana e os sete objetos do sistema solar conhecidos à época. Para
informações sobre o espectro de cores do arco-íris, veja também o artigo
sobre cores.""",
"ru": """Ра́дуга, атмосферное, оптическое и метеорологическое явление,
наблюдаемое при освещении ярким источником света множества водяных
капель. Радуга выглядит как разноцветная дуга или окружность,
составленная из цветов спектра видимого излучения. Это те семь цветов,
которые принято выделять в радуге в русской культуре, но следует иметь в
виду, что на самом деле спектр непрерывен, и его цвета плавно переходят
друг в друга через множество промежуточных оттенков.""",
"sv": """En regnbåge är ett optiskt, meteorologiskt fenomen som uppträder som
ett fullständigt ljusspektrum i form av en båge himlen solen lyser
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ạ 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 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é-è̟̟ alákò̟ó̟̟̟. E̟̟ ilé-è̟̟ alákò̟ó̟̟̟ yìí gbo̟̟ ̟ dandan. A
gbo̟̟ pèsè è̟̟ is̟é̟-o̟̟, àti ti ìmò̟-è̟ro̟ fún àwo̟n ènìyàn lápapò̟. Àn fàní
̟gba ilé-è̟̟ gíga gbo̟̟ àró̟̟ gbogbo e̟ni ̟ .""",
}
def audio_float_to_int16(
audio: np.ndarray, max_wav_value: float = 32767.0

View file

@ -514,6 +514,9 @@ class EspeakVoice(Mimic3Voice):
# Split on breaks
sent_phonemes = []
for word_phonemes in all_word_phonemes:
if not word_phonemes:
continue
sent_phonemes.append(word_phonemes)
if minor_break and (word_phonemes[-1] == minor_break):
@ -752,6 +755,9 @@ class EpitranVoice(Mimic3Voice):
# Split on breaks
sent_phonemes = []
for word_phonemes in all_word_phonemes:
if not word_phonemes:
continue
sent_phonemes.append(word_phonemes)
if minor_break and (word_phonemes[-1] == minor_break):