Play a local mp3 file on Alexa Echo dot

Maybe this will be useful (see end of the reply post):

I did the same process, I created the skill as you guided.

I played the skill but did not play the audio. I put a text before and the execution functioned. text.

Example:

speech = "Audio test <audio src='https://myhomeassistant.duckdns.org/local/audios/mp3/police.mp3' />"

Audio text - OK
Tag audio MP3 - NO

Got it. I needed to convert the MP3. I used the Audacity program and it worked.

https://developer.amazon.com/en-US/docs/alexa/custom-skills/speech-synthesis-markup-language-ssml-reference.html#audio

Thank you for this, by the way. Now my echo plays the AOL “You’ve Got Mail” clip when my mailbox is opened and plays a voice clip of my local team’s announcer when my team scores!

Is this still functioning? I’ve been pulling my hair out for the past 4 hours trying to get this to function :frowning:

@HA-Gecko

Got it working. Couple things to note, hope it may help.

Make sure you export the mp3 via amazons standards: https://developer.amazon.com/en-US/docs/alexa/custom-skills/speech-synthesis-markup-language-ssml-reference.html#h3_converting_mp3

Make sure the mp3 is LESS THAN 240 seconds per Amazons rules:

Make sure after you create the skill in your web browser than you open up your alexa app and enable it

Test the skill first with just speech to verify you got that much working, before trying to play mp3. Change the lambda.py to something like the following:

If hosting the mp3 on your homeassistant device, make sure you can access the URL in just a web browser. If it doesnt play in web browser, its not gonna play through your echo

1 Like

So I followed the set up instructions on the GitHub Wiki and have an automation working just fine that asks to re-arm my GE Concord 4 panel after it has been disarmed for 5 minutes (just set that up as an example). It works as expected.

But I can’t get MP3’s to work as I would like. I created a second skill as you mentioned in the other thread and cloned the script and changed the name.

I’m using Node Red to trigger it. I can get the MP3 to play, but I have a few different MP3’s I’m messing with. After I play the first MP3, the script seems to ignore the audio source “text” in subsequent triggers. I can only get it to play another MP3 if I restart HA.

I also have the same issue using Developer Tools/Services. Whatever MP3 I play first, keeps playing on subsequent calls of the script, regardless of what I’m trying to play.

Any ideas?

Please show your script code.

Sure thing. This is out of my scripts.yaml The first one is direct from the GitHub Wiki. The second and third are the ones I’m trying to use to play mp3’s. I though perhaps I needed a different script for each, so for testing I created the third one, but both refer to the same custom skill.

activate_alexa_actionable_notification:
  description: 'Activates an actionable notification on a specific echo device'
  fields:
    text:
      description: 'The text you would like alexa to speak.'
      example: 'What would you like the thermostat set to?'
    event_id:
      description: 'Correlation ID for event responses'
      example: 'ask_for_temperature'
    alexa_device: 
      description: 'Alexa device you want to trigger'
      example: 'media_player.bedroom_echo'
  sequence:
    - service: input_text.set_value
      data:
        entity_id: input_text.alexa_actionable_notification
        value: '{"text": "{{ text }}", "event": "{{ event_id }}"}'
    - service: media_player.play_media
      data:
        entity_id: "{{ alexa_device }}"
        media_content_type: skill
        media_content_id: amzn1.ask.skill.55914193-ef5f-4bed-91c8-23bf46391cba
activate_alexa_mp3_small_step:
  alias: Alexa MP3 Small Step Script
  description: 'Activates an actionable notification on a specific echo device'
  fields:
    text:
      description: 'The text you would like alexa to speak.'
      example: 'What would you like the thermostat set to?'
    event_id:
      description: 'Correlation ID for event responses'
      example: 'ask_for_temperature'
    alexa_device: 
      description: 'Alexa device you want to trigger'
      example: 'media_player.bedroom_echo'
  sequence:
    - service: input_text.set_value
      data:
        entity_id: input_text.alexa_actionable_notification
        value: '{"text": "{{ text }}", "event": "{{ event_id }}"}'
    - service: media_player.play_media
      data:
        entity_id: "{{ alexa_device }}"
        media_content_type: skill
        media_content_id: amzn1.ask.skill.8c3930db-5594-4b25-992b-fa7974394978
