如何在单个Jupyter Notebook单元格中多次播放浏览器端声音?
解决Jupyter Notebook浏览器端多次播放声音的问题
我明白你遇到的困扰了——用IPython.display.Audio直接调用只能播放一次,还必须是单元格的最后输出才生效,拆分单元格也不行。这其实是因为只有当Audio对象作为单元格的输出结果被渲染时,浏览器才会处理播放请求,单纯创建对象而不展示的话,前端根本不会收到这个播放指令。
解决方案:用display()主动渲染每个Audio对象
你需要用IPython.display.display()函数来主动把每个Audio对象推送到前端,这样不管它是不是单元格的最后一行,浏览器都会处理播放请求。试试下面的代码:
import time from IPython.display import Audio, display # 封装一个播放函数,方便重复调用 def play_sound(audio_url): display(Audio(url=audio_url, autoplay=True)) # 第一次播放 play_sound("http://www.w3schools.com/html/horse.ogg") # 等待10秒后播放第二次 time.sleep(10) play_sound("http://www.w3schools.com/html/horse.ogg")
为什么之前的方法不行?
- 直接调用
Audio(...)但不display的话,这个对象只是在Python环境里创建了,并没有被发送到前端浏览器,自然不会播放。 - 如果单元格最后输出是
None,那前端只会渲染None,之前创建的Audio对象根本不会被处理。 - 连续调用
Audio(...)而不display的话,只有最后一个对象会成为单元格输出(如果没有其他输出的话),前面的都会被忽略。
额外提示
如果不想用time.sleep阻塞Notebook的执行(比如你还要同时跑其他代码),可以考虑用异步任务来控制播放时机,但如果只是简单的定时重复播放,上面的方法已经足够满足需求啦。
内容的提问来源于stack exchange,提问作者abukaj
相关产品推荐
相关产品推荐

