本帖最后由 bugensui 于 2025-1-25 16:22 编辑
home assist官方语音助手利用回音壁音响和Music Assistant随机播放nas里的音乐和切歌等操作,享受音乐自由,智能音响普遍音质都不好,还是传统音响好点,很多智能音箱都是5-10w左右,效果很差的,虽然这些音响是可以听歌的,但是很多歌曲要收费,做不到听歌自由,不过这种智能音响也是有好处的,可以做到24小时待机,传统的音响功耗高,不可能一直开机待机,并且大的音响很少带智能功能,除了三星那些比较贵的音响。
需要的条件:
1,ha系统
2,Music Assistant的服务端和ha的Music Assistant集成
3,语音助手硬件(我的是ha的官方语音助手),也可以用其他语音助手代替,前提是获取命令的音频发给ha做stt服务,解析文本
4,连接ha的传统音响(我的是漫步者回音壁,80-100w左右,蓝牙连接ha,vlc负责出声)
5 所有歌曲放在nas上一个文件夹,然后挂载到ha、一个所有歌曲的播放列表,如all.m3u, 这个需要自己制作,后面会教
可以实现的效果(支持这些命令,需要配合句子自动化实现):
1,播放音乐,备注:随机播放nas上的所有音乐,每次的顺序是不一样的。
2、播放上一首、播放下一首、播放暂停,备注:切歌和暂停。
3,播放{name}(的歌|的歌曲|的专辑), 备注:这个是播放某个歌手的歌曲。
4、播放歌曲{title} ,备注:这个是播放具体某一首歌曲。
这些命令比较简化,我是根据个人习惯指定的,Music Assistant官方的语音意图太复杂了。
为什么是随机播放,不是顺序播放,因为顺序播放每次的顺序都是一样,都听腻了,如果你有几千首歌,你随机播放,每次听到的可能都不一样,一般我们想听歌的时候,大部分场景,都是让音响随机播放音乐,或者说播放谁的歌曲,播放那首歌曲的场景其实不多,因为有的时候你也不一定准确的知道歌名,不过我的自动化也支持这种,但是目前播放那首歌曲,有个难题,因为中文博大精深,你用语音命令说出来的这几个字,ha里的stt转文本,可能识别成其他的文本,就造成搜索不到某首歌,要说的很清楚很准确,这个也是语音转文本的难题(比如我说,播放阿黛尔的歌,ha经常识别成:播放阿大爷的歌,就播放不了)
效果如下
一、制作所有歌曲的播放列表,m3u播放列表的格式如下,可以用代码遍历音乐文件夹(如 music)的音乐文件,然后生成,需要会点代码
#EXTM3U
#EXTINF:1,72242271191
72242271191.mp3
#EXTINF:2,Amani
Amani.mp3
#EXTINF:3,Aqua - My Oh My
Aqua - My Oh My.mp3
#EXTINF:4,BBX-Making Love (Club Radio Edit)
BBX-Making Love (Club Radio Edit).mp3
#EXTINF:5,beyond - 冷雨夜
beyond - 冷雨夜.mp3
复制代码
ha界面效果如下:
登录/注册后可看大图
微信图片_20250121162311.png (188.2 KB, 下载次数: 0)
下载附件
2025-1-21 16:23 上传
用代码遍历生成所有音乐的播放列表参考(假如音乐文件夹是music,音乐都放在里面,如果你用windows电脑,可以用windows的组件fso遍历所有文件名,然后输出all.m3u文件,生成好的文件放到music文件夹里就行,ma能读取到,代码是用windows的asp简单写的,你们也可以自己写,用asp需要在windows启用iis的服务,然后运行就可以了);
如果想新建某个歌手的播放列表,可以直接用Music Assistant加载项的ui界面里的关键词搜索,然后新建播放列表,加入就可以了,这个没有操作难度。
<%
set fso=server.createobject("scripting.filesystemobject")
set fl=fso.getfolder(server.mappath("music"))
on error resume next
list="#EXTM3U"&vbcrlf&vbcrlf
id=0
for each fn in fl.files
id=id+1
list=list&"#EXTINF:"&ID&","&Left(fn.name, Len(fn.name) - 4)&vbcrlf&fn.name&vbcrlf&vbcrlf
next
musiclist=server.mappath("all.m3u")
set fso=createobject("scripting.filesystemobject")
set f=fso.opentextfile(musiclist,2,true)
f.write ""&list&""
f.close
response.write "生成完毕"
%>
复制代码
二、语音自动化意图命令
登录/注册后可看大图
QQ20250121-163001.png (76.02 KB, 下载次数: 0)
下载附件
2025-1-21 16:32 上传
登录/注册后可看大图
QQ20250121-163156.png (56.64 KB, 下载次数: 0)
下载附件
2025-1-21 16:32 上传
语音播放音乐的代码参考
你们可以根据自己的实际情况修改,当句子匹配到(播放音乐)就执行下面的操作,先要把ha里的播放器,用Music Assistant加载项,添加进去,然后在ha的Music Assistant集成里就有这个ma版的播放器了。有了这个ma版播放器,就可以执行music_assistant.play_media专属的播放媒体操作,先给该播放器修改成随机播放模式,然后执行music_assistant.play_media播放媒体操作,类型是播放列表,全部音乐的播放链接是这个:library://playlist/14,需要用到ha里的动作Music Assistant: 获取库项目,查询下所有播放列表的链接,然后就在反馈信息里,能看到(里面有部分代码是判断蓝牙音响有没有开机的,如果没有开机就要延迟执行播放音乐,自动化里第一个动作就是打开音响,如果大家不需要,可以删除)
if:
- condition: template
value_template: "{{ trigger.sentence=='播放音乐' }}"
then:
- alias: 判断音响关机开机延迟操作
if:
- condition: state
entity_id: media_player.man_bu_zhe_yin_xiang
state: "off"
then:
- delay:
hours: 0
minutes: 0
seconds: 1
- set_conversation_response: 已经随机开始播放音乐
- delay:
hours: 0
minutes: 0
seconds: 2
else:
- set_conversation_response: 好的
- action: media_player.shuffle_set
metadata: {}
data:
shuffle: true
target:
entity_id: media_player.man_bu_zhe_yin_le_2
- action: music_assistant.play_media
target:
entity_id: media_player.man_bu_zhe_yin_le_2
data:
media_id: library://playlist/14
media_type: playlist
enqueue: replace
复制代码
三、一些不足和未完善的地方
1,有些音乐元数据作者名显示成繁体,比如大部分梁静茹的歌,元数据作者会正确显示成梁静茹。但是可能部分歌曲会显示成繁体歌手名:梁靜茹,这个时候,你通过语音助手说(播放梁静茹的歌),自动化播放艺术家的歌曲的时候,显示繁体作者名的歌曲就播放不了的,要么自己修改这首歌曲的元数据,更新成简体中文,要么自己新建常用歌手的播放列表,有播放列表的情况下优先播放播放列表,如果没有,就默认播放该艺术家的歌曲。
2,目前的自动化暂时不支持指定区域播放,比如:卫生间播放某某歌曲这种,因为我没有需求,就暂时没有规划。
四、语音命令播放音乐的完整自动化意图(仅供参考)
优化后的完整代码,请移步至:https://mp.weixin.qq.com/s/P0SaGG055VpAvKfI-oXi0g