Partage d'expérience avec le système de reconnaissance vocale Speech-to-phrase!

Bonjour la communauté, je vois que le sujet Projet voice control a été fermé et trouve cela dommage, car j’ai l’impression que les choses bougent enfin sur le terrain de la commande vocale 100% traitée en local!

Utilisateur de Home Assistant depuis un bon moment, j’avais tenté l’expérience Rhasppy il y a quelques années et autant dire qu’il m’avait franchement déçu, j’avais donc laissé tomber et m’étais rabattu sur alexa et son copain google, la première répondant au final davantage à mes besoins somme toute assez simples, à base d’interrupteurs, de streaming audio et de listes de courses à remplir dans Bring!…
Rien de bien sorcier au final et je me suis donc dit que des progrès avaient peut-être été réalisés du côté de l’open source et sans forcément recourir à des LLM gourmands en ressources et franchement overkill pour mes usages.

J’ai donc installé Piper, openwakeword, speech to phrase et Music Assistant en containers docker, les trois premiers interfacés à Home Assistant (également en docker sur un autre serveur local) via l’intégration Wyoming Protocol.
Résultat, la reconnaissance vocale fr du STT speech-to-phrase est assez épatante, rien à voir avec whisper et ses élucubrations sans queue ni tête qui me rendaient fou..! Sorti de l’anglais, ce truc n’est vraiment pas utilisable ou en tout cas, peu pertinent dans un usage avec Home Assistant…

N’ayant pas d’Atom Echo, ESP32 S3 Box 3, nabu casa ou Satellite1, j’ai ensuite installé View Assist companion App sur une vieille tablette, avec les intégrations HA View Assist companion app et View Assist, ceci afin de tester les wake words. Là encore, agréablement surpris du résultat même si View Assist est pour le moment très limité en wake words et je n’ai pas l’impression que l’on puisse en ajouter, il y a les classiques Jarvis, Mycroft, Rhasppy, Alexa et bien sûr, OK Nabu… Moi qui avait ajouté Hey potato à la liste, ce sera peut-être pour plus tard.

Quelques customisations plus tard, comme un fichier yaml de custom-sentences contenant des dizaines de todo-items pour pouvoir dire “ajoute du beurre salé à la liste de courses”, diverses radios FIP ainsi que ma médiathèque Jellyfin dans Music Assistant et je me retrouve avec sensiblement le même usage que j’avais d’Amazon Alexa.

Voilà où j’en suis, encore une fois, speech to phrase n’est pas conçu pour autre chose que la gestion d’une installation Home Assistant, on ne peut rien lui demander qui sorte des clous pré programmés dans ses dizaines de fichiers yaml “sentences”, mais il est du coup assez facile de l’étoffer avec ses propres commandes, ou juste retranscrire en français celles qui manquent par rapport aux commandes anglaises, plus nombreuses. Par exemple, la phrase d’ajout d’items à une liste n’existe pas dans le fichier sentences français, alors qu’elle est bien présente en english!
J’ai donc bricolé un truc qui me convient mais qui, je pense, ne peut pas vraiment être proposé en PR sur le github (voir plus bas).

Je me demandais donc si d’autres personnes avaient testé speech to phrase, depuis 1 mois ou deux ou si vous aviez arrêté les frais avant de devenir fou à hurler des commandes incomprises par whisper…

Il serait intéressant de partager nos sentences en français et de participer à l’amélioration des commandes existantes sur le github speech-to-phrase!

Je commence donc par ma modeste custom sentence pour l’ajout d’items à une liste via speech-to-phrase, à placer dans un dossierqui lui soit accessible et indiqué via le compose du container, par exemple.

language: "fr"
intents:
  ExtraSentencesFR:
    data:
      - sentences:
          - "ajoute[r] [du|de la|des] {todo_item} à [la|ma] liste {name}"
          - "ajoute[r] [du|de la|des] {todo_item} à [la|ma] liste"
          - "met[s] [du|de la|des] {todo_item} [dans|à] {name}"
          - "ajoute [dans|à] {name} [du|de la|des] {todo_item}"
        domains:
          - "todo"


