IPython ノートブックで実行時間の長いセルを実行することがよくあります。セルの実行が終了したときに、ノートブックが自動的にビープ音を鳴らしたり、音を鳴らしたりしたいと思います。iPythonノートブックでこれを行う方法はありますか、それとも自動的にサウンドを再生するセルの最後に置くことができるコマンドですか?
それが違いを生む場合、私はChromeを使用しています。
IPython ノートブックで実行時間の長いセルを実行することがよくあります。セルの実行が終了したときに、ノートブックが自動的にビープ音を鳴らしたり、音を鳴らしたりしたいと思います。iPythonノートブックでこれを行う方法はありますか、それとも自動的にサウンドを再生するセルの最後に置くことができるコマンドですか?
それが違いを生む場合、私はChromeを使用しています。
ノートブックの上部
from IPython.display import Audio
sound_file = './sound/beep.wav'
sound_file
コンピューター上のファイル、またはインターネットからアクセスできるファイルを指す必要があります。
その後、長期セルの最後に
<code that takes a long time>
Audio(sound_file, autoplay=True)
この方法では、新しいバージョンの iPython/Jupyter に組み込まれているAudioタグを使用します。
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)
完了時に音を出したいセルの最後に、次のように入力します。
HTML(play_beep)
使い方:
iPython の組み込みメソッドopen
とread
メソッドを使用して、ファイルシステムからファイルを読み取ります。次に、これを base64 にエンコードします。次に、ID を使用してオーディオ タグを作成しbeep
、base64 データを挿入します。セットアップの最後の部分では、サウンドを再生する小さなスクリプト タグを作成します。
このメソッドは、HTML5 オーディオ タグをサポートするすべてのブラウザーで機能します。
注: ノートブックにオーディオ コントロールを表示したくない場合は、controls
名前の付いた変数から属性を削除してください。sound_tag
私のお気に入りのソリューション(外部モジュールは必要ありません):
import os
os.system("printf '\a'") # or '\7'
OS X で動作します。
ただし、DaveP の発言は依然として当てはまります。サウンドを再生するのはブラウザではなく、サーバーです。
コードを 1 回入力して、指定された時間よりも長く実行された場合、すべてのセルの実行後にそれを機能させるのはどうですか?
次の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();
}
});
})()
その後、5 秒以上かかった各コードの実行後に「ビープ音」が聞こえるはずです。例えば:
# 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 でテスト済み。
コードはさらに改善する必要があるかもしれません (自由に編集してください)。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')
base64 でエンコードされたビープ音を使用することもできます (この回答とこの要点を参照してください)。
var audio = new Audio('data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//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=');
Pythonで外部モジュールを使用できます。s.play()
Snack Sound Toolkit からの この呼び出しをセルの最後に追加してみてください。
Snack Sound Toolkitは、wav、au、および mp3 ファイルを再生できます。
s = Sound()
s.read('sound.wav')
s.play()
この質問は基本的に Play a Sound with Pythonの複製です。
上記のコードスニピットは、その質問の @csexton からのものです。
@krassowskiの回答に基づいて、これが私の解決策です。主な違いは、@krassowski は「長い」セル実行ごとに実行されることです (「長い」の意味を定義します)。サウンドをいつ再生するかを明示的に言うことを好むので、これを行/セル マジックにラップしました ( GitHubで、以下にコピーします)。
"""
Adds a magic to IPython which will play a given sound when a cell finishes running.
Requires Python 3.6+.
Put this file in, e.g., ~/.ipython/profile_default/startup to load this magic on startup.
Usage:
``
%notify [-u/--url URL] [command]
``
Examples
``
%notify # no command needed
%notify run_long_command()
%notify -u https://www.example.com/sound.wav run_long_command()
``
There's also a cell magic version (don't put commands on the first line if using this).
``
%%notify [-u/--url URL]
command1()
command2()
...
``
To always play your preferred audio file, just change the default below.
"""
from typing import Optional
from IPython import get_ipython
from IPython.display import Audio, display
from IPython.core.magic import line_cell_magic, Magics, magics_class
from IPython.core.magic_arguments import argument, magic_arguments, parse_argstring
class _InvisibleAudio(Audio):
"""
An invisible (`display: none`) `Audio` element which removes itself when finished playing.
Taken from https://stackoverflow.com/a/50648266.
"""
def _repr_html_(self) -> str:
audio = super()._repr_html_()
audio = audio.replace(
"<audio", '<audio onended="this.parentNode.removeChild(this)"'
)
return f'<div style="display:none">{audio}</div>'
@magics_class
class NotificationMagics(Magics):
"""
Inspired by https://stackoverflow.com/a/50648266.
"""
@magic_arguments()
@argument(
"-u",
"--url",
default="https://freewavesamples.com/files/E-Mu-Proteus-FX-CosmoBel-C3.wav",
help="URL of audio file to play.",
)
@argument(
"line_code",
nargs="*",
help="Other code on the line will be executed, unless this is called as a cell magic.",
)
@line_cell_magic
def notify(self, line: str, cell: Optional[str] = None):
args = parse_argstring(self.notify, line)
code = cell if cell else " ".join(args.line_code)
try:
ret = self.shell.ex(code)
finally:
audio = _InvisibleAudio(url=args.url, autoplay=True)
display(audio)
return ret
get_ipython().register_magics(NotificationMagics)
に依存したくない場合external modules
は、Python ノートブックでこのコード スニペットを使用できます。このセルを最初のセルの後に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)