Como vocês têm a configuração da Voz em PT-PT?

Boa tarde,

Hoje fui à Mauser comprar o Assistente de Voz Okay Nabu e estava a tentar o integrar totalmente de forma local mas está a ser uma luta.

A minha ideia seria de usar o Speech-to-text local e, se necessário, usar a OpenAI para responder àquelas perguntas mais complexas.

O problema parece ser mesmo o faster-whisper não ser bom para pt-pt. A taxa de sucesso é de 2/10 o que não é aceitável, só mesmo falando calmamente e perto dos micros é que percebe qualquer coisa.
Entretanto experimentei o speech-to-text da cloud da Nabu Casa (Home Assistant Cloud) e parece funcionar perfeitamente! Mesmo ao longe ele percebe tudo. Solução ideal mas infelizmente é paga e não muito eficiente estar a enviar voz para a cloud tendo capacidade local de a processar.

Com isto, gostaria de saber como estão a configurar a voz nos vossos sistemas?

  1. Qual o vosso Speech-to-text para pt-pt?
  2. Conseguem correr tudo localmente?
  3. Qual o melhor Speech-to-text na vossa opinião?
  4. Quais as vozes que usam?
  5. Que entidades estão a usar como agente para os comandos de voz?
  6. Usam apenas Alias para as vossas entidades?

Agradeço desde já qualquer partilha de experiências ou sugestões para melhorar a integração local deste sistema. Fico a aguardar as vossas opiniões!

1 Curtiu

yah! infelizmente tive o mesmo problema… comprei o raspberry pi com o hat de microfones, e com o fast-wisper, piper e local AI no servidor com GPU e mesmo assim a taxa de sucesso é algo como o que tu tens, por isso suspeito que seja mesmo o modelo.

PS: queria debruçar me sobre isto e treinar um novo modelo com uma voz diferente da do tugão mas enquanto não for para a minha casa não posso fazer isto.

eu quero algo assim
este YouTuber é que está a desenvolver isto com outras pessoas e penso que nos próximos tempos deverá lançar um produto completo (satélite e local AI).

1 Curtiu

Eu instalei o VOSK addon e funciona bem melhor que o Faster Whisper. Experimentem: https://github.com/rhasspy/hassio-addons

1 Curtiu

não conhecia este addon :wink:

Isso funciona bem mas tens de subscrever o nabu casa. Se tentares usar sem o nabu casa, o assistente de voz demora a responder.
Eu estou a google generative AI.

Pois, é o que estou a usar neste momento.

Ainda não tive tempo, mas penso que será possível usar os serviços STT e TTS da Microsoft Azure de forma gratuita até a um certo limite.

Quando tiver novidades darei a minha opinião.

EDIT: Alguém já experimentar o Whisper (não o Fast-Whisper)?

Eu para já só tenho o TTS (text-to-speech), uso e abuso disto…

Tenho um tablet/kiosk (wall mounted tablet) que vai relatando algumas coisas importantes, como quando a máquina de lavar ou secar terminam, quando detecta movimento em algumas zonas ou quando abro/fecho portas ou o portão da garagem, etc… dá IMENSO jeito.

Já experimentei o Fast-Whisper + PIPER, mas a experiencia foi horrível, não conseguia compreender os comandos em pt-pt, mesmo em inglês só metade deles.

Tentei instalar o Ollama num docker na máquina onde corro o HA, mas queixa-se que não tenho memória suficiente para correr (nem mesmo os modelos mais pequenos), fica para uma próxima…

Atualmente tenho o “Google Generative AI” configurado mas só para algumas situações muito pontuais, não lhe vejo muita utilidade sem o reconhecimento de voz.
(ex: coloquei a IA a criar uma mensagem com ironia para quando alguém abre a porte da cozinha ou da sala, com o aquecimento ligado… só para divertimento das visitas… lol), depois isto é dito pelo TTS, como a mensagem é diferente de todas as vezes, torna-se divertido… fora isto, não lhe vejo, para já utilidade.

ahh, tentei colocar a IA a dizer a meteorologia de manhã ao acordar, mas ele/ela teima em inventar larguete… nunca certou uma… não sei porque não consegue “ler” a meteorologia… desisti

Espero ter ajudado, abraço

eu copiei(aqui do forum) e editei á minha maneira para usar no meu dashboard com o full kiosk, e funcionou bem durante uns tempos até uma actualização estragar tudo :smiley:

na questão do fast-whisper + piper não funcionar bem, já alguem aqui apresentou uma solução, eu é que não tive tempo de a implementar ainda. Como vocês têm a configuração da Voz em PT-PT? - #3 por kappa

