在IPython笔记本电脑中自动播放声音

在IPython笔记本电脑中自动播放声音,python,ipython,ipython-notebook,Python,Ipython,Ipython Notebook,我经常在IPython笔记本中运行长时间运行的单元格。我希望当电池执行完毕时,笔记本能自动发出嘟嘟声或播放声音。在iPython笔记本中有什么方法可以做到这一点,或者我可以在一个单元格的末尾输入一些命令,自动播放声音 如果有什么不同的话,我使用的是Chrome。您可以在python中使用外部模块。尝试在单元格末尾添加来自零食声音工具包的s.play()调用 可以播放wav、au和mp3文件 s = Sound() s.read('sound.wav') s.play() 这个问题基本上是重

我经常在IPython笔记本中运行长时间运行的单元格。我希望当电池执行完毕时,笔记本能自动发出嘟嘟声或播放声音。在iPython笔记本中有什么方法可以做到这一点,或者我可以在一个单元格的末尾输入一些命令,自动播放声音


如果有什么不同的话,我使用的是Chrome。

您可以在python中使用外部模块。尝试在单元格末尾添加来自零食声音工具包的
s.play()
调用

可以播放wav、au和mp3文件

s = Sound() 
s.read('sound.wav') 
s.play()
这个问题基本上是重复的:

上面的代码snipit来自于该问题中的@csexton

TL;博士 在你笔记本的顶部

from IPython.display import Audio
sound_file = './sound/beep.wav'
声音文件
应指向计算机上的文件,或可从internet访问的文件

然后,在长时间运行的单元末尾

<code that takes a long time>

Audio(sound_file, autoplay=True)
工作原理:

它使用iPython内置的
open
read
方法从文件系统读取文件。然后将其编码为base64。然后,它创建一个ID为
beep
的音频标签,并将base64数据注入其中。设置的最后一部分创建一个播放声音的小脚本标记

此方法应适用于任何支持HTML5音频标记的浏览器

注意:如果您不想在笔记本中显示音频控件,只需从名为
sound\u tag的变量中删除
controls
属性即可(无需外部模块):

在OSX上工作


然而,达维普的评论仍然适用:播放声音的不是浏览器,而是服务器。

如果代码的执行时间超过给定的时间,是否只需输入一次代码,然后让它在每个单元格执行后工作

只需使用以下JavaScript创建并执行一个单元格(调整超时和声音)

之后,您应该在每次代码执行后听到“嘟嘟”声,执行时间超过5秒。例如:

# cell 0:
from time import sleep
# cell 1:
sleep(6)    # will ring
# cell 0:
from time import sleep
# cell 1:
sleep(6)    # will ring
如果然后添加另一个单元格

# cell 3:
sleep(3)    # it won't ring
除非一次执行多个单元格:

# cell 4:
sleep(3)
# cell 5:
sleep(3)    # will ring if queued for execution after cell 4
使用Jupyter笔记本电脑5.5.0进行测试

代码可能需要进一步改进(请随意编辑)。要在GoogleColab上工作,需要自己加载jQuery。 似乎还不能与JupyterLab合作

要关闭,请使用:

%%javascript
// a slightly better version would unbind only the handlers defined above 
$([Jupyter.events]).unbind('execute.CodeCell')
$([Jupyter.events]).unbind('finished_iopub.Kernel')
您还可以使用base64编码的蜂鸣声(请参阅和):

下面是另一个版本(主要是Python端),它可以很好地与JupyterLab配合使用:

from time import time
from IPython import get_ipython
from IPython.display import Audio, display


class Beeper:

    def __init__(self, threshold, **audio_kwargs):
        self.threshold = threshold
        self.start_time = None    # time in sec, or None
        self.audio = audio_kwargs

    def pre_execute(self):
        if not self.start_time:
            self.start_time = time()

    def post_execute(self):
        end_time = time()
        if self.start_time and end_time - self.start_time > self.threshold:
            audio = Audio(**self.audio, autoplay=True)
            display(audio)
        self.start_time = None


beeper = Beeper(5, url='http://www.soundjay.com/button/beep-07.wav')

