Separate module for speaker client

merge-requests/30/head
Bob Mottram 2021-03-04 13:57:30 +00:00
parent 0f7e6d5e41
commit 43fffd3ddc
2 changed files with 119 additions and 91 deletions

View File

@ -7,10 +7,8 @@ __email__ = "bob@freedombone.net"
__status__ = "Production"
import os
import html
import shutil
import sys
from select import select
import time
import argparse
from person import createPerson
@ -78,10 +76,7 @@ from theme import setTheme
from announce import sendAnnounceViaServer
from socnet import instancesGraph
from migrate import migrateAccounts
from speaker import getSpeakerFromServer
from speaker import getSpeakerPitch
from speaker import getSpeakerRate
from speaker import getSpeakerRange
from speaker_client import runSpeakerClient
def str2bool(v) -> bool:
@ -1930,91 +1925,10 @@ if args.speaker:
elif args.gnunet:
proxyType = 'gnunet'
if args.screenreader == 'espeak':
print('Setting up espeak')
from espeak import espeak
print('Running speaker for ' + nickname + '@' + domain)
prevSay = ''
while (1):
session = createSession(proxyType)
speakerJson = \
getSpeakerFromServer(baseDir, session, nickname, args.password,
domain, port, httpPrefix, True, __version__)
if speakerJson:
if speakerJson['say'] != prevSay:
if speakerJson.get('name'):
nameStr = speakerJson['name']
gender = 'They/Them'
if speakerJson.get('gender'):
gender = speakerJson['gender']
# get the speech parameters
pitch = getSpeakerPitch(nameStr, args.screenreader, gender)
rate = getSpeakerRate(nameStr, args.screenreader)
srange = getSpeakerRange(nameStr)
# say the speaker's name
if args.screenreader == 'espeak':
espeak.set_parameter(espeak.Parameter.Pitch, pitch)
espeak.set_parameter(espeak.Parameter.Rate, rate)
espeak.set_parameter(espeak.Parameter.Range, srange)
espeak.synth(html.unescape(nameStr))
elif args.screenreader == 'picospeaker':
speakerLang = 'en-GB'
if args.language:
if args.language.startswith('fr'):
speakerLang = 'fr-FR'
elif args.language.startswith('es'):
speakerLang = 'es-ES'
elif args.language.startswith('de'):
speakerLang = 'de-DE'
elif args.language.startswith('it'):
speakerLang = 'it-IT'
speakerCmd = 'picospeaker ' + \
'-l ' + speakerLang + \
' -r ' + str(rate) + \
' -p ' + str(pitch) + ' "' + \
html.unescape(nameStr) + '"'
if args.debug:
print(speakerCmd)
os.system(speakerCmd)
time.sleep(2)
# append image description if needed
if not speakerJson.get('imageDescription'):
sayStr = speakerJson['say']
# echo spoken text to the screen
print(html.unescape(nameStr) + ': ' +
html.unescape(speakerJson['say']) + '\n')
else:
sayStr = speakerJson['say'] + '. ' + \
speakerJson['imageDescription']
# echo spoken text to the screen
print(html.unescape(nameStr) + ': ' +
html.unescape(speakerJson['say']) + '\n' +
html.unescape(speakerJson['imageDescription']))
# speak the post content
if args.screenreader == 'espeak':
espeak.synth(html.unescape(sayStr))
elif args.screenreader == 'picospeaker':
speakerCmd = 'picospeaker ' + \
'-l ' + speakerLang + \
' -r ' + str(rate) + \
' -p ' + str(pitch) + ' "' + \
html.unescape(sayStr) + '"'
if args.debug:
print(speakerCmd)
os.system(speakerCmd)
prevSay = speakerJson['say']
# wait for a while, or until a key is pressed
rlist, wlist, xlist = select([sys.stdin], [], [], 30)
if rlist:
break
runSpeakerClient(baseDir, session, proxyType, httpPrefix,
nickname, domain, port, args.password,
args.screenreader, args.language,
args.debug)
sys.exit()
if federationList:

