home-assistant: Deploy Piper and Whisper
Piper is the new text-to-speech service for Home Assistant. Whisper is a speech-to-text service. Together, these services, which communicate with Home Assistant via the Wyoming protocol, provide the speech interface to the new Home Assistant Voice Assistant feature.
parent
a7eac14d39
commit
0cbda0fd73
|
@ -27,6 +27,8 @@ The Home Assistant ecosystem consists of these components:
|
|||
* Mosquitto (MQTT server)
|
||||
* Zigbee2MQTT (Zigbee integration)
|
||||
* ZWaveJS2MQTT (ZWave integration)
|
||||
* Piper (Text-to-speech)
|
||||
* Whisper (Speech-to-text)
|
||||
|
||||
Each of these components runs in a container in separate pods within the
|
||||
*home-assistant* namespace.
|
||||
|
@ -121,6 +123,22 @@ StatefulSet with a PersistentVolume Claim.
|
|||
[ZWaveJS2MQTT]: https://github.com/zwave-js/zwavejs2mqtt/
|
||||
|
||||
|
||||
### Piper/Whisper
|
||||
|
||||
[Piper] and [Whisper] provide the text-to-speech and speech-to-text
|
||||
capabilities, respectively, for Home Assistant [Voice Control]. These
|
||||
processes are designed to run as Add-Ons for Home Assistant OS, but work just
|
||||
fine as Kubernetes containers as well.
|
||||
|
||||
Piper and Whisper need mutable storage in order to download their machine
|
||||
learning models. Since the model data are downloaded automatically when the
|
||||
container starts, using ephemeral volumes is sufficient.
|
||||
|
||||
[Piper]: https://github.com/rhasspy/piper
|
||||
[Whisper]: https://github.com/guillaumekln/faster-whisper/
|
||||
[Voice Control]: https://www.home-assistant.io/voice_control/
|
||||
|
||||
|
||||
## Raspberry Pi Node
|
||||
|
||||
While Home Assistant Core and Mosquitto can run on any node in the Kubernetes
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// vim: set sw=4 ts=4 sts=4 et :
|
||||
@startuml
|
||||
|
||||
person User
|
||||
|
@ -12,6 +13,8 @@ cloud Kubernetes {
|
|||
node "Main Node Cluster" {
|
||||
[Home Assistant] as hass
|
||||
queue Mosquitto as mqtt
|
||||
[Piper] as piper
|
||||
[Whisper] as whisper
|
||||
|
||||
database PostgreSQL as postgres
|
||||
}
|
||||
|
@ -37,6 +40,8 @@ cloud Kubernetes {
|
|||
ingress --[#purple]-> mqtt
|
||||
hass -[#teal]-> postgres
|
||||
hass -[#orange]-> zwavejs
|
||||
hass -[#pink]--> piper
|
||||
hass -[#pink]--> whisper
|
||||
hass -[#purple]> mqtt
|
||||
z2m -[#purple]-> mqtt
|
||||
|
||||
|
@ -51,5 +56,6 @@ legend right
|
|||
|<color:teal><&arrow-right></color> | PostgreSQL |
|
||||
|<color:red><&arrow-right></color> | USB |
|
||||
|<color:lightblue><&arrow-right></color> | ESPHome, etc. |
|
||||
|<color:pink><&arrow-right></color> | Wyoming |
|
||||
end legend
|
||||
@enduml
|
||||
|
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 26 KiB |
|
@ -10,6 +10,8 @@ resources:
|
|||
- mosquitto.yaml
|
||||
- zigbee2mqtt.yaml
|
||||
- zwavejs2mqtt.yaml
|
||||
- piper.yaml
|
||||
- whisper.yaml
|
||||
- ingress.yaml
|
||||
|
||||
configMapGenerator:
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: piper
|
||||
app.kubernetes.io/instance: piper
|
||||
app.kubernetes.io/name: piper
|
||||
app.kubernetes.io/part-of: home-assistant
|
||||
name: piper
|
||||
spec:
|
||||
ports:
|
||||
- port: 10200
|
||||
name: wyoming
|
||||
selector:
|
||||
app.kubernetes.io/component: piper
|
||||
app.kubernetes.io/instance: piper
|
||||
app.kubernetes.io/name: piper
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: piper
|
||||
app.kubernetes.io/instance: piper
|
||||
app.kubernetes.io/name: piper
|
||||
app.kubernetes.io/part-of: home-assistant
|
||||
name: piper
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/component: piper
|
||||
app.kubernetes.io/instance: piper
|
||||
app.kubernetes.io/name: piper
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: piper
|
||||
app.kubernetes.io/instance: piper
|
||||
app.kubernetes.io/name: piper
|
||||
app.kubernetes.io/part-of: home-assistant
|
||||
spec:
|
||||
containers:
|
||||
- name: piper
|
||||
image: docker.io/rhasspy/wyoming-piper
|
||||
args:
|
||||
- --voice=en-us-amy-low
|
||||
ports:
|
||||
- containerPort: 10200
|
||||
name: wyoming
|
||||
readinessProbe: &probe
|
||||
tcpSocket:
|
||||
port: 10200
|
||||
failureThreshold: 3
|
||||
periodSeconds: 60
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
startupProbe:
|
||||
<<: *probe
|
||||
failureThreshold: 30
|
||||
periodSeconds: 3
|
||||
initialDelaySeconds: 3
|
||||
securityContext:
|
||||
readOnlyRootFilesystem: true
|
||||
runAsUser: 300
|
||||
runAsGroup: 300
|
||||
volumeMounts:
|
||||
- mountPath: /data
|
||||
name: piper-data
|
||||
subPath: data
|
||||
- mountPath: /tmp
|
||||
name: piper-temp
|
||||
subPath: tmp
|
||||
securityContext:
|
||||
fsGroup: 300
|
||||
volumes:
|
||||
- name: piper-data
|
||||
ephemeral:
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 500Mi
|
||||
- name: piper-temp
|
||||
emptyDir:
|
||||
medium: Memory
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: whisper
|
||||
app.kubernetes.io/instance: whisper
|
||||
app.kubernetes.io/name: whisper
|
||||
app.kubernetes.io/part-of: home-assistant
|
||||
name: whisper
|
||||
spec:
|
||||
ports:
|
||||
- port: 10300
|
||||
name: wyoming
|
||||
selector:
|
||||
app.kubernetes.io/component: whisper
|
||||
app.kubernetes.io/instance: whisper
|
||||
app.kubernetes.io/name: whisper
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: whisper
|
||||
app.kubernetes.io/instance: whisper
|
||||
app.kubernetes.io/name: whisper
|
||||
app.kubernetes.io/part-of: home-assistant
|
||||
name: whisper
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/component: whisper
|
||||
app.kubernetes.io/instance: whisper
|
||||
app.kubernetes.io/name: whisper
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: whisper
|
||||
app.kubernetes.io/instance: whisper
|
||||
app.kubernetes.io/name: whisper
|
||||
app.kubernetes.io/part-of: home-assistant
|
||||
spec:
|
||||
containers:
|
||||
- name: whisper
|
||||
image: docker.io/rhasspy/wyoming-whisper
|
||||
args:
|
||||
- --model=base
|
||||
- --language=en
|
||||
ports:
|
||||
- containerPort: 10300
|
||||
name: wyoming
|
||||
readinessProbe: &probe
|
||||
tcpSocket:
|
||||
port: 10300
|
||||
failureThreshold: 3
|
||||
periodSeconds: 60
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
startupProbe:
|
||||
<<: *probe
|
||||
failureThreshold: 30
|
||||
periodSeconds: 3
|
||||
initialDelaySeconds: 3
|
||||
securityContext:
|
||||
readOnlyRootFilesystem: true
|
||||
runAsUser: 300
|
||||
runAsGroup: 300
|
||||
volumeMounts:
|
||||
- name: whisper-data
|
||||
mountPath: /data
|
||||
subPath: data
|
||||
securityContext:
|
||||
fsGroup: 300
|
||||
volumes:
|
||||
- name: whisper-data
|
||||
ephemeral:
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
|
Loading…
Reference in New Issue