Sprachausgabe mit Amazon Polly auf Audiosystemen

Begonnen von Prof. Dr. Peter Henning, 24 März 2019, 11:53:17

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

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

Helmuth

Hallo

eine kurze Frage: Gibt es das Modul inzwischen und ich hab es übersehen, oder ist es noch in Arbeit?

Viele Grüße

Helmuth
Wer einen Tippfehler findet darf ihn behalten.