mirror of https://gitlab.com/bashrc2/epicyon
Separate module for speaker client
parent
0f7e6d5e41
commit
43fffd3ddc
96
epicyon.py
96
epicyon.py
|
@ -7,10 +7,8 @@ __email__ = "bob@freedombone.net"
|
||||||
__status__ = "Production"
|
__status__ = "Production"
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import html
|
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
from select import select
|
|
||||||
import time
|
import time
|
||||||
import argparse
|
import argparse
|
||||||
from person import createPerson
|
from person import createPerson
|
||||||
|
@ -78,10 +76,7 @@ from theme import setTheme
|
||||||
from announce import sendAnnounceViaServer
|
from announce import sendAnnounceViaServer
|
||||||
from socnet import instancesGraph
|
from socnet import instancesGraph
|
||||||
from migrate import migrateAccounts
|
from migrate import migrateAccounts
|
||||||
from speaker import getSpeakerFromServer
|
from speaker_client import runSpeakerClient
|
||||||
from speaker import getSpeakerPitch
|
|
||||||
from speaker import getSpeakerRate
|
|
||||||
from speaker import getSpeakerRange
|
|
||||||
|
|
||||||
|
|
||||||
def str2bool(v) -> bool:
|
def str2bool(v) -> bool:
|
||||||
|
@ -1930,91 +1925,10 @@ if args.speaker:
|
||||||
elif args.gnunet:
|
elif args.gnunet:
|
||||||
proxyType = 'gnunet'
|
proxyType = 'gnunet'
|
||||||
|
|
||||||
if args.screenreader == 'espeak':
|
runSpeakerClient(baseDir, session, proxyType, httpPrefix,
|
||||||
print('Setting up espeak')
|
nickname, domain, port, args.password,
|
||||||
from espeak import espeak
|
args.screenreader, args.language,
|
||||||
|
args.debug)
|
||||||
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
|
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
if federationList:
|
if federationList:
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue