Alexa a falar sms do Telegram

Este pequeno tutorial serve somente para conseguirmos colocar as nossas alexa a falar o que escrevemos no nosso bot do telegram, e na verdade no Home Assistant é super fácil fazê-lo.

Está só à distância de uma automação.

Se estão interessados no assunto acredito que já tenham todos os requisitos necessários, na verdade basta ter:

  1. Telegram bot instalado no vosso HA, se ainda não tiverem é só seguir este tutorial- tutorial telegram

  2. O custom_component alexa media_player instalado que o deverão instalar através do HACS preferencialmente Alexa media_player

Depois disso, basta usar esta automação:

  - alias: 'alexa telegram'
    trigger:
      platform: event
      event_type: telegram_text
    action:
    - service: notify.alexa_media
      data_template:
        target: 'media_player.echo_dot_de_ricardo'
        data:
          type: announce
        message: "{{ trigger.event.data.text }}"

Agora é só escrever a mensagem no bot e testar

No type onde uso “announce” podem também utilizar “tts” .

Se o método announce não funcionar no vosso echo, confirmem na app que em / dispositivos/echo&alexa/vosso echo/communications está no modo enable/activo

Pessoalmente só costumo usar “announce” pois gosto mais por dar aquele toque de alerta de que vai fazer um anuncio, ao contrário do “tts” em que começa logo a falar e por vezes se não estamos à espera não percebemos as primeiras palavras.

Bem nem é só por isso gosto mais do “announce” , pois só com este type é que podemos usar “SSML references”, e com isto podemos, por exemplo, usar vozes da amazon polly ( sim pt/PT ) e também vários efeitos que podemos dar às vozes para tentarmos que soe o mais natural possível ( para os vários efeitos disponiveis consultem esta página. )

É provável que não funcione com o echo dot versão 2 , se puderem confirmem e postem aqui no tópico

E não é preciso ter nada mais instalado basta colocar os devidos efeitos na automação:

  - alias: 'Alexa Telegram'
    trigger:
      platform: event
      event_type: telegram_text
    action:
    - service: media_player.volume_set
      entity_id: media_player.echo_dot_de_ricardo
      data:
        volume_level: '0.5'
    - delay: '5'
    - service: notify.alexa_media
      data_template:
        target: 'media_player.echo_dot_de_ricardo'
        data:
          type: announce
        message: "<voice name='Cristiano'><lang xml:lang='pt-PT'><amazon:auto-breaths frequency='high' volume='soft' duration='x-short'>{{ trigger.event.data.text }} </amazon:auto-breaths></lang></voice>"

Ainda ando a testar a melhor combinação de efeitos para o discurso parecer o mais real possível, mas acho que já não está mal.

Ah, para a vozes portuguesas podemos usar “Ines” ou “Cristiano”

Edit:

Para quem já usava, ou quer usar, o “platform” telegram_text para activar alguma outra automação , estas automações atrás poderão “atrapalhar” um pouco, já que tudo o que escrevermos no bot a Alexa vai dizer, e poderá nem sempre ser essa a nossa vontade.

Por exemplo na automacão seguinte eu quero ligar a luz da dispensa, mas não quero que a alexa fale:

  - alias: 'Telegram liga luz'
    trigger:
      platform: event
      event_type: telegram_text
      event_data:
        text: 'acende'
    action:
    - service: telegram_bot.send_message
      data_template:
        target: '{{ trigger.event.data.chat_id }}'
        message: 'Ok {{ trigger.event.data["from_first"] }}, acendi a luz!'
    - service: light.turn_on
      entity_id: light.luz_dispensa

Então para isso eu terei de colocar uma condição nas automações em quero que a alexa fale, por exemplo:

  - alias: 'Tesrert'
    trigger:
      platform: event
      event_type: telegram_text
    condition: 
      - condition: template
        value_template: >
          {{'!' in trigger.event.data.text }}
    action:
    - service: media_player.volume_set
      entity_id: 'media_player.echo_dot_de_ricardo'
      data:
        volume_level: '0.5'
    - delay: '5'
    - service: notify.alexa_media
      data_template:
        target: 'media_player.echo_dot_de_ricardo'
        data:
          type: announce
        message: "<voice name='Cristiano'><lang xml:lang='pt-PT'><amazon:auto-breaths frequency='high' volume='soft' duration='x-short'>{{ trigger.event.data.text }} </amazon:auto-breaths></lang></voice>"

Com esta condição a Alexa só vai falar se existir no texto o ponto de exclamação “!” , mas atenção que a Alexa também vai ler isso, por isso o melhor será colocá-lo no principio do texto, ou então colocar qualquer outro caractere ou palavra como condition.

3 Likes

Top obrigado pela partilha :slight_smile:

@finipini em que modelos da alexa isto funciona? É necessario activar alguma skill na alexa?

Melhor confirmar com mais pessoas mas parece que não funciona no echo dot 2.

Na app poderá ser necessário activar as “communications” em dispositivos/echo & alexa/echo xxxx/cummunications . Embora normalmente esteja activa por defeito.

