『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
楼主: involute

[插件集成] 让你的HomePod可以TTS?没有那么多麻烦

  [复制链接]

20

主题

550

帖子

3600

积分

元老级技术达人

积分
3600
金钱
3010
HASS币
210

教程狂人突出贡献

 楼主| 发表于 2021-8-11 17:18:07 | 显示全部楼层
XCray 发表于 2021-8-11 16:45
没用 问题依旧。。。

每次重启shairport-sync后只能正常播放一次。

警告的问题好解决,只允许pyatv输出错误日志就是了

logger:
  default: warn
  logs:
    pyatv: error


至于pause, stop, 我本意是做个tts专用的播放器,都不会太长,所以根本就没做pause, stop等接口,当时就没设计成一个全功能播放器,你的玩法属于扩展玩法了。

不好解决的是你无法第二次播放的问题,这就丧失了实用性。
回复

使用道具 举报

20

主题

550

帖子

3600

积分

元老级技术达人

积分
3600
金钱
3010
HASS币
210

教程狂人突出贡献

 楼主| 发表于 2021-8-11 17:23:11 | 显示全部楼层
XCray 发表于 2021-8-11 16:45
没用 问题依旧。。。

每次重启shairport-sync后只能正常播放一次。

“如果我在ios播放的时候,在ha中调用这个播放器,产生的错误日志是一样的,也算验证了我之前的猜测:没有释放”

那就奇了怪了,我的homepod mini,无论什么时候,使用何种设备airplay,都会打断上一次播放。

比如你正在用iPhone放歌,HA向其tts一段语音,那么歌的播放就会被打断,而不会出现什么“正在被其他人使用”的提示。这也是本贴沙发层主提出的问题,他希望打断后自动恢复。
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11445
金钱
8514
HASS币
460

教程狂人突出贡献

发表于 2021-8-11 17:39:14 | 显示全部楼层
involute 发表于 2021-8-11 17:23
“如果我在ios播放的时候,在ha中调用这个播放器,产生的错误日志是一样的,也算验证了我之前的猜测:没 ...

这么看很可能是shairport-sync和homepod mini对于正在播放时新的播放请求的处理方式不一样,前者坚持完成现有任务、而后者则中断现有任务优先处理最新请求。

可能我碰到的问题原因就在这儿,而71楼那位朋友则可能是因为homepod mini的固件版本和你的不一样?导致其处理方式和shairport-sync相似?
回复

使用道具 举报

20

主题

550

帖子

3600

积分

元老级技术达人

积分
3600
金钱
3010
HASS币
210

教程狂人突出贡献

 楼主| 发表于 2021-8-11 17:42:19 | 显示全部楼层
XCray 发表于 2021-8-11 16:45
没用 问题依旧。。。

每次重启shairport-sync后只能正常播放一次。

这样,咱们测试一下你在不关闭(所谓不释放资源)的前提下能不能连续播放

刚才我给你的脚本, 28行

await atv_interface.stream.stream_file(MUSIC)


你把这个复制成两行

await atv_interface.stream.stream_file(MUSIC)
await atv_interface.stream.stream_file(MUSIC)


这样

看看执行一遍脚本能不能连续播放两遍,如果不可以,我再给你想办法
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11445
金钱
8514
HASS币
460

教程狂人突出贡献

发表于 2021-8-11 17:58:00 | 显示全部楼层
本帖最后由 XCray 于 2021-8-11 18:16 编辑
involute 发表于 2021-8-11 17:42
这样,咱们测试一下你在不关闭(所谓不释放资源)的前提下能不能连续播放

刚才我给你的脚本, 28行

第二遍播放时出了同样的错误:
------------------------------                                                                                      
   Media type: Unknown                                                                                             
Device state: Idle                                                                                                  
RTSP/1.0 method ANNOUNCE failed with code 453: Unauthorized

不过倒是比以前有所改善,就是过一会儿就会释放了,再次启动脚本或者用ios播放都没问题。原来是长时间不释放。
回复

使用道具 举报

20

主题

550

帖子

3600

积分

元老级技术达人

积分
3600
金钱
3010
HASS币
210

教程狂人突出贡献

 楼主| 发表于 2021-8-11 18:10:53 | 显示全部楼层
XCray 发表于 2021-8-11 17:58
第二遍播放时出了同样的错误:

不过倒是比以前有所改善(我从github上下载了你最新的代码),就是过一会 ...

好,你把整个函数替换一下,播放一次重连一次看看


async def airplay(event_loop):
    atvs = await pyatv.scan(LOOP, hosts=[IP])
    if len(atvs) == 0:
        print("No device found")
    else:
        atv = atvs[0]
        #atv_interface = await pyatv.connect(atv, event_loop)
        #listener = MyPushListener()
        #atv_interface.push_updater.listener = listener
        #atv_interface.push_updater.start()
        try:
            atv_interface = await pyatv.connect(atv, event_loop)
            await atv_interface.stream.stream_file(MUSIC)
            atv_interface.close()
            atv_interface = await pyatv.connect(atv, event_loop)
            await atv_interface.stream.stream_file(MUSIC)
            atv_interface.close()
        except Exception as e:
            print(e)
        #atv_interface.close()
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11445
金钱
8514
HASS币
460

教程狂人突出贡献

发表于 2021-8-11 18:20:37 | 显示全部楼层
involute 发表于 2021-8-11 18:10
好,你把整个函数替换一下,播放一次重连一次看看

一次执行结束马上再运行一次,第二次也可以播放了,只是每次播放结束的时候都会报错:
RTSP/1.0 method ANNOUNCE failed with code 453: Unauthorized                                                         
Unclosed client session                                                                                             
client_session: <aiohttp.client.ClientSession object at 0x7f29651bf8b0>  

第一次播放结束也报错
回复

使用道具 举报

20

主题

550

帖子

3600

积分

元老级技术达人

积分
3600
金钱
3010
HASS币
210

教程狂人突出贡献

 楼主| 发表于 2021-8-11 18:23:36 | 显示全部楼层
XCray 发表于 2021-8-11 18:20
一次执行结束马上再运行一次,第二次也可以播放了,只是每次播放结束的时候都会报错:
RTSP/1.0 method A ...

我没太听明白,这个脚本内就应该连续播放两次的。

你执行一次脚本能成功播放几次?

多次执行脚本多次能成功播放,前边已经验证过了。
回复

使用道具 举报

8

主题

132

帖子

1224

积分

金牌会员

Rank: 6Rank: 6

积分
1224
金钱
1092
HASS币
0
发表于 2021-8-11 18:30:36 | 显示全部楼层
involute 发表于 2021-8-11 13:56
你也尝试一下78楼的脚本,看是否可以正常播放

bash-5.1# python3 /config/ha_py/airplay.py                                      
------------------------------                                                  
   Media type: Unknown                                                         
Device state: Idle                                                              
RTSP/1.0 method ANNOUNCE failed with code 400: Bad Request                     

还是这个400
回复

使用道具 举报

20

主题

550

帖子

3600

积分

元老级技术达人

积分
3600
金钱
3010
HASS币
210

教程狂人突出贡献

 楼主| 发表于 2021-8-11 18:38:06 | 显示全部楼层
Higashi39 发表于 2021-8-11 18:30
bash-5.1# python3 /config/ha_py/airplay.py                                      
----------------- ...

这就奇怪了,你的群晖外网能访问吗?要不要我帮你看看是不是什么配置问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-28 01:45 , Processed in 0.093206 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表