Grâce à ça et au blueprint d’Alfriedo, je peux synchroniser l’ajout de pommes, de poires et de scoubidous à Bring! et Kitchenowl (penser à installer leurs intégrations respectives).
Ah, et aussi, dans le même dossier custom-sentences/fr, pensez à éditer un yaml contenant un énorme listing de tous les termes que vous prévoyez d’ajouter à vos listes (pommes, poires, scoubidous…), c’est la contrepartie d’avoir un système local sans LLM…

1 « J'aime »

Je vous mets aussi mon yaml de todo-items, toujours à placer dans le dossier custom-sentences/fr de Speech-to-phrase et à étoffer au fur et à mesure des besoins… Il a été alimenté à la va-vite par Le Chat, mais ça fait une base!
EDIT: nouvelle version un peu nettoyée et étoffée.

language: "fr"
lists:
  todo_item:
    values:
      - "Abricots"
      - "Abricots secs"
      - "Adoucissant"
      - "Aiguillettes de boeuf"
      - "Aiguillettes de poulet"
      - "Ail"
      - "Alcools à fruits"
      - "Allume feu"
      - "Amandes"
      - "Ananas"
      - "Apéritif"
      - "Après rasage"
      - "Artichauts"
      - "Assouplissant"
      - "Asperges"
      - "Aubergines"
      - "Avocats"
      - "Bacon"
      - "Baguette"
      - "Bar"
      - "Basilic"
      - "Beurre"
      - "Beurre de cacaouette"
      - "Beurre demi-sel"
      - "Beurre doux"
      - "Beurre salé"
      - "Betteraves"
      - "Bifteck"
      - "Bière"
      - "Biscuits"
      - "Biscuits salés"
      - "Biscottes"
      - "Blanc de poulet"
      - "Blanc de veau"
      - "Blé dur"
      - "Blinis"
      - "Bloc note"
      - "Boeuf"
      - "Boisson gazeuse"
      - "Boissons"
      - "Boite de tomates"
      - "Bougies"
      - "Bouillon de boeuf"
      - "Bouillon de légumes"
      - "Bouillon de poule"
      - "Bouillon cube"
      - "Boulgour"
      - "Bretzel"
      - "Brocolis"
      - "Cacao"
      - "Câpres"
      - "Cacahuètes"
      - "Cajou"
      - "Calamars"
      - "Camembert"
      - "Canard"
      - "Cannelle"
      - "Carottes"
      - "Cassonade"
      - "Cassis"
      - "Catisfaction"
      - "Céleri"
      - "Céleri branche"
      - "Cerises"
      - "Champagne"
      - "Champignons"
      - "Champignons chinois"
      - "Champignons de Paris"
      - "Chapelure"
      - "Chips"
      - "Chocolat"
      - "Chocolat au lait"
      - "Chocolat blanc"
      - "Chocolat en poudre"
      - "Chocolat noir"
      - "Choucroute"
      - "Chou"
      - "Chou chinois"
      - "Chou-fleur"
      - "Chou rouge"
      - "Choux de Bruxelles"
      - "Cidre"
      - "Ciboulette"
      - "Cirage"
      - "Citrons"
      - "Citrouille"
      - "Clémentines"
      - "Coeur de palmier"
      - "Coques"
      - "Colin"
      - "Compote"
      - "Concombres"
      - "Confit de canard"
      - "Confiture"
      - "Coriandre"
      - "Cornichons"
      - "Côte de boeuf"
      - "Côtes d’agneau"
      - "Côtes de porc"
      - "Côtelettes d'agneau"
      - "Courge"
      - "Courgettes"
      - "Crayons à papier"
      - "Crayons de couleur"
      - "Crevettes"
      - "Crème"
      - "Crème fraîche"
      - "Crème liquide"
      - "Croissants"
      - "Croque monsieur"
      - "Croûton"
      - "Cumin"
      - "Curry"
      - "Céréales"
      - "Dattes"
      - "Dentifrice"
      - "Dinde"
      - "Dorade"
      - "Eau gazeuse"
      - "Eau minérale"
      - "Eau plate"
      - "Emmental"
      - "Endives"
      - "Entrecôte"
      - "Échalotes"
      - "Échine de porc"
      - "Écrevisses"
      - "Épinards"
      - "Escalope de veau"
      - "Escalopes de dinde"
      - "Étiquettes"
      - "Farine"
      - "Faisselle"
      - "Faux-filet de bœuf"
      - "Feuilles de brick"
      - "Feta"
      - "Figues"
      - "Figues sèches"
      - "Filet de poulet"
      - "Filet mignon"
      - "Foie"
      - "Foie de volaille"
      - "Foie gras"
      - "Framboises"
      - "Fraises"
      - "Frites"
      - "Fromage"
      - "Fromage à tartiner"
      - "Fromage blanc"
      - "Fruit de la passion"
      - "Fruits au sirop"
      - "Galettes"
      - "Gambas"
      - "Gazpacho"
      - "Gel douche"
      - "Gésiers de canard"
      - "Gigot d’agneau"
      - "Gingembre"
      - "Gingembre confit"
      - "Glaces"
      - "Gomme"
      - "Grenade"
      - "Gruyère"
      - "Groseilles"
      - "Guacamole"
      - "Hareng fumé"
      - "Haricots rouges"
      - "Haricots verts"
      - "Herbes de Provence"
      - "Homard"
      - "Hot-dog"
      - "Huile"
      - "Huile de colza"
      - "Huile de sésame"
      - "Huile d’olive"
      - "Huile de tournesol"
      - "Huîtres"
      - "Jambon"
      - "Jambon blanc"
      - "Jambon cuit"
      - "Jambon cru"
      - "Jambon de volaille"
      - "Jambon fumé"
      - "Jarret"
      - "Jus de fruits"
      - "Jus de pomme"
      - "Jus de raisin"
      - "Jus d’orange"
      - "Kakis"
      - "Ketchup"
      - "Kiwis"
      - "Lait d’amande"
      - "lait de coco"
      - "Lait de soja"
      - "Lait demi-écrémé"
      - "Lait entier"
      - "Lard"
      - "Lard fumé"
      - "Lardons"
      - "Lardons fumés"
      - "Légumes"
      - "Lessive"
      - "Lentilles"
      - "Levure chimique"
      - "Litière"
      - "Litchi"
      - "Maïs"
      - "Macédoine"
      - "Magret de canard"
      - "Mandarines"
      - "Mangues"
      - "Margarine"
      - "Mascarpone"
      - "Maquereaux"
      - "Melons"
      - "Menthe"
      - "Merguez"
      - "Miel"
      - "Millet"
      - "Mini-feuilletés"
      - "Mirabelle"
      - "Miso"
      - "Mozzarella"
      - "Mouchoirs"
      - "Moules"
      - "Moutarde"
      - "Mouton"
      - "Muesli"
      - "Mûres"
      - "Myrtilles"
      - "Navets"
      - "Nectarines"
      - "Noisettes"
      - "Noix"
      - "Noix de cajou"
      - "Noix de coco"
      - "Noix de coco râpée"
      - "Nuggets de poulet"
      - "Oignons"
      - "Olives"
      - "Oranges"
      - "Orge"
      - "Origan"
      - "Œufs"
      - "Œufs de poisson"
      - "Pain aux céréales"
      - "Pain complet"
      - "Pain de mie"
      - "Papier à lettre"
      - "Papier cadeau"
      - "Papier toilette"
      - "Parmesan"
      - "Pastèque"
      - "Pâte à tartiner"
      - "Pâte d’amande"
      - "Pâte de curry"
      - "Pâte de tomate"
      - "Pâte feuilletée"
      - "Pâtes"
      - "Pâtes à tarte"
      - "Pâtes chinoises"
      - "Pâtes fraîches"
      - "Patates douces"
      - "Patates"
      - "Pâté de campagne"
      - "Pâté de foie"
      - "Pâtée pour chat"
      - "Pâtisseries"
      - "Paupiettes de veau"
      - "Pêches"
      - "Persil"
      - "Petit salé"
      - "Petits pois"
      - "Petits pots bébé"
      - "Petits suisses"
      - "Pigeon"
      - "Piles"
      - "Piment"
      - "Pintade"
      - "Pistaches"
      - "Pizza"
      - "Plats cuisinés"
      - "Plats exotiques"
      - "Poireaux"
      - "Poires"
      - "Poisson"
      - "Poissons panés"
      - "Poivre"
      - "Polenta"
      - "Pomelo"
      - "Pommes"
      - "Pommes de terre"
      - "Pop-corn"
      - "Potimarron"
      - "PQ"
      - "Produit vaisselle"
      - "Poulpe"
      - "Poulet"
      - "Pringles"
      - "Purée d’amande"
      - "Purée en flocons"
      - "Quenelles"
      - "Quiche lorraine"
      - "Quiches"
      - "Quinoa"
      - "Radis"
      - "Radis noir"
      - "Radis roses"
      - "Raie"
      - "Raisin"
      - "Raisins secs"
      - "Raviolis"
      - "Ricoré"
      - "Rillettes"
      - "Rhum"
      - "Riz"
      - "Roquefort"
      - "Rosbif"
      - "Rôti de bœuf"
      - "Rôti de porc"
      - "Rôti de veau"
      - "Rôti fumé"
      - "Rumsteck"
      - "Saint agur"
      - "Saucisse de Mortau"
      - "Saucisse de Toulouse"
      - "Saucisses"
      - "Saucisson"
      - "Saucisson à l'ail"
      - "Saucisson sec"
      - "Sauce d'huître"
      - "Sauce maggi"
      - "Sauce nuoc mam"
      - "Sauce piquante"
      - "Sauce salade"
      - "Sauce soja"
      - "Sauce tomate"
      - "Savon"
      - "Semoule"
      - "Sésame"
      - "Shampoing"
      - "Shitaké"
      - "Sirop"
      - "Soda"
      - "Sorbets"
      - "Soupe de Poissons"
      - "Soupe en brique"
      - "Steak haché"
      - "Surimi"
      - "Surligneur"
      - "Taboulé"
      - "Tahini"
      - "Taille-crayon"
      - "Tarama"
      - "Tarte aux pommes"
      - "Thé"
      - "Thon"
      - "Timbres"
      - "Tisane"
      - "Toastinettes"
      - "Tomates"
      - "Tomates en boite"
      - "Topinambours"
      - "Truite"
      - "Trombones"
      - "Tsatsiki"
      - "Veau"
      - "Vinaigre"
      - "Vinaigre de riz"
      - "Vin"
      - "Vin blanc"
      - "Vin rouge"
      - "Vodka"
      - "Volailles"
      - "Whiskas"
      - "Whisky"
      - "Yaourts"
      - "Yaourts aux fruits"
      - "Yaourts nature"

