Nachdem schon vor einiger Zeit Amazon die Firma Ivona aufgekauft hat, ist die anerkannt beste TTS-Engine nicht mehr frei zu benutzen (es sei denn, man hat noch eine Beta-Kopie des alten apk-Files...). Wer einen Amazon Web Service Account hat, kann aber problemlos darauf zugreifen.
Zwar gibt es für BOSE Soundtouch ST 10 (und 20,...) in dem BOSE-API eine Verbindung zur Google TTS - aber deren Stimme ist eben nicht ganz so gut, wie die Stimme "Marlene" von Polly/Ivona.
Also 2 Probleme zu lösen:
1. Wie bekommt man einen Text als MP3 von Polly?
2. Wie bekommt man das Audiosystem zum Abspielen dieses MP3-files?
Zu 1: Die Perl-Bindung von Polly ist noch etwas wackelig. Also ein kleines Python-Programm geschrieben, dazu muss das Amazon-Framework boto installiert sein.
Zu 2: Dazu sollte man den miniDLNA-Server installieren (aber bitte Version 1.2.1), als Medienverzeichnis z.B. /home/fhem/tts angeben. Der wird dann in das Audiosystem eingebunden. Problem war bisher, diesen dazu zu bewegen, eine neue Audiodatei auch als solche zu erkennen. Das habe ich inzwischen geknackt: Man muss "nur" eine alte (schon bekannte) Datei, z.B. speech.mp3 löschen und _dann erst_ eine neue Datei dieses Namens anlegen. Das hebelt das eingebaute Caching aus. Also wird das Python-Programm etwas länger:
import sys
import pwd
import grp
import os
import time
import uuid
import boto3
uid = pwd.getpwnam("fhem").pw_uid
gid = grp.getgrnam("dialout").gr_gid
name = '/home/fhem/tts/speech.mp3'
if os.path.exists(name):
os.remove(name)
polly_client = boto3.Session(
aws_access_key_id='-------',
aws_secret_access_key='----------------',
region_name='eu-central-1').client('polly')
ssmltext = '<speak><break time="1s"/>' + sys.argv[1] + '</speak>'
response = polly_client.synthesize_speech(VoiceId='Marlene',
OutputFormat='mp3',
TextType='ssml',
Text = ssmltext)
file = open(name, 'w')
file.write(response['AudioStream'].read())
file.close()
os.chown(name, uid, gid)
Dieses Python-Programm wird einfach aufgerufen mit einer Perl-Routine:
sub speakBOSE($$){
my ($name,$text) = @_;
#-- generate
system("python /opt/fhem/polly/getpolly.py \"$text\"");
sleep(1);
if($name eq "SoundTouchEG"){
fhem("set BOSE_XXXXXXXXXXXXX playTrack speech");
}elsif($name eq "SoundTouchOG"){
fhem("set BOSE_XXXXXXXXXXXXX playTrack speech");
}
}
Das Ganze wird bei mir Bestandteil eines etwas größeren neuen Moduls zur Sprachausgabe werden, mit intelligentem Caching etc.
LG
pah
Hallo
eine kurze Frage: Gibt es das Modul inzwischen und ich hab es übersehen, oder ist es noch in Arbeit?
Viele Grüße
Helmuth