114
speaker_client.py 100644
View File

@ -0,0 +1,114 @@
__filename__ = "speaker_client.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
__version__ = "1.2.0"
__maintainer__ = "Bob Mottram"
__email__ = "bob@freedombone.net"
__status__ = "Production"
import os
import html
import sys
import time
from select import select
from session import createSession
from speaker import getSpeakerFromServer
from speaker import getSpeakerPitch
from speaker import getSpeakerRate
from speaker import getSpeakerRange
def runSpeakerClient(baseDir: str, session, proxyType: str, httpPrefix: str,
nickname: str, domain: str, port: int, password: str,
screenreader: str, systemLanguage: str,
debug: bool) -> None:
"""Runs the screen reader client, which announces new inbox items via TTS
"""
if screenreader == 'espeak':
print('Setting up espeak')
from espeak import espeak
elif screenreader != 'picospeaker':
print(screenreader + ' is not a supported TTS system')
return
print('Running ' + screenreader + ' for ' + nickname + '@' + domain)
prevSay = ''
while (1):
session = createSession(proxyType)
speakerJson = \
getSpeakerFromServer(baseDir, session, nickname, password,
domain, port, httpPrefix, True, __version__)
if speakerJson:
if speakerJson['say'] != prevSay:
if speakerJson.get('name'):
nameStr = speakerJson['name']
gender = 'They/Them'
if speakerJson.get('gender'):
gender = speakerJson['gender']
# get the speech parameters
pitch = getSpeakerPitch(nameStr, screenreader, gender)
rate = getSpeakerRate(nameStr, screenreader)
srange = getSpeakerRange(nameStr)
# say the speaker's name
if screenreader == 'espeak':
espeak.set_parameter(espeak.Parameter.Pitch, pitch)
espeak.set_parameter(espeak.Parameter.Rate, rate)
espeak.set_parameter(espeak.Parameter.Range, srange)
espeak.synth(html.unescape(nameStr))
elif screenreader == 'picospeaker':
speakerLang = 'en-GB'
if systemLanguage:
if systemLanguage.startswith('fr'):
speakerLang = 'fr-FR'
elif systemLanguage.startswith('es'):
speakerLang = 'es-ES'
elif systemLanguage.startswith('de'):
speakerLang = 'de-DE'
elif systemLanguage.startswith('it'):
speakerLang = 'it-IT'
speakerCmd = 'picospeaker ' + \
'-l ' + speakerLang + \
' -r ' + str(rate) + \
' -p ' + str(pitch) + ' "' + \
html.unescape(nameStr) + '"'
if debug:
print(speakerCmd)
os.system(speakerCmd)
time.sleep(2)
# append image description if needed
if not speakerJson.get('imageDescription'):
sayStr = speakerJson['say']
# echo spoken text to the screen
print(html.unescape(nameStr) + ': ' +
html.unescape(speakerJson['say']) + '\n')
else:
sayStr = speakerJson['say'] + '. ' + \
speakerJson['imageDescription']
# echo spoken text to the screen
print(html.unescape(nameStr) + ': ' +
html.unescape(speakerJson['say']) + '\n' +
html.unescape(speakerJson['imageDescription']))
# speak the post content
if screenreader == 'espeak':
espeak.synth(html.unescape(sayStr))
elif screenreader == 'picospeaker':
speakerCmd = 'picospeaker ' + \
'-l ' + speakerLang + \
' -r ' + str(rate) + \
' -p ' + str(pitch) + ' "' + \
html.unescape(sayStr) + '"'
if debug:
print(speakerCmd)
os.system(speakerCmd)
prevSay = speakerJson['say']
# wait for a while, or until a key is pressed
rlist, wlist, xlist = select([sys.stdin], [], [], 30)
if rlist:
break