alias: TTS estado do tempo dashboard1  teste2
sequence:
  - action: weather.get_forecasts
    target:
      entity_id: weather.mira
    data:
      type: daily
    response_variable: previsao
  - action: tts.speak
    metadata: {}
    data:
      cache: true
      media_player_entity_id: media_player.53d85ba5_cb55ab03
      message: |
        {%- set tempo = {
             'clear-night': 'limpo',
             'cloudy': ['nublado','com algumas nuvens']|random,
             'fog': ['enevoado','com muito nevoeiro','de nevoeiro','com nevoeiro']|random,
             'hail': ['com chuviscos','de chuva fraca','com chuva fraca']|random,
             'lightning': ['com relâmpagos','de trovoada']|random,
             'lightning-rainy': ['de tempestade','com relâmpagos e trovoadas']|random,
             'mostlycloudy': ['muito nublado','com muitas nuvens']|random,
             'partlycloudy': ['parcialmente nublado','com nuvens dispersas']|random,
             'pouring': ['muito chuvoso','de chuva intensa','com chuva intensa']|random,
             'rainy': ['chuvoso','de chuva']|random,
             'snowy': ['com neve','de neve']|random,
             'snowy-rainy': ['chuvoso e com neve','de chuva e neve','com chuva e neve']|random,
             'sunny': ['de sol','ensolarado','de sol maravilhoso','lindo','limpo']|random,
             'windy': ['ventoso','com muito vento','com ventos fortes','de muito vento']|random,
             'windy-variant': ['muito ventoso','de forte vendaval','com grande vendaval'] } -%}

         {%- if states('binary_sensor.53d85ba5_cb55ab03_browser_charging') == 'on' -%}
           {%- set pessoa = "Luis! " -%}
         {%- elif states('binary_sensor.presenca_marta') == 'on'  -%}
           {%- set pessoa = "Valentina! " -%}
         {%- elif states('binary_sensor.modo_dormir_pedro') == 'off' -%}
           {%- set pessoa = "Luis! " -%}
         {%- elif states('binary_sensor.modo_dormir_marta') == 'off' -%}
           {%- set pessoa = "Valentina! " -%}
         {%- else -%}
           {%- set pessoa = ", " -%}
         {%- endif -%}

         {%- if (states('sun.sun') == 'above_horizon') and (now().strftime("%H")|int < 12) -%}
           {%- set cumpri = " Bom dia " -%}
         {%- elif (states('sun.sun') == 'above_horizon') and (now().strftime("%H")|int > 12) -%}
           {%- set cumpri = " Boa tarde " -%}
         {%- elif states('sun.sun') == 'below_horizon' -%}
           {%- set cumpri = " Boa noite " -%}
         {%- else -%}
           {%- set cumpri = ", " -%}
         {%- endif -%}
         
         {%- if (states('sensor.esp32_co2_senseair_co2')|int  < 500) and (states('sensor.esp32_co2_senseair_co2')|int  > 1)  -%}
           {%- set qualidade = " Excelente " -%}
         {%- elif (states('sensor.esp32_co2_senseair_co2')|int  < 800) and (states('sensor.esp32_co2_senseair_co2')|int  > 501)  -%}
           {%- set qualidade = " Boa " -%}
         {%- elif (states('sensor.esp32_co2_senseair_co2')|int  < 1500) and (states('sensor.esp32_co2_senseair_co2')|int  > 801)  -%}
           {%- set qualidade = " Fraca " -%}
         {%- elif (states('sensor.esp32_co2_senseair_co2')|int  < 2000) and (states('sensor.esp32_co2_senseair_co2')|int  > 1501)  -%}
           {%- set qualidade = " Muito Fraca " -%}
         {%- elif (states('sensor.esp32_co2_senseair_co2')|int  > 1501)   -%}
           {%- set qualidade = " Extremamente fraca " -%}
         {%- else -%}
           {%- set qualidade = " Desconhecida " -%}
         {%- endif -%}
         
         {%- if (states('sensor.maquina_de_secar_roupa_remaining_time')[0:-6])|int  == 0   -%}
           {%- set tempomaqsecar = ((states('sensor.maquina_de_secar_roupa_remaining_time')[2:-3])|string) + " minutos "  -%}
         {%- elif  (states('sensor.maquina_de_secar_roupa_remaining_time')[0:-6])|int == 1    -%}
           {%- set tempomaqsecar = ((states('sensor.maquina_de_secar_roupa_remaining_time')[0:-6])|string) + " hora, e "  + ((states('sensor.maquina_de_secar_roupa_remaining_time')[2:-3])|string) + " minutos " -%}
         {%- elif  (states('sensor.maquina_de_secar_roupa_remaining_time')[0:-6])|int > 1    -%}
           {%- set tempomaqsecar = ((states('sensor.maquina_de_secar_roupa_remaining_time')[0:-6])|string) + " horas, e " + ((states('sensor.maquina_de_secar_roupa_remaining_time')[2:-3])|string) + " minutos " -%}
         {%- else -%}
           {%- set tempomaqsecar = " tempo Desconhecido " -%}
         {%- endif -%}

         {%- if (states('sensor.maquina_de_lavar_roupa_de_abertura_frontal_remaining_time')[0:-6])|int  == 0   -%}
           {%- set tempomaqlavar = ((states('sensor.maquina_de_lavar_roupa_de_abertura_frontal_remaining_time')[2:-3])|string) + " minutos "  -%}
         {%- elif  (states('sensor.maquina_de_lavar_roupa_de_abertura_frontal_remaining_time')[0:-6])|int == 1    -%}
           {%- set tempomaqlavar = ((states('sensor.maquina_de_lavar_roupa_de_abertura_frontal_remaining_time')[0:-6])|string) + " hora, e "  + ((states('sensor.maquina_de_lavar_roupa_de_abertura_frontal_remaining_time')[2:-3])|string) + " minutos " -%}
         {%- elif  (states('sensor.maquina_de_lavar_roupa_de_abertura_frontal_remaining_time')[0:-6])|int > 1    -%}
           {%- set tempomaqlavar = ((states('sensor.maquina_de_lavar_roupa_de_abertura_frontal_remaining_time')[0:-6])|string) + " horas, e " + ((states('sensor.maquina_de_lavar_roupa_de_abertura_frontal_remaining_time')[2:-3])|string) + " minutos " -%}
         {%- else -%}
           {%- set tempomaqlavar = " tempo Desconhecido " -%}
         {%- endif -%}

         {%- set estado = states('weather.forecast_inicio') -%} 
         {%- set condicoes = tempo[estado] -%} 
         {%- set texto = cumpri + ' ' -%} 
         {%- set texto = texto + pessoa + ' São agora ' + as_local(now()).strftime("%H horas %M minutos") + '. ' -%} 
         {%- set texto = texto + ["Lá fora","No exterior","Na rua"]|random + ', estão ' + state_attr('weather.forecast_inicio','temperature')|round(default=0)|string + ' graus, e vai estar um dia ' -%} 
         {%- set texto = texto + tempo[previsao['weather.mira'].forecast[0].condition] + ', com mínima de ' + previsao['weather.mira'].forecast[0].templow|round(default=0)|string + ' e máxima de ' + previsao['weather.mira'].forecast[0].temperature|round(default=0)|string + ' graus' + ' !' -%} 
         {%- set texto = texto + ' Hoje está previsto produzir ' + states('sensor.solcast_pv_forecast_forecast_today')|round(default=0)|string + ' Kilowatts de energia Solar' + '. ' -%} 
         {%- set texto = texto + ' A Casa está a uma temperatura de ' + states('sensor.shelly_cilindroagua_temperature')|round(default=0)|string + ' graus, ' + ' com ' + states('sensor.53d85ba5_cb55ab03_browser_battery')|round(default=0)|string + ' porcento de humidade relativa! ' + ' a qualidade do ar dentro de casa está ' + qualidade + ' !' -%} 

         {%- if states('switch.maquina_de_secar_roupa_power') == 'on' -%} 
         {%- set texto = texto + ' Falta ' + tempomaqsecar + ' para a máquina de secar terminar o ciclo! ' -%} 
         {%- endif -%}
         
         {%- if states('switch.maquina_de_lavar_roupa_de_abertura_frontal_power') == 'on' -%} 
         {%- set texto = texto + ' Falta ' + tempomaqlavar + ' para a máquina de lavar roupa terminar o ciclo! ' -%} 
         {%- endif -%} 
         
         {%- if states('binary_sensor.53d85ba5_cb55ab03') == 'on' -%} 
           {%- set texto = texto + 'ATENÇÃO: Há um ' + state_attr('binary_sensor.alarme_meteorologico_evora','headline') + ' e prevê-se ' + state_attr('binary_sensor.alarme_meteorologico_evora','description') + '.' -%} 
         {%- endif -%} 
         {{-texto-}}
      options:
        voice: pt_PT-tugão-medium
    target:
      entity_id: tts.piper