activate_alexa_mp3_dog_bark:
  alias: Alexa MP3 Dog Bark Script
  description: 'Activates an actionable notification on a specific echo device'
  fields:
    text:
      description: 'The text you would like alexa to speak.'
      example: 'What would you like the thermostat set to?'
    event_id:
      description: 'Correlation ID for event responses'
      example: 'ask_for_temperature'
    alexa_device: 
      description: 'Alexa device you want to trigger'
      example: 'media_player.bedroom_echo'
  sequence:
    - service: input_text.set_value
      data:
        entity_id: input_text.alexa_actionable_notification
        value: '{"text": "{{ text }}", "event": "{{ event_id }}"}'
    - service: media_player.play_media
      data:
        entity_id: "{{ alexa_device }}"
        media_content_type: skill
        media_content_id: amzn1.ask.skill.8c3930db-5594-4b25-992b-fa7974394978
1 Like

Are you trying to play your own mp3 or one from the Alexa soundlib?

I’m trying to play my own. I’m testing with two different. The One Small Step, is hosted by someone else on S3 storage and the Dog Barking MP3 is hosted on my own S3 storage.

Using Developer Tools/Services I can use either script.activate_alexa_mp3_small_step or script.activate_alexa_dog_bark

In the Service Data I put this to play the small step MP3

text: "<audio src='https://s3.amazonaws.com/cdn.dabblelab.com/audio/one-small-step-for-man.mp3'/>"
event_id: actionable_notification_small_step
alexa_device: media_player.office_echo

or this to play the dog barking mp3

text: "<audio src='https://dbs179.s3.amazonaws.com/audio/labrador-barking.mp3'/>"
event_id: actionable_notification_dog_barking
alexa_device: media_player.office_echo

All of that works fine, but once I play either of them, no matter which script.activate I choose, or what I put in the Service Data, my Echo still plays the first mp3 I played. A restart of Home Assistant clears it up, until I play either again. Also it seems that after a certain amount of time, maybe more than 15 minutes at a minimum I can play the other MP3 just fine, but then the cycle repeats.

Use data_template (otherwise you are submitting a constant value).
Also suggest “event”: “none” in your value.

I’m not super familiar with data_template, but I tried this.

data_template:
  text: "<audio src='https://dbs179.s3.amazonaws.com/audio/labrador-barking.mp3'/>"
  event: "none"
  alexa_device: media_player.office_echo

In that format I get an error “Alexa MP3 Dog Bark Script: Error executing script. Invalid data for call_service at pos 2: not a valid value for dictionary value @ data[‘entity_id’]”

If I put it in this format

data_template:
text: "<audio src='https://dbs179.s3.amazonaws.com/audio/labrador-barking.mp3'/>"
event: "none"
alexa_device: media_player.office_echo

I get the same behavior, first MP3 plays as expect, following tries play the first played. I’m sure it something I’m doing wrong, thanks for the help so far, I appreciate it!!

Working scripts examples. Put in your S3, your skill, your echoname, and your mp3 file.

alexa_play_mp3:
  sequence:
    - service: input_text.set_value
      data_template:
        entity_id: input_text.alexa_actionable_notification
        value: >
          {"text": "<audio src='https://yourfile.s3.amazonaws.com/{{mp3}}'/>", "event": "none"}
    - service: media_player.play_media
      data_template:
        entity_id: >
          {% if alexa_device %}
            {{ alexa_device }}
          {% else %}
            media_player.yourechodot
          {% endif %}
        media_content_type: skill
        media_content_id: amzn1.ask.skill.e4280a53-blahblahblah

