Skip to content
Draft
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions maps/here_4_traffic_day.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
},
"format": "raster",
"keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang": {"local": "mul", "ar": "ar", "eu": "eu", "ca": "ca", "zh-simpl": "zh", "zh": "zh", "cs": "cs", "da": "da", "nl": "nl", "en": "en", "fi": "fi", "fr": "fr", "de": "de", "ga": "ga", "el": "el", "he": "he", "hi": "hi", "id": "id", "it": "it", "no": "no", "fa": "fa", "pl": "pl", "pt": "pt", "ru": "ru", "si": "si", "es": "es", "sv": "sv", "th": "th", "tr": "tr", "uk": "uk", "ur": "ur", "vi": "vi", "cy": "cy"},
"lang_key": "#LANG#",
"light": "day",
"name": "HERE Traffic Day",
"profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
"tile_size": 256,
"tile_url": "https://3.traffic.maps.ls.hereapi.com/maptile/2.1/traffictile/newest/normal.traffic.day/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"tile_url": "https://maps.hereapi.com/v3/base/mc/{z}/{x}/{y}/png8?apiKey=#HERE_APIKEY#&ppi=400&size=512&style=lite.day&lang=#LANG#",
"type": "traffic",
"vehicle": "car"
}
4 changes: 2 additions & 2 deletions maps/here_4_traffic_night.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
},
"format": "raster",
"keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang": {"local": "mul", "ar": "ar", "eu": "eu", "ca": "ca", "zh-simpl": "zh", "zh": "zh", "cs": "cs", "da": "da", "nl": "nl", "en": "en", "fi": "fi", "fr": "fr", "de": "de", "ga": "ga", "el": "el", "he": "he", "hi": "hi", "id": "id", "it": "it", "no": "no", "fa": "fa", "pl": "pl", "pt": "pt", "ru": "ru", "si": "si", "es": "es", "sv": "sv", "th": "th", "tr": "tr", "uk": "uk", "ur": "ur", "vi": "vi", "cy": "cy"},
"lang_key": "#LANG#",
"light": "night",
"name": "HERE Traffic Night",
"profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
"tile_size": 256,
"tile_url": "https://3.traffic.maps.ls.hereapi.com/maptile/2.1/traffictile/newest/normal.traffic.night/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"tile_url": "https://maps.hereapi.com/v3/base/mc/{z}/{x}/{y}/png8?apiKey=#HERE_APIKEY#&ppi=400&size=512&style=lite.night&lang=#LANG#",
"style_gui": {
"fg": "white",
"iconVariant": "white",
Expand Down
60 changes: 51 additions & 9 deletions poor/voice.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,44 @@ def make_wav(self, text, fname):
"-l", self.voice_name,
text]) == 0

class VoiceEnginePiper(VoiceEngine):

"""Text-to-speech (TTS) using Piper."""

commands = ["piper"]
description = "Piper"
voices = {
"de": {"female": "de_DE-kerstin-low.onnx", "male": "de_DE-karlsson-low.onnx"},
"en": {"female": "en_US-amy-medium.onnx", "male": "en_US-ryan-medium.onnx"},
"en_GB": {"female": "en_GB-semaine-medium.onnx", "male": "en_GB-northern_english_male-medium.onnx"},
"en_US": {"female": "en_US-amy-medium.onnx", "male": "en_US-ryan-medium.onnx"},
"es": {"male": "es_ES-sharvard-medium.onnx"},
"fr": {"female": "fr_FR-upmc-medium.onnx", "male": "fr_FR-gilles-low.onnx"},
"it": {"female": "it_IT-paola-medium.onnx", "male": "it_IT-riccardo-x_low.onnx"},
}
def make_wav(self, text, fname):
"""Generate voice output to WAV file `fname`."""
text = self.transform_text(text)
cmd = [
self.command,
"--model", f"/app/piper/voices/{self.voice_name}",
"--output_file", fname
]
try:
# Run Piper and pass text via stdin
process = subprocess.Popen(
cmd,
stdin=subprocess.PIPE,
stdout=subprocess.DEVNULL, # Suppress stdout
stderr=subprocess.DEVNULL # Suppress stderr
)
process.communicate(input=text.encode("utf-8"))
return process.returncode == 0
except Exception as e:
print(f"Error generating WAV: {e}")
return False



class VoiceEngineMimicEnUsPirate(VoiceEngine):

Expand Down Expand Up @@ -235,6 +273,7 @@ class VoiceGenerator:

# TTS engines in order of preference.
engines = [
VoiceEnginePiper,
VoiceEngineMimic,
VoiceEngineFlite,
VoiceEnginePicoTTS,
Expand Down Expand Up @@ -374,15 +413,18 @@ def quit(self):
shutil.rmtree(self._tmpdir)

def set_voice(self, language, gender="male"):
"""Set TTS engine and voice to use."""
new = self._find_engine(language, gender)
if self._engine is None and new is None: return
if (self._engine is None or
new is None or
new.__class__ is not self._engine.__class__ or
new.voice_name != self._engine.voice_name):
self._engine = new
self.clean()
"""Set TTS engine and voice to use."""
new = self._find_engine(language, gender)
if self._engine is None and new is None:
print("No suitable TTS engine found for", language, gender)
return
if (self._engine is None or
new is None or
new.__class__ is not self._engine.__class__ or
new.voice_name != self._engine.voice_name):
print(f"Switching TTS engine to {new.description} with voice {new.voice_name}")
self._engine = new
self.clean()

def _update_cache(self):
"""Update the WAV file cache."""
Expand Down