description: descreve o estado do tempo no dashboard1
icon: mdi:microphone-message

este código diz mais do que a metereologia, diz as condições exteriores e interiores da casa… foi um teste que fiz á pouco tempo.

Hey @Duarte_Santos, que boa ideia :wink:

Eis como ficou a minha implementação baseado na tua:

alias: "Bom dia Alegria"
description: ""
triggers:
  - at: "07:50:00"
    trigger: time
conditions:
  - condition: time
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri
actions:
  - action: media_player.volume_set
    data:
      volume_level: 0.8
    target:
      device_id: 6dbf95224c8d5a64d13b4a9fc2c2118d
  - action: weather.get_forecasts
    target:
      entity_id: weather.tomorrow_io_home_daily
    data:
      type: daily
    response_variable: previsao
  - action: google_generative_ai_conversation.generate_content
    data:
      prompt: >-
        Começa com "Hoje teremos..." e depois descreve o estado do tempo para
        hoje, de acordo com  "{{previsao.forecast[0]}}" Usa apenas texto em
        pt-pt que possa ser narrado.
    response_variable: message
  - action: tts.speak
    target:
      entity_id: tts.google_pt_pt
    data:
      cache: false
      media_player_entity_id: media_player.mismartclock9807
      message: Bom dia alegria! "{{message.text}}"
