Merge branch 'master' into wordWrappingEndOfScreenBell
This commit is contained in:
commit
b9a21a7162
54
README.md
54
README.md
@ -1,29 +1,39 @@
|
|||||||
# fenrir (Alfa)
|
# fenrir (Alfa)
|
||||||
An TTY screenreader for Linux.
|
An TTY screenreader for Linux.
|
||||||
Its an early alpha version. You can test it. It is not recommended for production use. If you want to help just let me know.
|
Its an early alpha version. You can test it. It is not recommended for production use. In theorie its not limited to linux. but i currently only provide drivers for that because I have no ohter system here. If you want to help or write drivers to make it work on other systems, just let me know.
|
||||||
|
|
||||||
# requirements
|
# requirements (core)
|
||||||
- linux
|
- linux
|
||||||
- python3
|
- python3
|
||||||
- python-espeak
|
|
||||||
- python-evdev
|
- python-evdev
|
||||||
- loaded uinput kernel module
|
- loaded uinput kernel module
|
||||||
Read permission to the following files:
|
- Read permission to the following files:
|
||||||
/sys/devices/virtual/tty/tty0/active
|
- /sys/devices/virtual/tty/tty0/active
|
||||||
/dev/vcsa[1-64]
|
- /dev/vcsa[1-64]
|
||||||
ReadWrite permission
|
- ReadWrite permission
|
||||||
/dev/input
|
- /dev/input
|
||||||
/dev/uinput
|
- /dev/uinput
|
||||||
|
- speech, sound or braille drivers see "optional (features, drivers)".
|
||||||
|
|
||||||
# optional
|
# optional (features, drivers)
|
||||||
- sox [its used by default in the generic sound driver for playing sound-icons]
|
- "espeak" speech driver:
|
||||||
- speech-dispatcher, python3-speechd [to use the speech-dispatcher driver]
|
- python-espeak
|
||||||
- brltty, python-brlapi [using braille] # (not implemented yet)
|
- "speechd" speech driver:
|
||||||
- gstreamer [soundicons via gstreamer]
|
- speech-dispatcher
|
||||||
- GLib [soundicons via gstreamer]
|
- python-speechd
|
||||||
- python-pyenchant [spell check functionality]
|
- brltty braille driver (not implemented yet, WIP):
|
||||||
- aspell-<language> [your languagedata for spellchecker, english support "aspell-en"]
|
- brltty (configured and running)
|
||||||
- python-daemonize [use fenrir as background service on Unix like systems]
|
- python-brlapi
|
||||||
|
- "generic" sound driver:
|
||||||
|
- sox
|
||||||
|
- "gstreamer" sound driver
|
||||||
|
- gstreamer 1.x
|
||||||
|
- GLib
|
||||||
|
- spellchecker
|
||||||
|
- python-pyenchant
|
||||||
|
- aspell-YourLanguageCode (example aspell-en for us english)
|
||||||
|
- unix daemon:
|
||||||
|
- python-daemonize
|
||||||
|
|
||||||
# installation
|
# installation
|
||||||
- Archlinux: PKGBUILD in AUR
|
- Archlinux: PKGBUILD in AUR
|
||||||
@ -32,5 +42,9 @@ ReadWrite permission
|
|||||||
You can just run the following as root:
|
You can just run the following as root:
|
||||||
cd src/fenrir-package/
|
cd src/fenrir-package/
|
||||||
sudo ./fenrir
|
sudo ./fenrir
|
||||||
Settings are located in the "config" directory.
|
Settings "settings.conf" is located in the "config" directory.
|
||||||
|
Take care that the used drivers in the config matching your installed drivers.
|
||||||
|
By default it uses:
|
||||||
|
- sound driver: generic (via sox, could configured in settings.conf)
|
||||||
|
- speech driver: speechd
|
||||||
|
- braille driver: brltty (WIP)
|
||||||
|
@ -5,7 +5,7 @@ After=systemd-udev-settle.service sound.target
|
|||||||
[Service]
|
[Service]
|
||||||
Type=forking
|
Type=forking
|
||||||
PIDFile=/var/run/fenrir.pid
|
PIDFile=/var/run/fenrir.pid
|
||||||
ExecStart=/usr/bin/fenrir
|
ExecStart=/usr/bin/fenrir-daemon
|
||||||
ExecReload=/usr/bin/kill -HUP $MAINPID
|
ExecReload=/usr/bin/kill -HUP $MAINPID
|
||||||
Restart=always
|
Restart=always
|
||||||
#Group=fenrir
|
#Group=fenrir
|
||||||
|
@ -129,3 +129,8 @@ delaySec=0
|
|||||||
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
||||||
# if delaySec is >0 onMinutes is ignored
|
# if delaySec is >0 onMinutes is ignored
|
||||||
onMinutes=00,30
|
onMinutes=00,30
|
||||||
|
# announce via soundicon
|
||||||
|
announce=True
|
||||||
|
# interrupt current speech for time announcement
|
||||||
|
interrupt=False
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ list=
|
|||||||
|
|
||||||
[time]
|
[time]
|
||||||
# automatic time anouncement
|
# automatic time anouncement
|
||||||
enabled=False
|
enabled=True
|
||||||
# present time
|
# present time
|
||||||
presentTime=True
|
presentTime=True
|
||||||
# present date (on change)
|
# present date (on change)
|
||||||
@ -135,3 +135,7 @@ delaySec=0
|
|||||||
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
||||||
# if delaySec is >0 onMinutes is ignored
|
# if delaySec is >0 onMinutes is ignored
|
||||||
onMinutes=00,30
|
onMinutes=00,30
|
||||||
|
# announce via soundicon (not interrupting)
|
||||||
|
announce=True
|
||||||
|
# interrupt current speech for time announcement
|
||||||
|
interrupt=False
|
||||||
|
@ -135,3 +135,7 @@ delaySec=0
|
|||||||
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
||||||
# if delaySec is >0 onMinutes is ignored
|
# if delaySec is >0 onMinutes is ignored
|
||||||
onMinutes=00,30
|
onMinutes=00,30
|
||||||
|
# announce via soundicon
|
||||||
|
announce=True
|
||||||
|
# interrupt current speech for time announcement
|
||||||
|
interrupt=False
|
||||||
|
@ -85,3 +85,7 @@ delaySec=0
|
|||||||
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
||||||
# if delaySec is >0 onMinutes is ignored
|
# if delaySec is >0 onMinutes is ignored
|
||||||
onMinutes=00,30
|
onMinutes=00,30
|
||||||
|
# announce via soundicon
|
||||||
|
announce=True
|
||||||
|
# interrupt current speech for time announcement
|
||||||
|
interrupt=False
|
||||||
|
BIN
config/sound/default-wav/Announce.wav
Normal file
BIN
config/sound/default-wav/Announce.wav
Normal file
Binary file not shown.
@ -48,3 +48,5 @@ PromotedText='PromotedText.wav'
|
|||||||
mispell='mispell.wav'
|
mispell='mispell.wav'
|
||||||
# the for capital letter
|
# the for capital letter
|
||||||
capital='Caps.wav'
|
capital='Caps.wav'
|
||||||
|
# general announcement
|
||||||
|
announce="Announce.wav"
|
||||||
|
BIN
config/sound/default/Announce.opus
Normal file
BIN
config/sound/default/Announce.opus
Normal file
Binary file not shown.
@ -48,3 +48,5 @@ PromotedText='PromotedText.opus'
|
|||||||
mispell='mispell.opus'
|
mispell='mispell.opus'
|
||||||
# the for capital letter
|
# the for capital letter
|
||||||
capital='Caps.opus'
|
capital='Caps.opus'
|
||||||
|
# general announcement
|
||||||
|
announce="Announce.opus"
|
||||||
|
@ -48,3 +48,5 @@ PromotedText=''
|
|||||||
mispell=''
|
mispell=''
|
||||||
# the for capital letter:
|
# the for capital letter:
|
||||||
capital=''
|
capital=''
|
||||||
|
# general announcement
|
||||||
|
announce=""
|
||||||
|
2
setup.py
2
setup.py
@ -20,7 +20,7 @@ setup(
|
|||||||
# Packages
|
# Packages
|
||||||
packages=find_packages('src/fenrir'),
|
packages=find_packages('src/fenrir'),
|
||||||
package_dir={'': 'src/fenrir'},
|
package_dir={'': 'src/fenrir'},
|
||||||
scripts=['src/fenrir/fenrir'],
|
scripts=['src/fenrir/fenrir','src/fenrir/fenrir-daemon'],
|
||||||
#entry_points = {
|
#entry_points = {
|
||||||
# "console_scripts": ['fenrir = fenrir:main']
|
# "console_scripts": ['fenrir = fenrir:main']
|
||||||
# },
|
# },
|
||||||
|
@ -44,18 +44,28 @@ class command():
|
|||||||
if now.hour == self.lastTime.hour:
|
if now.hour == self.lastTime.hour:
|
||||||
if now.minute == self.lastTime.minute:
|
if now.minute == self.lastTime.minute:
|
||||||
return
|
return
|
||||||
|
dateFormat = self.env['runtime']['settingsManager'].getSetting('general', 'dateFormat')
|
||||||
|
dateString = datetime.datetime.strftime(now, dateFormat)
|
||||||
|
|
||||||
|
presentDate = self.env['runtime']['settingsManager'].getSettingAsBool('time', 'presentDate') and \
|
||||||
|
self.lastDateString != dateString
|
||||||
|
presentTime = self.env['runtime']['settingsManager'].getSettingAsBool('time', 'presentTime')
|
||||||
|
# no changed value to announce
|
||||||
|
if not (presentDate or presentTime):
|
||||||
|
return
|
||||||
timeFormat = self.env['runtime']['settingsManager'].getSetting('general', 'timeFormat')
|
timeFormat = self.env['runtime']['settingsManager'].getSetting('general', 'timeFormat')
|
||||||
timeString = datetime.datetime.strftime(now, timeFormat)
|
timeString = datetime.datetime.strftime(now, timeFormat)
|
||||||
|
|
||||||
dateFormat = self.env['runtime']['settingsManager'].getSetting('general', 'dateFormat')
|
if self.env['runtime']['settingsManager'].getSettingAsBool('time', 'interrupt'):
|
||||||
dateString = datetime.datetime.strftime(now, dateFormat)
|
self.env['runtime']['outputManager'].interruptOutput()
|
||||||
if self.env['runtime']['settingsManager'].getSettingAsBool('time', 'presentTime'):
|
if self.env['runtime']['settingsManager'].getSettingAsBool('time', 'announce'):
|
||||||
|
self.env['runtime']['outputManager'].playSoundIcon('announce')
|
||||||
|
|
||||||
|
if presentTime:
|
||||||
# present the time
|
# present the time
|
||||||
self.env['runtime']['outputManager'].presentText('Autotime: ' + timeString , soundIcon='', interrupt=False)
|
self.env['runtime']['outputManager'].presentText('Autotime: ' + timeString , soundIcon='', interrupt=False)
|
||||||
# and date if changes
|
# and date if changes
|
||||||
if self.env['runtime']['settingsManager'].getSettingAsBool('time', 'presentDate'):
|
if presentDate:
|
||||||
if self.lastDateString != dateString:
|
|
||||||
self.env['runtime']['outputManager'].presentText(dateString , soundIcon='', interrupt=False)
|
self.env['runtime']['outputManager'].presentText(dateString , soundIcon='', interrupt=False)
|
||||||
self.lastDateString = dateString
|
self.lastDateString = dateString
|
||||||
self.lastTime = datetime.datetime.now()
|
self.lastTime = datetime.datetime.now()
|
||||||
|
@ -70,6 +70,8 @@ settings = {
|
|||||||
'presentDate': True,
|
'presentDate': True,
|
||||||
'delaySec': 0,
|
'delaySec': 0,
|
||||||
'onMinutes': '00,30',
|
'onMinutes': '00,30',
|
||||||
|
'announce': True,
|
||||||
|
'interrupt': False,
|
||||||
},
|
},
|
||||||
'keyboard':{
|
'keyboard':{
|
||||||
'driver': 'evdev',
|
'driver': 'evdev',
|
||||||
|
Loading…
Reference in New Issue
Block a user