Já actualizei o post com estas duas “resalvas”.

Actualizei o primeiro post para quem não quer que a Alexa fale tudo o que se escreve no bot, que só o faça se introduzirmos um caractere ou palavra “chave”

na minha alexa 3 geraçao , na primeira vez da automação nunca funciona, so coloca o volume na alexa e da um erro no log:
alexa tts test voz pt: Error executing script. Unexpected error for call_service at pos 2: Too Many Requests
Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/helpers/script.py”, line 153, in _async_step
self, f"async{cv.determine_script_action(self._action)}_step"
File “/usr/src/homeassistant/homeassistant/helpers/script.py”, line 623, in _async_call_service_step
*self._prep_call_service_step(), blocking=True, context=self._context
File “/usr/src/homeassistant/homeassistant/core.py”, line 1247, in async_call
task.result()
File “/usr/src/homeassistant/homeassistant/core.py”, line 1282, in _execute_service
await handler.func(service_call)
File “/usr/src/homeassistant/homeassistant/components/notify/init.py”, line 119, in async_notify_message
await notify_service.async_send_message(**kwargs)
File “/config/custom_components/alexa_media/notify.py”, line 229, in async_send_message
await asyncio.gather(*tasks)
File “/config/custom_components/alexa_media/helpers.py”, line 148, in wrapper
result = await func(*args, **kwargs)
File “/config/custom_components/alexa_media/media_player.py”, line 1059, in async_send_announcement
message, customer_id=self._customer_id, **kwargs
File “/usr/local/lib/python3.7/site-packages/alexapy/alexaapi.py”, line 583, in send_announcement
queue_delay=queue_delay,
File “/usr/local/lib/python3.7/site-packages/alexapy/alexaapi.py”, line 302, in send_sequence
await self.run_behavior(node_data, queue_delay=queue_delay)
File “/usr/local/lib/python3.7/site-packages/alexapy/alexaapi.py”, line 247, in run_behavior
await self._post_request("/api/behaviors/preview", data=data)
File “/usr/local/lib/python3.7/site-packages/alexapy/alexaapi.py”, line 118, in _post_request
return await self._request(“post”, uri, data)
File “/usr/local/lib/python3.7/site-packages/alexapy/alexaapi.py”, line 111, in _request
raise AlexapyTooManyRequestsError(response.reason)
alexapy.errors.AlexapyTooManyRequestsError: Too Many Requests

a minha automaçao:

  alias: alexa tts test voz pt
  trigger:
  - at: '15:00'
    platform: time
  action:
    - service: media_player.volume_set
      entity_id: media_player.henrique_s_echo_dot
      data:
        volume_level: '0.9'
    - service: notify.alexa_media_henrique_s_echo_dot
      data_template:
        target: 'media_player.henrique_s_echo_dot'
        data:
          type: announce
        #message: "<voice name='Cristiano'><lang xml:lang='pt-PT'><amazon:auto-breaths frequency='high' volume='soft' duration='x-short'> ola lourenço, tudo bem ? contigo  </amazon:auto-breaths></lang></voice>"
        message: "<voice name='Ines'><lang xml:lang='pt-PT'><amazon:auto-breaths frequency='high' volume='soft' duration='x-short'> olá lourenço, tudo bem ? contigo? Não quero!  </amazon:auto-breaths></lang></voice>" 

se eu chamar a automaçao logo a seguir já funciona… como resolver o erro e dar logo a primeira ?

já consegui resolver… basta colocar um delay antes de falar:

- id: alexa tts test voz pt
  alias: alexa tts test voz pt
  trigger:
  - at: '15:00'
    platform: time
  action:
    - service: media_player.volume_set
      entity_id: media_player.henrique_s_echo_dot
      data:
        volume_level: '0.5'
    - delay: '5'
    - service: notify.alexa_media_henrique_s_echo_dot 
      data_template:
        target: 'media_player.henrique_s_echo_dot'
        data:
          type: announce
        #message: "<voice name='Cristiano'><lang xml:lang='pt-PT'><amazon:auto-breaths frequency='high' volume='soft' duration='x-short'> ola lourenço, tudo bem ? contigo  </amazon:auto-breaths></lang></voice>"
        message: "<voice name='Ines'><lang xml:lang='pt-PT'><amazon:auto-breaths frequency='high' volume='soft' duration='x-short'> olá lourenço, tudo bem ? contigo? Não quero!  </amazon:auto-breaths></lang></voice>"
1 Like

Isso é estranho. Não devia ser preciso o dlelay. Notei que com o service que tens para a alexa falar não precisarias de ter o target, ou então coloca como service só “notify_alexa_media” como está no exemplo, porque a mim funciona sempre sem o delay.

Afinal tens razão @Skysurf , se o nivel de som não estiver já no que está definido na automação, a alexa só ajusta o som e não diz nada. Vou colocar a tua solução no post original, entretanto vou só fazer várias tentativas para ver qual o minimo delay pode haver.

Obrigado pelo debug :+1:

1 Like

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


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