alexa_knocking:
  sequence:
    - service: script.alexa_play_mp3
      data_template:
        mp3: knocking.mp3

alexa_think:
  sequence:
    - service: script.alexa_play_mp3
      data_template:
        mp3: think.mp3
1 Like

I get “There was a problem with the requested skills response”… :frowning: I edited the script names, but using your example script names, I should be able to just call the “alexa_knocking” or “alexa_think” scripts right from Services with no Service Data correct?

activate_alexa_actionable_notification:
  description: 'Activates an actionable notification on a specific echo device'
  fields:
    text:
      description: 'The text you would like alexa to speak.'
      example: 'What would you like the thermostat set to?'
    event_id:
      description: 'Correlation ID for event responses'
      example: 'ask_for_temperature'
    alexa_device: 
      description: 'Alexa device you want to trigger'
      example: 'media_player.bedroom_echo'
  sequence:
    - service: input_text.set_value
      data:
        entity_id: input_text.alexa_actionable_notification
        value: '{"text": "{{ text }}", "event": "{{ event_id }}"}'
    - service: media_player.play_media
      data:
        entity_id: "{{ alexa_device }}"
        media_content_type: skill
        media_content_id: amzn1.ask.skill...........


alexa_play_mp3:
  sequence:
    - service: input_text.set_value
      data_template:
        entity_id: input_text.alexa_actionable_notification
        value: >
          {"text": "<audio src='<audio src='https://dbs179.s3.amazonaws.com/audio/{{mp3}}'/>", "event": "none"}
    - service: media_player.play_media
      data_template:
        entity_id: >
          {% if alexa_device %}
            {{ alexa_device }}
          {% else %}
            media_player.office_echo
          {% endif %}
        media_content_type: skill
        media_content_id: amzn1.ask.skill..........


alexa_play_barking:
  sequence:
    - service: script.alexa_play_mp3
      data_template:
        mp3: labrador-barking.mp3


alexa_play_siren:
  sequence:
    - service: script.alexa_play_mp3
      data_template:
        mp3: siren_noise.mp3
1 Like

Your Alexa_play_mp3 points to your S3 site. If I understand your previous messages, the only file you have at that site is the dog barking file. I did not send you my actual S3 site url, so it is not possible for you to play knocking.mp3 or think.mp3.

If you are saying you have a script (x) that sets the mp3 parameter value and runs script.alexa_play_mp3, then yes. You should be able to run script X from Services without service data.

Sorry, my last post wasn’t very clear, but you got the gist of it I think.

I have two mp3s on my S3 now for testing, labrador-barking.mp3 called from the alexa_play_barking script and siren_noise.mp3 called from the alexa_play_siren script. Everything in my scripts has been edited from your examples to point to my S3 storage, my Alexa Skill ID, my skill names, and my mp3 files.

If i try to run either of the alexa_play_barking or alexa_play_siren scripts from services with no service data Alexa says “There was a problem with the requested skills response.”, but I get no errors in Home Assistant.

Any ideas?

Test that you can play the mp3(s) via a browser (url to s3 file). If so, you have an error in the skill you created or in the media_content_id of the skill.

Another test is to call the alexa play mp3 script via services supplying service data for mp3 and echo device.

Hi, to play local MP3 files on Alexa Echo, you need to draw support from Amazon Music. You should log in to Amazon Music Library with your Amazon account, click the ‘Upload’ button to drag and drop your local MP3 file or select the MP3 file for syncing. Once the local MP3 file is saved to your Amazon Cloud Library, you can directly say ‘Alexa, play Amazon Music’ to play your local MP3 on Alexa Echo. By the way, please make sure you have defined Amazon Music as the default streaming music.

Im having issues using the nabu.casa url as provided in this, Alexa says she is unable to access the uri.
Can you provide a guide on authenticating with the nabu casa cloud service within the alexa skill?