Merci pour le partage ! :+1:

J’épingle ton sujet et je le reconsulterai quand je me remettrais sur le sujet

Avec plaisir, si besoin, voici un bête docker compose contenant les 3 services nécessaires, le TTS Piper, le STT speech-to-phrase et openwakeword; pour ceux qui, comme moi, n’utilisent pas HAOS.

services:
  wyoming-piper:
    image: rhasspy/wyoming-piper
    ports:
      - 10200:10200
      - 5000:5000
    volumes:
      - /path/to/piper/data:/data
    command: --voice fr_FR-upmc-medium #à remplacer par la voix de votre choix, sinon utiliser l'une de celles déjà disponibles par défaut
    restart: unless-stopped

  wyoming-openwakeworld:
    image: rhasspy/wyoming-openwakeword
    ports:
      - 10400:10400
    volumes:
      - /path/to/openwakeworld/custom/models:/custom #le répertoire contenant vos propres wake words, au format *.tflite
    command: --custom-model-dir /custom
    restart: unless-stopped

  speech-to-phrase:
    image: rhasspy/wyoming-speech-to-phrase
    container_name: speech-to-phrase
    ports:
      - 10300:10300
    volumes:
      - /path/to/speech-to-phrase/custom_sentences:/custom_sentences #le répertoire dans lequel vous déposerez vos propres sentences, au format *.yaml
      - /path/to/speech-to-phrase/models:/models
      - /path/to/speech-to-phrase/train:/train
    command:
      --hass-websocket-uri 'ws://homeassistant.local:8123/api/websocket'
      --hass-token 'votre_token_généré_dans_Home_Assistant'
      --retrain-on-start #permet de prendre en compte vos modifications de sentences à chaque redémarrage du container
      --custom-sentences-dir '/custom_sentences'
#      --debug #utile pour vérifier que vos modifications sont correctement formatées et ne provoquent pas d'erreur 
    restart: unless-stopped
1 « J'aime »