@@ -38,7 +38,7 @@ esphome:
3838 name : home-assistant-voice
3939 friendly_name : Home Assistant Voice
4040 name_add_mac_suffix : true
41- min_version : 2026.2 .0
41+ min_version : 2026.3 .0
4242 on_boot :
4343 priority : 375
4444 then :
8686 on_connect :
8787 - lambda : id(improv_ble_in_progress) = false;
8888 - script.execute : control_leds
89+ # Enable/disable Sendspin static adjustment delay if the jack is plugged in or not
90+ - if :
91+ condition :
92+ - binary_sensor.is_on : jack_plugged
93+ then :
94+ - sendspin.media_source.enable_static_delay_adjustment :
95+ else :
96+ - sendspin.media_source.disable_static_delay_adjustment :
8997 on_disconnect :
9098 - script.execute : control_leds
9199
@@ -523,9 +531,11 @@ binary_sensor:
523531 number : GPIO17
524532 # When the jack is plugged in:
525533 # - LED animation
534+ # - Enable Sendspin static delay adjustment to apply the persisted delay when using the external audio output
526535 # - Sound played
527536 on_press :
528537 - lambda : id(jack_plugged_recently) = true;
538+ - sendspin.media_source.enable_static_delay_adjustment :
529539 - script.execute : control_leds
530540 - delay : 200ms
531541 - script.execute :
@@ -537,10 +547,12 @@ binary_sensor:
537547 - script.execute : control_leds
538548 # When the jack is unplugged:
539549 # - LED animation
550+ # - Disable Sendspin static delay adjustment when using the internal speaker
540551 # - Sound played
541552 on_release :
542553 - lambda : id(jack_unplugged_recently) = true;
543554 - script.execute : control_leds
555+ - sendspin.media_source.disable_static_delay_adjustment :
544556 - delay : 200ms
545557 - script.execute :
546558 id : play_sound
@@ -1391,12 +1403,14 @@ script:
13911403 # Script executed when the timer is ringing, to repeat the timer finished sound.
13921404 - id : enable_repeat_one
13931405 then :
1406+ # Turn on the repeat mode and pause for 500 ms between playlist items/repeats
13941407 - media_player.repeat_one :
13951408 id : external_media_player
13961409 announcement : true
1397- # Turn on the repeat mode and pause for 500 ms between playlist items/repeats
1398- - lambda : |-
1399- id(external_media_player)->set_playlist_delay_ms(1, 500);
1410+ - speaker_source.set_playlist_delay :
1411+ id : external_media_player
1412+ pipeline : announcement
1413+ delay : 500ms
14001414
14011415 # Script execute when the timer is done ringing, to disable repeat mode.
14021416 - id : disable_repeat
@@ -1405,8 +1419,10 @@ script:
14051419 - media_player.repeat_off :
14061420 id : external_media_player
14071421 announcement : true
1408- - lambda : |-
1409- id(external_media_player)->set_playlist_delay_ms(1, 0);
1422+ - speaker_source.set_playlist_delay :
1423+ id : external_media_player
1424+ pipeline : announcement
1425+ delay : 0ms
14101426
14111427 # Script executed when we want to play sounds on the device.
14121428 - id : play_sound
@@ -1425,7 +1441,7 @@ script:
14251441 if ( (id(external_media_player).state != media_player::MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING ) || priority) {
14261442 id(external_media_player)
14271443 ->make_call()
1428- .set_media_url("file://" + sound_file)
1444+ .set_media_url("audio- file://" + sound_file)
14291445 .set_announcement(true)
14301446 .perform();
14311447 }
@@ -1552,76 +1568,83 @@ speaker:
15521568
15531569sendspin :
15541570 id : sendspin_hub
1555- task_stack_in_psram : true
1556- kalman_process_error : 0.01
1571+ task_stack_in_psram : false
15571572
15581573http_request :
1574+ buffer_size_rx : 2048 # Reduces CPU load when streaming audio
1575+
1576+ audio_file :
1577+ - id : center_button_press_sound
1578+ file : ${center_button_press_sound_file}
1579+ - id : center_button_double_press_sound
1580+ file : ${center_button_double_press_sound_file}
1581+ - id : center_button_triple_press_sound
1582+ file : ${center_button_triple_press_sound_file}
1583+ - id : center_button_long_press_sound
1584+ file : ${center_button_long_press_sound_file}
1585+ - id : factory_reset_initiated_sound
1586+ file : ${factory_reset_initiated_sound_file}
1587+ - id : factory_reset_cancelled_sound
1588+ file : ${factory_reset_cancelled_sound_file}
1589+ - id : factory_reset_confirmed_sound
1590+ file : ${factory_reset_confirmed_sound_file}
1591+ - id : jack_connected_sound
1592+ file : ${jack_connected_sound_file}
1593+ - id : jack_disconnected_sound
1594+ file : ${jack_disconnected_sound_file}
1595+ - id : mute_switch_on_sound
1596+ file : ${mute_switch_on_sound_file}
1597+ - id : mute_switch_off_sound
1598+ file : ${mute_switch_off_sound_file}
1599+ - id : timer_finished_sound
1600+ file : ${timer_finished_sound_file}
1601+ - id : wake_word_triggered_sound
1602+ file : ${wake_word_triggered_sound_file}
1603+ - id : easter_egg_tick_sound
1604+ file : ${easter_egg_tick_sound_file}
1605+ - id : easter_egg_tada_sound
1606+ file : ${easter_egg_tada_sound_file}
1607+ - id : error_cloud_expired
1608+ file : ${error_cloud_expired_sound_file}
15591609
15601610media_source :
1561- - platform : sendspin
1562- id : sendspin_source
1611+ - platform : audio_file
1612+ id : audio_file_announcement_source
1613+ - platform : http_request
1614+ id : http_announcement_source
1615+ buffer_size : 250000
15631616 - platform : http_request
1564- id : http_source
1617+ id : http_media_source
15651618 buffer_size : 500000
1566- - platform : file
1567- id : file_source
1568- files :
1569- - id : center_button_press_sound
1570- file : ${center_button_press_sound_file}
1571- - id : center_button_double_press_sound
1572- file : ${center_button_double_press_sound_file}
1573- - id : center_button_triple_press_sound
1574- file : ${center_button_triple_press_sound_file}
1575- - id : center_button_long_press_sound
1576- file : ${center_button_long_press_sound_file}
1577- - id : factory_reset_initiated_sound
1578- file : ${factory_reset_initiated_sound_file}
1579- - id : factory_reset_cancelled_sound
1580- file : ${factory_reset_cancelled_sound_file}
1581- - id : factory_reset_confirmed_sound
1582- file : ${factory_reset_confirmed_sound_file}
1583- - id : jack_connected_sound
1584- file : ${jack_connected_sound_file}
1585- - id : jack_disconnected_sound
1586- file : ${jack_disconnected_sound_file}
1587- - id : mute_switch_on_sound
1588- file : ${mute_switch_on_sound_file}
1589- - id : mute_switch_off_sound
1590- file : ${mute_switch_off_sound_file}
1591- - id : timer_finished_sound
1592- file : ${timer_finished_sound_file}
1593- - id : wake_word_triggered_sound
1594- file : ${wake_word_triggered_sound_file}
1595- - id : easter_egg_tick_sound
1596- file : ${easter_egg_tick_sound_file}
1597- - id : easter_egg_tada_sound
1598- file : ${easter_egg_tada_sound_file}
1599- - id : error_cloud_expired
1600- file : ${error_cloud_expired_sound_file}
1619+ - platform : sendspin
1620+ id : sendspin_media_source
1621+ fixed_delay : 480 microseconds # The AIC3204 DAC used, as configured, on the VPE delays audio by 480 microseconds
16011622
16021623media_player :
16031624 - platform : sendspin
16041625 id : sendspin_group_media_player
16051626 - platform : speaker_source
16061627 id : external_media_player
16071628 name : Media Player
1608- announcement_speaker : announcement_resampling_speaker
1609- media_speaker : media_resampling_speaker
16101629 announcement_pipeline :
16111630 format : FLAC # FLAC is the least processor intensive codec
16121631 num_channels : 1 # Stereo audio is unnecessary for announcements
16131632 sample_rate : 48000
1633+ speaker : announcement_resampling_speaker
1634+ sources :
1635+ - audio_file_announcement_source
1636+ - http_announcement_source
16141637 media_pipeline :
16151638 format : FLAC # FLAC is the least processor intensive codec
16161639 num_channels : 2
16171640 sample_rate : 48000
1641+ speaker : media_resampling_speaker
1642+ sources :
1643+ - http_media_source
1644+ - sendspin_media_source
16181645 volume_increment : 0.05
16191646 volume_min : 0.4
16201647 volume_max : 0.85
1621- sources :
1622- - file_source
1623- - http_source
1624- - sendspin_source
16251648 on_mute :
16261649 - script.execute : control_leds
16271650 on_unmute :
@@ -1667,36 +1690,18 @@ external_components:
16671690 - voice_kit
16681691 refresh : 0s
16691692 - source :
1670- # https://github.com/esphome/esphome/pull/12256
1671- type : git
1672- url : https://github.com/esphome/esphome
1673- ref : a2d98e1d5e020200db8f3caf27a74a939a661dc4
1674- components : [audio]
1675- - source :
1676- # https://github.com/esphome/esphome/pull/12258
1693+ # https://github.com/esphome/esphome/pull/14933
16771694 type : git
1678- url : https://github.com/esphome/esphome
1679- ref : b4b7c5b25ebe0f2ab988f700219fa3c57b2377b7
1680- components : [media_player]
1681- - source :
1682- # https://github.com/esphome/esphome/pull/12284
1683- type : git
1684- url : https://github.com/esphome/esphome
1685- ref : d48058e140c98f5c2d902661d851a6b712d62434
1686- components : [sendspin]
1687- - source :
1688- # https://github.com/esphome/esphome/pull/14013
1689- type : git
1690- url : https://github.com/esphome/esphome
1691- ref : 51dcce3d1f22865ebb458a5447bbc877ac946b5a
1692- components : [mdns]
1695+ url : https://github.com/kahrendt/esphome
1696+ ref : 7a6cf5c8472b7e2fa18ee0fc314f66a80d249e32
1697+ components : [const, media_source, sendspin]
16931698 - source :
16941699 # https://github.com/esphome/esphome/pull/12429
16951700 type : git
16961701 url : https://github.com/esphome/esphome
1697- ref : b49b09b6ae56502aa3ce51be86f90d732d019b2c
1702+ ref : ff8ce89556748509d7ee8724e12d9d43d3c8c1e8
16981703 refresh : 0s
1699- components : [file, http_request, media_source, speaker_source ]
1704+ components : [http_request]
17001705
17011706audio_dac :
17021707 - platform : aic3204
0 commit comments