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

Tho*_*son 32 python ipython ipython-notebook

我经常在我的IPython笔记本中运行长时间运行的单元格.我希望笔记本能够在单元格执行完毕后自动发出蜂鸣声或播放声音.有没有办法在iPython笔记本中做到这一点,或者我可以在一个自动播放声音的单元格末尾放置一些命令?

如果这有任何区别,我正在使用Chrome.

Way*_*inn 40

TL; DR

在笔记本的顶部

from IPython.display import Audio
sound_file = './sound/beep.wav'
Run Code Online (Sandbox Code Playgroud)

sound_file 应该指向您计算机上的文件,或者可以从Internet访问.

然后,在长时间运行的单元格结束时

<code that takes a long time>

Audio(sound_file, autoplay=True)
Run Code Online (Sandbox Code Playgroud)

此方法使用内置于较新版本的iPython/Jupyter中的音频标记.

注意旧版本

没有Audio标签的旧版本可以使用以下方法.

把它放在一个单元格中并在你想播放声音之前运行它:

from IPython.display import HTML
from base64 import b64encode

path_to_audio = "/path/to/snd/my-sound.mp3"
audio_type = "mp3"

sound = open(path_to_audio, "rb").read()
sound_encoded = b64encode(sound)
sound_tag = """
    <audio id="beep" controls src="data:audio/{1};base64,{0}">
    </audio>""".format(sound_encoded, audio_type)

play_beep = """
<script type="text/javascript">
    var audio = document.getElementById("beep");
    audio.play();
</script>
"""

HTML(sound_tag)
Run Code Online (Sandbox Code Playgroud)

在单元格的末尾,您想要在完成时发出噪音,请执行以下操作:

HTML(play_beep)
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

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

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

注意:如果您不想在笔记本中显示音频控件,只需controls从名为的变量中删除该属性即可sound_tag

  • 而不是找到一个声音文件,你也可以指定一个numpy数组:`wave = np.sin(2*np.pi*400*np.arange(10000*2)/ 10000)`然后:`音频(wave, rate = 10000,autoplay = True)`...以10000的采样率播放400Hz正弦波2秒 (3认同)
  • 与此类似,您可以让 Jupyter 笔记本说话并说“完成”。请参阅 Peter Parente 的帖子 [此处](https://mindtrove.info/jupyter-tidbit-run-and-say-done/)。 (2认同)

Art*_*hur 8

我最喜欢的解决方案(不需要外部模块):

import os
os.system("printf '\a'") # or '\7'
Run Code Online (Sandbox Code Playgroud)

适用于OS X.

然而DaveP的评论仍然适用:它不是播放声音的浏览器而是服务器.

  • @Seanny123 如果您[禁用系统提示音](https://wiki.archlinux.org/index.php/PC_speaker) 将无法工作。 (3认同)

kra*_*ski 8

如果执行的时间超过给定的时间,那么输入一次代码并在执行每个单元格后让它工作怎么样?

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

%%javascript
(function(){
    var startTime;
    $([Jupyter.events]).on('execute.CodeCell', function(event, target)
    {
        startTime = performance.now();
    });
    $([Jupyter.events]).on('finished_iopub.Kernel', function(event, target)
    {
        var endTime = performance.now();

        if(endTime - startTime > 5 * 1000)
        {
            var audio = new Audio('http://www.soundjay.com/button/beep-07.wav');
            audio.play();    
        }
    });
})()
Run Code Online (Sandbox Code Playgroud)

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

# cell 0:
from time import sleep
# cell 1:
sleep(6)    # will ring
Run Code Online (Sandbox Code Playgroud)

如果然后添加另一个单元格

# cell 3:
sleep(3)    # it won't ring
Run Code Online (Sandbox Code Playgroud)

除非您一次执行多个单元格:

# cell 4:
sleep(3)
# cell 5:
sleep(3)    # will ring if queued for execution after cell 4
Run Code Online (Sandbox Code Playgroud)

使用 Jupyter notebook 5.5.0 进行测试。

代码可能需要进一步改进(随意编辑)。要使其在 Google Colab 上运行,需要自己加载 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')
Run Code Online (Sandbox Code Playgroud)

您还可以使用 base64 编码的哔声(请参阅此答案和此要点):

var audio = new Audio('data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=');
Run Code Online (Sandbox Code Playgroud)


agc*_*nti 7

你可以使用python的外部模块.尝试s.play()在单元格的末尾添加来自Snack Sound Toolkit的此调用.

Snack Sound Toolkit可以播放wav,au和mp3文件.

s = Sound() 
s.read('sound.wav') 
s.play()
Run Code Online (Sandbox Code Playgroud)

这个问题基本上是一个重复: 用Python播放声音.

上面的代码片段来自@csexton.

  • 这是一个很好的答案,但它的一个问题是它在运行笔记本服务器的机器上播放声音,这可能与显示笔记本的机器不同.绝对可以做一些事情来让浏览器发出声音. (6认同)

kra*_*ski 6

这是另一个版本(主要是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)
Run Code Online (Sandbox Code Playgroud)

每执行一次代码超过5秒后,将自动发出蜂鸣声,但连续执行不会计算在一起.

例如:

# cell 0:
from time import sleep
# cell 1:
sleep(6)    # will ring
Run Code Online (Sandbox Code Playgroud)

如果您然后添加另一个单元格

# cell 3:
sleep(3)    # it won't ring
Run Code Online (Sandbox Code Playgroud)

使用JupyterLab 0.32.1和Jupyter笔记本5.5.0进行测试.

编辑:为了减少我使用以下片段显示的音频播放器的混乱(对于3.6以上的Python,你需要使用.format()而不是f字符串):

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>'
Run Code Online (Sandbox Code Playgroud)

然后使用InvisibleAudio而不是Audioin post_execute.


Hem*_*ara 5

如果您不想依赖任何external modules,您可以在 Python Notebook 中使用此代码片段。您可以在第一个单元之后运行此单元,beep noise在当前运行的单元完成执行后创建一个。

from IPython.display import Audio
import numpy as np

beep = np.sin(2*np.pi*400*np.arange(30000*2)/10000)
Audio(beep, rate=10000, autoplay=True)
Run Code Online (Sandbox Code Playgroud)