Changes for Porcupine V 2.0.1
Replace in
/usr/lib/rhasspy/rhasspy-profile/rhasspyprofile/profiles/defaults.json
“porcupine”: {
“compatible”: true,
“keyword_path”: “porcupine.ppn”,
“sensitivity”: 0.5,
“udp_site_info”: {}
},
with
“porcupine”: {
“compatible”: true,
“keyword_path”: “porcupine.ppn”,
“sensitivity”: 0.5,
“udp_site_info”: {},
“access_key”: “”
},
Replace in
/usr/lib/rhasspy/rhasspy-supervisor/rhasspysupervisor/init.py
if wake_system == "porcupine":
keyword = profile.get("wake.porcupine.keyword_path") or "porcupine.ppn"
if not keyword:
_LOGGER.error("wake.porcupine.keyword_path required")
return []
sensitivity = profile.get("wake.porcupine.sensitivity", "0.5")
wake_command = [
"rhasspy-wake-porcupine-hermes",
"--keyword",
shlex.quote(str(keyword)),
"--sensitivity",
str(sensitivity),
"--keyword-dir",
shlex.quote(str(write_path(profile, "porcupine"))),
]
with
if wake_system == “porcupine”:
keyword = profile.get(“wake.porcupine.keyword_path”) or “porcupine.ppn”
if not keyword:
_LOGGER.error(“wake.porcupine.keyword_path required”)
return []
sensitivity = profile.get("wake.porcupine.sensitivity", "0.5")
access_key = profile.get("wake.porcupine.access_key")
wake_command = [
"rhasspy-wake-porcupine-hermes",
"--keyword",
shlex.quote(str(keyword)),
"--sensitivity",
str(sensitivity),
"--access_key",
str(access_key),
"--keyword-dir",
shlex.quote(str(write_path(profile, "porcupine"))),
]
Replace in
/usr/lib/rhasspy/rhasspy-wake-porcupine-hermes/rhasspywake_porcupine_hermes/init.py
replace
def __init__(
self,
client,
model_ids: typing.List[str],
wakeword_ids: typing.List[str],
sensitivities: typing.List[float],
keyword_dirs: typing.Optional[typing.List[Path]] = None,
site_ids: typing.Optional[typing.List[str]] = None,
sample_rate: int = 16000,
sample_width: int = 2,
channels: int = 1,
udp_audio: typing.Optional[typing.List[typing.Tuple[str, int, str]]] = None,
udp_chunk_size: int = 2048,
udp_raw_audio: typing.Optional[typing.Iterable[str]] = None,
udp_forward_mqtt: typing.Optional[typing.Iterable[str]] = None,
lang: typing.Optional[str] = None,
):
with
def __init__(
self,
client,
model_ids: typing.List[str],
wakeword_ids: typing.List[str],
sensitivities: typing.List[float],
access_key: str = "",
keyword_dirs: typing.Optional[typing.List[Path]] = None,
site_ids: typing.Optional[typing.List[str]] = None,
sample_rate: int = 16000,
sample_width: int = 2,
channels: int = 1,
udp_audio: typing.Optional[typing.List[typing.Tuple[str, int, str]]] = None,
udp_chunk_size: int = 2048,
udp_raw_audio: typing.Optional[typing.Iterable[str]] = None,
udp_forward_mqtt: typing.Optional[typing.Iterable[str]] = None,
lang: typing.Optional[str] = None,
):
replace
self.subscribe(AudioFrame, HotwordToggleOn, HotwordToggleOff, GetHotwords)
self.wakeword_ids = wakeword_ids
self.model_ids = model_ids
self.sensitivities = sensitivities
self.keyword_dirs = keyword_dirs or []
with
self.subscribe(AudioFrame, HotwordToggleOn, HotwordToggleOff, GetHotwords)
self.wakeword_ids = wakeword_ids
self.model_ids = model_ids
self.sensitivities = sensitivities
self.access_key = access_key
self.keyword_dirs = keyword_dirs or []
replace
def detection_thread_proc(self, site_info: SiteInfo):
"""Handle WAV audio chunks."""
try:
if site_info.porcupine is None:
_LOGGER.debug("Loading porcupine for %s", site_info.site_id)
site_info.porcupine = pvporcupine.create(
keyword_paths=[str(kw) for kw in self.model_ids],
sensitivities=self.sensitivities,
)
with
def detection_thread_proc(self, site_info: SiteInfo):
"""Handle WAV audio chunks."""
try:
if site_info.porcupine is None:
_LOGGER.debug("Loading porcupine for %s", site_info.site_id)
_LOGGER.debug("access_key %s", self.access_key)
for kw in self.model_ids:
_LOGGER.debug("kw %s", kw)
site_info.porcupine = pvporcupine.create(
keyword_paths=[str(kw) for kw in self.model_ids],
sensitivities=self.sensitivities,
access_key=self.access_key,
)
Replace in /usr/lib/rhasspy/rhasspy-wake-porcupine-hermes/rhasspywake_porcupine_hermes/main.py
def main():
“”“Main method.”""
parser = argparse.ArgumentParser(prog=“rhasspy-wake-porcupine-hermes”)
parser.add_argument(
“–keyword”,
required=True,
action=“append”,
help=“Path(s) to one or more Porcupine keyword file(s) (.ppn)”,
)
parser.add_argument(
“–keyword-dir”,
action=“append”,
default=[],
help=“Path to directory with keyword files”,
)
with
def main():
“”“Main method.”""
parser = argparse.ArgumentParser(prog=“rhasspy-wake-porcupine-hermes”)
parser.add_argument(
“–keyword”,
required=True,
action=“append”,
help=“Path(s) to one or more Porcupine keyword file(s) (.ppn)”,
)
parser.add_argument(
“–access_key”,
required=True,
action=“append”,
help=“access_key”,
)
parser.add_argument(
“–keyword-dir”,
action=“append”,
default=[],
help=“Path to directory with keyword files”,
)
replace
# Listen for messages
client = mqtt.Client()
hermes = WakeHermesMqtt(
client,
args.keyword,
keyword_names,
sensitivities,
keyword_dirs=args.keyword_dir,
udp_audio=udp_audio,
udp_raw_audio=args.udp_raw_audio,
udp_forward_mqtt=args.udp_forward_mqtt,
site_ids=args.site_id,
lang=args.lang,
)
with
# Listen for messages
akey = args.access_key[0]
client = mqtt.Client()
hermes = WakeHermesMqtt(
client,
args.keyword,
keyword_names,
sensitivities,
keyword_dirs=args.keyword_dir,
udp_audio=udp_audio,
udp_raw_audio=args.udp_raw_audio,
udp_forward_mqtt=args.udp_forward_mqtt,
site_ids=args.site_id,
lang=args.lang,
access_key=akey,
)
Put your custom created ppn file to /home/pi/.config/rhasspy/lang/porcupine/
Edit your config file and add
“wake”: {
“porcupine”: {
“keyword_path”: “put your ppn file name here”,
“access_key”: “put Your Access_Key here”
},
“system”: “porcupine”
}
Install german params modell:
cd /usr/lib/rhasspy/usr/local/lib/python3.7/site-packages/pvporcupine/lib/common
sudo wget https://github.com/Picovoice/porcupine/raw/master/lib/common/porcupine_params_de.pv
sudo rm porcupine_params.pv
sudo mv ./porcupine_params_de.pv ./porcupine_params.pv
Start rhasspy and test
rhasspy –profile de
btw.: PVP2.0.1 needs internet for access key activation
Code isn’t build perfect - it’s a proof of concept.
Im trying to get the “etwas speziellen²” Matrix Voice Leds to work. If they will work i will write here.
Have fun
Andreas
“²etwas speziellen”=“fuc**ng”