ipython = get_ipython()
ipython.events.register('pre_execute', beeper.pre_execute)
ipython.events.register('post_execute', beeper.post_execute)
每次代码执行超过5秒后,将自动发出蜂鸣音,但连续执行不计入在内

例如:

# cell 0:
from time import sleep
# cell 1:
sleep(6)    # will ring
# cell 0:
from time import sleep
# cell 1:
sleep(6)    # will ring
如果然后添加另一个单元格

# cell 3:
sleep(3)    # it won't ring
使用JupyterLab 0.32.1和Jupyter notebook 5.5.0进行测试

编辑:为了减少显示的音频播放器的混乱,我使用了以下代码段(对于3.6以上版本的Python,您需要使用
.format()
而不是f-strings):

从IPython.display导入音频,显示
类不可见音频:
定义报告html(自我):
音频=超级()。\u repr\u html

audio=audio.replace(“根据@krassowski的答案,我的解决方案是这样的。主要区别在于@krassowski在每次“长”单元格执行后都会运行(在这里定义“长”的含义);我更喜欢明确地说我想何时播放声音,所以我将其包装成了一个行/单元格魔术(在下面复制):

“”“
为IPython添加了一个魔术,当一个单元格运行完毕时,它将播放给定的声音。
需要Python 3.6+。
将此文件放入,例如~/.ipython/profile\u default/startup,以便在启动时加载此魔法。
用法:
``
%通知[-u/--url][command]
``
例子
``
%通知#无需命令
%通知run_long_命令()
%通知-uhttps://www.example.com/sound.wav 运行_long_命令()
``
还有一个cell magic版本(如果使用此版本,请不要将命令放在第一行)。
``
%%通知[-u/--url]
命令1()
命令2()
...
``
要始终播放首选音频文件,只需更改下面的默认值。
"""
从键入导入可选
从IPython导入获取
从IPython.display导入音频,显示
从IPython.core.magic导入行\u单元格\u magic、Magics、Magics\u类
从IPython.core.magic_参数导入参数、magic_参数、parse_argstring
类_隐形音频:
"""
一种不可见的(`display:none`)`Audio`元素,播放结束后会自动消失。
取自https://stackoverflow.com/a/50648266.
"""
def_repr_html_(self)->str:
音频=超级()。\u repr\u html
audio=audio.replace(
“荣誉奖

我多次来寻找这个特定的答案,但在这里找不到

winsound.Beep(freq, time_in_millisec)
我使用:

winsound.Beep(300, 200)
winsound.Beep(300, 200)
winsound.Beep(300, 700)

最新iPython笔记本版本的内置方法可能与See Waylon Finn的答案重复。有关自动蜂鸣音(如果任何单元格执行时间超过指定时间),请参阅无需在单元格末尾添加任何代码。相关:这是一个很好的答案,但其中的一个问题是,它在运行笔记本服务器的计算机上播放声音,这可能与显示笔记本的计算机不同。当然,可以做些事,让浏览器播放声音。而不是查找声音file,您还可以指定一个numpy数组:
wave=np.sin(2*np.pi*400*np.arange(10000*2)/10000)
然后:
Audio(wave,rate=10000,autoplay=True)
…要以10000的采样率播放400Hz正弦波2秒,类似于此,您可以让Jupyter笔记本说话并说“完成”“。请参阅Peter Parente的帖子。我只需分配
notify=Audio(sound\u file,autoplay=True)
,然后在每个长时间运行的单元格末尾放置一个
notify
,以播放音乐。在Jupyterlab 3.0.3上,我必须将sound\u file作为关键字参数传递:Audio(filename=sound\u file,autoplay=True).@Seanny123如果你找到了就不行了。你在Jupyter找到办法了吗
# cell 3:
sleep(3)    # it won't ring
from IPython.display import Audio, display


class InvisibleAudio(Audio):
    def _repr_html_(self):
        audio = super()._repr_html_()
        audio = audio.replace('<audio', f'<audio onended="this.parentNode.removeChild(this)"')
        return f'<div style="display:none">{audio}</div>'
winsound.Beep(freq, time_in_millisec)
winsound.Beep(300, 200)
winsound.Beep(300, 200)
winsound.Beep(300, 700)