1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import hashlib
- import os
- import shutil
- import pygame
- import requests
- import logging
- VOXYGEN_LANGUAGES = dict(
- fr=dict(electra="Electra", emma="Emma", becool="Becool", agnes="Agnes", loic="Loic", fabienne="Fabienne", helene="Helene", marion="Marion", matteo="Matteo",
- melodine="Melodine", mendoo="Mendoo", michel="Michel", moussa="Moussa", philippe="Philippe", sorciere="Sorciere"),
- ar=dict(adel="Adel"),
- de=dict(matthias="Matthias", jylvia="Sylvia"),
- uk=dict(bronwen="Bronwen", elizabeth="elizabeth", judith="Judith", paul="Paul", witch="Witch"),
- us=dict(bruce="Bruce", jenny="Jenny"),
- es=dict(martha="Martha"),
- it=dict(sonia="Sonia"))
- CACHE_PATH = "/tmp/jarvis/tts/voxygen/"
- def say(words=None, voice=None, language=None, cache=None):
- if not os.path.exists(CACHE_PATH):
- os.makedirs(CACHE_PATH)
- sha1 = hashlib.sha1(words).hexdigest()
- voice = get_voice(voice, language)
- tempfile = CACHE_PATH + voice + "." + sha1 + ".tts"
- get_audio(voice, words, tempfile, cache)
- play_audio(tempfile)
- if not cache:
- os.remove(tempfile)
- def get_audio(voice, text, filepath, cache):
- if not cache or not os.path.exists(filepath):
- payload = {
- "method": "redirect",
- "text": text.encode('utf8'),
- "voice": voice
- }
- r = requests.get("https://www.voxygen.fr/sites/all/modules/voxygen_voices/assets/proxy/index.php", params=payload, stream=True)
- logging.debug("Trying to get url: %s response code: %s", r.url, r.status_code)
- if r.status_code == 200:
- with open(os.path.abspath(filepath), "wb") as sound_file:
- sound_file.write(r.content)
- def play_audio(music_file, volume=0.8):
- pygame.mixer.init(16000, -16, 1, 2048)
- pygame.mixer.music.set_volume(volume)
- clock = pygame.time.Clock()
- try:
- pygame.mixer.music.load(music_file)
- logging.debug("Music file {} loaded!".format(music_file))
- except pygame.error:
- os.remove(music_file)
- logging.debug("File {} not found! ({})".format(music_file, pygame.get_error()))
- return
- pygame.mixer.music.play()
- while pygame.mixer.music.get_busy():
- clock.tick(10)
- def get_voice(voice=None, language=None):
- if language in VOXYGEN_LANGUAGES:
- if voice in VOXYGEN_LANGUAGES[language]:
- return VOXYGEN_LANGUAGES[language][voice]
- logging.debug("Cannot find language maching language: %s voice: %s", language, voice)
- return ""
- def wipe_cache():
- shutil.rmtree(CACHE_PATH)
|