===== Rhasspy 2.5.11 statt Snips ===== Nachdem Snips von Sonys gekauft wurde und die Entwicklung geschlossen wurde, läuft mein System seit langem unter raspbian. Inzwischen sind wir aber Generationen weiter und eigentlich sollte man seine Betriebssystem aktuell halten. Also der Versuch, umzusteigen. ==== Rhasspy __Bullseye__ 64bit Stand 12/2022 ==== ibgfortran4 muss man durch libgfortran5 ersetzen; statt onnxruntime-1.6.0 muss man onnxruntime-1.9.1-cp39-cp39-linux_armv7l.whl nehmen; sudo apt-get install libffi6; von phonetisaurus-0.3.0-py3-none-linux_aarch64.whl gibt es die version auf der seite https://github.com/rhasspy/phonetisaurus-pypi/releases; weiter bin ich nicht gekommen, war mir zu kompliziert und in der Tabelle, was danach alles geht oder nicht, war mir das zu wenig ==== Rhasspy __Buster__ 32bit Stand 12/2022 ==== === von Sourcen === nachdem der Installer weder onnxruntime, noch phonetisaurus gefunden hatte, und auch ein fehlendes libcst (Rust?) anmalte, dies runtergeladen bzw. in das Makefile.in integriert (siehe Bullseye 32bit). Nach dem Start dann noch ein markupsafe Import error "ImportError: cannot import name 'soft_unicode' from 'markupsafe'". Beheben mit pip install markupsafe==2.0.1 === mit Docker === ging eigentlich recht problemlos. docker run -d -p 12101:12101 \ --name rhasspy \ --restart unless-stopped \ -v "$HOME/.config/rhasspy/profiles:/profiles" \ -v "/etc/localtime:/etc/localtime:ro" \ --device /dev/snd:/dev/snd \ rhasspy/rhasspy \ --user-profiles /profiles \ --profile de profile in /home/pi/.config/rhasspy docker install von node-red macht probleme. https://www.reddit.com/r/nodered/comments/w73sja/error_after_30_update/; Lösung: docker run --security-opt=seccomp=unconfined -it -p 1880:1880 nodered/node-red Nur wollte ich gerne 'Hey Snips' als WakeWord. Da muss man aber so viel in den Sourcen ändern und das noch im Docker, das habe ich mir dann nicht zugetraut. Daher das Ganze doch über die Sourcen installieren. ==== Rhasspy __Bullseye__ 32bit Stand 12/2022 ==== rhasspy auf bullseye 32bit sudo apt-get update; sudo apt-get dist-upgrade -y; sudo reboot now # wegen kernel-hacks sudo apt-get install \ python3 python3-dev python3-setuptools python3-pip python3-venv \ git build-essential libatlas-base-dev swig portaudio19-dev \ supervisor mosquitto sox alsa-utils libgfortran4 libopenblas-dev \ espeak flite \ perl curl patchelf ca-certificates -y nano .profile ------------- alias activate='. $HOME/rhasspy/.venv/bin/activate' . .profile git clone --recursive https://github.com/rhasspy/rhasspy cd rhasspy/ nano ./rhasspy-tts-larynx-hermes/requirements.txt ------------------------------------------------- larynx~=0.5.0 nano Makefile.in ---------------- unter Dependecies: ONNRXRUNTIME_WHL_FILE = $(DOWNLOAD_DIR)/armv7/onnxruntime-1.7.2-cp39-cp39-linux_armv7l.whl nach install-init: "$(VENV_PYTHON)" -m pip install $(PIP_INSTALL_ARGS) libcst==0.3.23 "$(VENV_PYTHON)" -m pip install $(PIP_INSTALL_ARGS) pip install markupsafe==2.0.1 # https://github.com/aws/aws-sam-cli/issues/3661 $(DO_DOWNLOAD) "$(ONNRXRUNTIME_WHL_FILE)" "https://github.com/synesthesiam/prebuilt-apps/releases/download/v1.0/onnxruntime-1.6.0-cp37-cp37m-linux_armv7l.whl" "$(VENV_PYTHON)" -m pip install $(PIP_INSTALL_ARGS) $(ONNRXRUNTIME_WHL_FILE) auskommentieren: (https://github.com/rhasspy/rhasspy/issues/46) #cp -fR "${srcdir}/rhasspy-server-hermes/web/docs" "$(DESTDIR)$(prefix)/share/rhasspy/" || true # das hat irgendwie nichts bewirkt, obwohl es dorthin gehört #unter .PHONY: larynx #ifeq ($(ENABLE_LARYNX),yes) #larynx: #ifeq ($(LARYNX_ARCH),armv7) #install-larynx: $(PHONETISAURUS_WHEEL) $(ONNXRUNTIME_WHEEL) $(ONNRXRUNTIME_WHL_FILE) #else # LARYNX_ARCH == armv7 #install-larynx: $(PHONETISAURUS_WHEEL) $(ONNRXRUNTIME_WHL_FILE) #endif # LARYNX_ARCH == armv7 #$(ONNRXRUNTIME_WHL_FILE): # $(DO_DOWNLOAD) "$(ONNRXRUNTIME_WHL_FILE)" #"https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux/blob/master/wheels/buster/onnxruntime-1.7.2-cp39-cp39-linux_armv7l.whl" ./configure RHASSPY_LANGUAGE=de --enable-in-place make make install ##(wohl nur bei 64bit, bei 32bit geht es ohne probleme) libgfortran4 durch libgfortran5 ersetzen! ##There is onnxruntime-1.9.1-cp39-cp39-linux_armv7l.whl ##larynx~=1.1.0 ##sudo apt-get install libffi6 ##was macht: sudo apt-get -f install ? chmod +x rhasspy.sh ./rhasspy.sh --profile=de Vom Mac aus geht die Web-Oberfläche nicht - also Chrome genommen. http://192.168.178.58:12101/ Achtung: Dokumentation geht nicht, und der Tipp aus dem [[https://github.com/rhasspy/rhasspy/issues/46|Internet]], im makefile was auszukommentieren hat auch nicht geholfen. Also einfach nicht drauf klicken. ==== Sound und Mikrofon ==== lsusb: Bus 001 Device 005: ID 0d8c:0170 C-Media Electronics, Inc. Fujitsu UC&C USB Value Headset aplay -l: card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones] card 2: Headset [Fujitsu UC&C USB Value Headset], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 alsamixer: Lautstärke auf 2/3; Capture auf 1/3 sudo alsactl store ==== Porcupine und 'Hey Snips' ==== Die Firma hat eine neuere Version als in Rhasspy integriert. Damit auch ein anderes WakeWord Format und zusätzlich braucht man noch einen access key. Das selber generierte WakeWord funktioniert dann auch nur 1-3 Monate!? und man muss es wieder erzeugen lassen und runterladen - was ein Mist! In diesem [[https://community.rhasspy.org/t/picovoice-offline-voice-ai-engine-gets-free-tier-for-up-to-3-users/3328/9|Blog]] wird beschrieben, was genau zu ändern ist. Später kommt dann noch ein diff-file, das aber andere Pfade hat, als bei mir. Folgende Dateien sind zu ändern: nano rhasspy-profile/rhasspyprofile/profiles/defaults.json nano rhasspy-supervisor/rhasspysupervisor/__init__.py nano rhasspy-wake-porcupine-hermes/rhasspywake_porcupine_hermes/__init__.py nano rhasspy-wake-porcupine-hermes/rhasspywake_porcupine_hermes/__main__.py pip3 install pvporcupine==2.1.0 nano /home/pi/.config/rhasspy/profiles/de/profile.json Datei unter /home/pi/.config/rhasspy/profiles/de/porcupine heisst: "hey-snips.ppn" in Datei nano /home/pi/rhasspy/rhasspy-wake-porcupine-hermes/rhasspywake_porcupine_hermes/__init__.py wenn irgend ein Aufruf im Create nicht geht, kommt ein VALUE ERROR oder ein MEMORY ERROR. "wake": { "porcupine": { "access_key": "MQ...==", "keyword_path": "/home/pi/.config/rhasspy/profiles/de/porcupine/hey-snips.ppn", "keywords": ["hey snips"] }, "system": "porcupine" } Nachdem 'hey snips' ja wohl eher englisch ist, habe ich es auf der Website in Englisch trainiert. Das hat den Vorteil, dass man eine bestimmte Datei nicht ersetzen muss. Ist aber auf der Website und auch in dem Blog beschrieben. Ach: Hurra, es geht :) ==== ReSpeaker 2-Mics Pi HAT ==== https://wiki.seeedstudio.com/ReSpeaker_2_Mics_Pi_HAT_Raspberry/ sudo apt-get update git clone https://github.com/Seeed-Projects/seeed-voicecard.git cd seeed-voicecard sudo ./install.sh sudo reboot now Tonausgabe geht nur noch mit "aplay -D sysdefault:CARD=Headphones test.wav", aber Aufnehmen geht mit "arecord -D "plughw:2,0" -f S16_LE -r 16000 -d 5 -t wav test.wav". Auch der speaker-test geht nur mit "speaker-test -D sysdefault:CARD=Headphones" Aber Rhasspy erkennt es wohl sofort, also alles gut, ich habe wohl nen Lauf ;-) ==== Exchangelib ==== Beim Umzug der Exchangelib-Aufrufe kam es zu Problemen, da die cryptography lib jetzt Rust braucht. Dann nehmen wir eben die Letzte, die noch kein Tust brauchte: Version 3.3.2 da aber die im pip-cache genommen wird, muss man den erst löschen. Ach, und dann kam noch der Fehler "ImportError: libxslt.so.1: cannot open shared object file: No such file or directory". Es geht dann mit den Aufrufen: sudo apt-get install libxml2-dev libxslt-dev pip cache purge pip install cryptography==3.3.2 pip install exchangelib ==== Wetter ==== Mit Snips hatte ich ein schönes Wettermodul. Wie ziehe ich das am besten um? Kopieren der wichtigsten Dateien: action-searchWeatherForecast-Wetter.py, weather_logic.py, weather.py und config.ini Da das ganze im Unterordner wetter liegt, findet skills.py es nicht. Dazu in den Unterordner eine leere Datei __init__.py und in skills.py 'from wetter.weather import Weather' Alles mit Hermes und snips auskommentieren. Mit 'sudo raspi-config' locale auf de_DE.utf8 setzen, den default aber sicherheitshalber auf en lassen. Testen mit 'locale -a' In parse_intent_message 'intent = ForecastType.FULL' setzen und nur den letzten request lassen 'requests.append(WeatherRequest(DateType.FIXED, Grain.DAY, datetime.date.today(), intent, self.detail))' Probleme machen die Grain.DAY und so weiter. Dazu jeweils drei Zeilen an den Anfang. from types import SimpleNamespace d = {'DAY': 'day', 'key2': 'value2'} Grain = SimpleNamespace(**d) Nachdem jetzt aber Grain nicht mehr vom Type Grain, sondern vom Type sting ist, muss man auch die Zeile auskommentieren def grain(self, val): #if type(val) is Grain: self.__grain = val Es gab Probleme, dass manchmal 'weather_for_interval' None war (irgendwas mit switch in der Fehlermeldung). Liegt möglicherweise an Uhrzeit oder Local oder was auch immer, denn erst fragt er bis 20:59 ab, aber findet dann erst was um 21:00 Uhr. Habe da einfach eingebaut if weather_for_interval == None: return None Nächstes Problem, den richtigen tag zu übergeben, da snips das im Intent anders übergeben hat. Den nächsten Tag bekommt man, indem man dertag = datetime.date.today() + datetime.timedelta(days=1)