-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathvoice_feedback.py
158 lines (133 loc) · 5.56 KB
/
voice_feedback.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# uses gTTS to provide voice feedback
# author: @omegaui
# github: https://github.com/omegaui/linux-voice-control
# license: GNU GPL v3
import os.path
import random
import sys
import mpv
from gtts import gTTS, gTTSError
from termcolor import cprint
import config_manager
import notifier
internet = False
wroteLiveModeSpeech = False
wroteExecutionSpeech = False
wroteExitingSpeech = False
wroteTranscriptionSpeech = False
player = None
try:
player = mpv.MPV(ytdl=True) # using mpv
except Exception:
cprint("voice feedback requires mpv media player installed on your distro!", "red")
# initialized voice control to check network state
def init():
global internet
internet = check_network()
# handling voice feedback
def speak(text, wait=False):
if not config_manager.config['voice-feedback-enabled']:
return
player.speed = config_manager.config['voice-feedback-speed']
try:
speech = gTTS(text=text, lang='en', slow=False)
speech.save('misc/last-feedback-speech.mp3')
player.play('misc/last-feedback-speech.mp3')
if wait:
player.wait_for_playback()
return speech
except gTTSError as e:
if str(e).find('Failed to connect') >= 0:
player.play('misc/network-error.mp3')
player.wait_for_playback()
print("📢 Network connection is required for voice feedback!", file=sys.stderr)
else:
player.play('misc/internal-voice-feedback-error.mp3')
player.wait_for_playback()
config_manager.config['voice-feedback-enabled'] = False
notifier.notify('Voice-Feedback failed, See logs!', force=True)
print(e)
# internal function to create default voice feedbacks
def _speak_and_save(text, filename):
player.speed = config_manager.config['voice-feedback-speed']
try:
speech = gTTS(text=text, lang='en', slow=False)
speech.save(filename)
except gTTSError as ex:
print(ex)
# voice feedback when a command is executed
def give_execution_feedback():
if len(config_manager.config['voice-feedback-default-speeches']) == 0:
return
global wroteExecutionSpeech
if internet and not wroteExecutionSpeech:
speech = speak(random.choice(config_manager.config['voice-feedback-default-speeches']), wait=True)
if config_manager.config['voice-cache-enabled']:
speech.save('misc/execution-feedback.mp3')
wroteExecutionSpeech = True
elif os.path.exists('misc/execution-feedback.mp3'):
player.speed = config_manager.config['voice-feedback-speed']
player.play('misc/execution-feedback.mp3')
player.wait_for_playback()
# voice feedback when exiting
def give_exiting_feedback():
global wroteExitingSpeech
if internet and not wroteExitingSpeech:
speech = speak(config_manager.config['voice-feedback-turning-off'], wait=True)
if config_manager.config['voice-cache-enabled']:
speech.save('misc/exiting-feedback.mp3')
wroteExitingSpeech = True
elif os.path.exists('misc/exiting-feedback.mp3'):
player.speed = config_manager.config['voice-feedback-speed']
player.play('misc/exiting-feedback.mp3')
player.wait_for_playback()
# voice feedback when initializing live mode
def give_live_mode_feedback():
global wroteLiveModeSpeech
if internet and not wroteLiveModeSpeech:
speech = speak("voice control is running in live mode.", wait=False)
if config_manager.config['voice-cache-enabled']:
speech.save('misc/live_mode-feedback.mp3')
wroteLiveModeSpeech = True
elif os.path.exists('misc/live_mode-feedback.mp3'):
player.speed = config_manager.config['voice-feedback-speed']
player.play('misc/live_mode-feedback.mp3')
# required for live voice control
def give_transcription_feedback():
if len(config_manager.config['voice-feedback-transcription-capable-speeches']) == 0:
return
global wroteTranscriptionSpeech
if config_manager.config['voice-transcription-feedback-enabled']:
if internet and not wroteTranscriptionSpeech:
speech = speak(random.choice(config_manager.config['voice-feedback-transcription-capable-speeches']))
if config_manager.config['voice-cache-enabled']:
speech.save('misc/transcription-feedback.mp3')
wroteTranscriptionSpeech = True
elif os.path.exists('misc/transcription-feedback.mp3'):
player.speed = config_manager.config['voice-feedback-speed']
player.play('misc/transcription-feedback.mp3')
# checks if network is reachable
def check_network():
try:
gTTS(text='checking network connectivity ...', lang='en', slow=False).save('misc/network-test.mp3')
return True
except gTTSError:
return False
# voice greeting
def greet():
if internet:
speech = speak(config_manager.config['greeting'], wait=True)
if config_manager.config['voice-cache-enabled']:
speech.save('misc/greeting.mp3')
else:
player.speed = config_manager.config['voice-feedback-speed']
player.play('misc/greeting.mp3')
player.wait_for_playback()
# generates and saves default voice feedbacks
# network-error-feedback
# internal-exception-feedback
def gen_default_speeches():
_speak_and_save('Connect to a network to use voice feedback.', 'misc/network-error.mp3')
_speak_and_save(
'Some internal error occurred in the voice feedback system, turning off voice feedback for this session!',
'misc/internal-voice-feedback-error.mp3')