mode: single

O que está aqui feito:

  1. Defino o volume do rádio onde o texto será narrado
  2. obtenho a previsão meteorológica
  3. Uso AI para gerar um texto baseado na meteorologia
  4. Uso TTS para narrar no rádio, todos os dias da semana de manhã ao acordar

Exemplo do texto gerado pela AI

text: >
  Hoje teremos um dia nublado. A temperatura máxima será de 16,4 graus, mas a
  mínima vai descer até aos 9,8 graus.  O vento soprará moderadamente a forte, a
  19,8 km/h, vindo de sudoeste (153 graus). A humidade estará elevada, a 93%, e
  a probabilidade de precipitação é baixa, apenas 5%.  Não se prevê chuva.

PS. Obrigado pela forma de obter a meteorologia, afinal era tão simples e eu a complicar…

2 Curtiram

Já agora, fica aqui mais uma dica para quem quiser “bricar” com isto

A AI também pode sugerir o que vestir de manhã:

  prompt: >-
    Começa com "Hoje teremos..." e depois descreve o estado do tempo para hoje e diz como me devo vestir, de acordo com 

resultado:

text: >
  Hoje teremos um dia nublado. A temperatura máxima vai rondar os 16.4 graus,
  mas a mínima desce até aos 9.8 graus, por isso vai ser necessário vestir-se
  por camadas.  O vento sopra a 19.8 km/h, vindo de sudoeste (153 graus), pelo
  que convém usar roupa que lhe proteja do frio e do vento. A humidade é
  elevada, a 93%, e a probabilidade de precipitação é baixa, de apenas 5%, mas é
  melhor levar um casaco impermeável leve, por precaução.  Sugiro que vista
  calças compridas, um sweater ou camisola, e um casaco à prova de vento e água.

:smile: :wink: :muscle:

2 Curtiram

ora bem…
acrescentei no prompt “podes ser criativa” e o resultado foi este:

text: >
  Hoje teremos um dia nublado, com o céu encoberto por uma espessa camada de
  cinzento.  Apesar da temperatura agradavelmente amena de 16.4 graus, a
  humidade elevada de 93% e o vento forte de 19.8 km/h soprando do sudoeste (153
  graus) vão dar-lhe uma sensação de frescura.  A probabilidade de precipitação
  é baixa, apenas 5%, então o guarda-chuva pode ficar em casa.  Contudo, a
  temperatura mínima vai descer para os 9.8 graus à noite, por isso aconselho-te
  a vestir-te em camadas.  Uma camisola de manga comprida por baixo de um casaco
  mais leve, com uma boa proteção contra o vento, será a melhor opção.  Não te
  esqueças de um cachecol para te proteger do frio e do vento!

Querem melhor para começar o dia?
Podem dar largas à imaginação

1 Curtiu

Que TTS estão a usar?

Eu arranjei a versão do Azure de borla e funciona perfeitamente mas acho que existe um pequeno delay que removeria com um TTS local. Acredito que para a nossa lingua seja quase impossível, excluindo o “tugão” do Piper :smiley:

Mas vou experimentar as vossas abordagens de “personalidade” e a meteorologia.

De momento, de manhã, tenho para me dizer qual o método mais rápido para ir para o trabalho, comboio ou carro, através da integração Google Maps Travel Time.

top :smiley:

mas eu e a AI só local e para já a local Ai que tenho não funciona como eu esperava por isso não uso ou uso muito pouco(só para testes) :wink:

Estou a usar a integração oficial da Google

É gratuita, suporta pt-pt e tem funcionado espetacularmente bem.
No entanto, é cloud e não local… o que pode ser um problema para alguns.

Abraço

1 Curtiu

Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade