From 45e008ec9e0a48a2765fc197a7fc4b0955ddefd5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 4 Mar 2021 10:11:30 +0000 Subject: [PATCH 1/4] Tidying --- speaker.py | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/speaker.py b/speaker.py index 79297298d..e9ec57cd9 100644 --- a/speaker.py +++ b/speaker.py @@ -338,11 +338,13 @@ def getSSMLbox(baseDir: str, path: str, instanceTitle, gender) -def updateSpeaker(baseDir: str, nickname: str, domain: str, - postJsonObject: {}, personCache: {}, - translate: {}, announcingActor: str) -> None: - """ Generates a json file which can be used for TTS announcement - of incoming inbox posts +def _postToSpeakerJson(baseDir: str, nickname: str, domain: str, + postJsonObject: {}, personCache: {}, + translate: {}, announcingActor: str) -> {}: + """Converts an ActivityPub post into some Json containing + speech synthesis parameters. + NOTE: There currently appears to be no standardized json + format for speech synthesis """ if not postJsonObject.get('object'): return @@ -352,8 +354,6 @@ def updateSpeaker(baseDir: str, nickname: str, domain: str, return if not isinstance(postJsonObject['object']['content'], str): return - speakerFilename = \ - baseDir + '/accounts/' + nickname + '@' + domain + '/speaker.json' detectedLinks = [] content = urllib.parse.unquote_plus(postJsonObject['object']['content']) content = html.unescape(content) @@ -397,7 +397,21 @@ def updateSpeaker(baseDir: str, nickname: str, domain: str, announcedHandle = announcedNickname + '@' + announcedDomain content = \ translate['announces'] + ' ' + announcedHandle + '. ' + content - speakerJson = _speakerEndpointJson(speakerName, summary, - content, imageDescription, - detectedLinks, gender) + return _speakerEndpointJson(speakerName, summary, + content, imageDescription, + detectedLinks, gender) + + +def updateSpeaker(baseDir: str, nickname: str, domain: str, + postJsonObject: {}, personCache: {}, + translate: {}, announcingActor: str) -> None: + """ Generates a json file which can be used for TTS announcement + of incoming inbox posts + """ + speakerJson = \ + _postToSpeakerJson(baseDir, nickname, domain, + postJsonObject, personCache, + translate, announcingActor) + speakerFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/speaker.json' saveJson(speakerJson, speakerFilename) From 667bfb938d63f6a594d5ff66d825c7a948900da6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 4 Mar 2021 10:25:36 +0000 Subject: [PATCH 2/4] Separate SSML header --- speaker.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/speaker.py b/speaker.py index e9ec57cd9..61901d2a5 100644 --- a/speaker.py +++ b/speaker.py @@ -263,6 +263,21 @@ def _speakerEndpointJson(displayName: str, summary: str, return speakerJson +def _SSMLheader(systemLanguage: str, instanceTitle: str) -> str: + """Returns a header for an SSML document + """ + return '\n' + \ + '\n' + \ + ' \n' + \ + ' ' + \ + instanceTitle + ' inbox\n' + \ + ' \n' + + def _speakerEndpointSSML(displayName: str, summary: str, content: str, imageDescription: str, links: [], language: str, @@ -289,16 +304,7 @@ def _speakerEndpointSSML(displayName: str, summary: str, content = _addSSMLemphasis(content) voiceParams = 'name="' + displayName + '" gender="' + gender + '"' - return '\n' + \ - '\n' + \ - ' \n' + \ - ' ' + \ - instanceTitle + ' inbox\n' + \ - ' \n' + \ + return _SSMLheader(langShort, instanceTitle) + \ '

\n' + \ ' \n' + \ ' \n' + \ From c3ddbf9b8eb3db495b7afeb04dec1029080cd9f3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 4 Mar 2021 10:34:23 +0000 Subject: [PATCH 3/4] Include post id in speaker endpoint, for viewing or replies --- speaker.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/speaker.py b/speaker.py index 61901d2a5..86569f397 100644 --- a/speaker.py +++ b/speaker.py @@ -248,7 +248,7 @@ def getSpeakerFromServer(baseDir: str, session, def _speakerEndpointJson(displayName: str, summary: str, content: str, imageDescription: str, - links: [], gender: str) -> {}: + links: [], gender: str, postId: str) -> {}: """Returns a json endpoint for the TTS speaker """ speakerJson = { @@ -256,7 +256,8 @@ def _speakerEndpointJson(displayName: str, summary: str, "summary": summary, "say": content, "imageDescription": imageDescription, - "detectedLinks": links + "detectedLinks": links, + "id": postId } if gender: speakerJson['gender'] = gender @@ -403,9 +404,12 @@ def _postToSpeakerJson(baseDir: str, nickname: str, domain: str, announcedHandle = announcedNickname + '@' + announcedDomain content = \ translate['announces'] + ' ' + announcedHandle + '. ' + content + postId = None + if postJsonObject['object'].get('id'): + postId = postJsonObject['object']['id'] return _speakerEndpointJson(speakerName, summary, content, imageDescription, - detectedLinks, gender) + detectedLinks, gender, postId) def updateSpeaker(baseDir: str, nickname: str, domain: str, From 9aa90addf2071a544e1605b50289879879b0f79c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 4 Mar 2021 11:05:45 +0000 Subject: [PATCH 4/4] Allow keypress for speaker client --- epicyon.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/epicyon.py b/epicyon.py index 62f283443..4d3e6dddd 100644 --- a/epicyon.py +++ b/epicyon.py @@ -10,6 +10,7 @@ import os import html import shutil import sys +from select import select import time import argparse from person import createPerson @@ -2009,7 +2010,11 @@ if args.speaker: os.system(speakerCmd) prevSay = speakerJson['say'] - time.sleep(30) + + # wait for a while, or until a key is pressed + rlist, wlist, xlist = select([sys.stdin], [], [], 30) + if rlist: + print("Key pressed..." + str(rlist)) sys.exit() if federationList: