使用 IPython.display.audio 在 jupyter notebook 中播放音频在函数内使用时不起作用

Posted

技术标签:

【中文标题】使用 IPython.display.audio 在 jupyter notebook 中播放音频在函数内使用时不起作用【英文标题】:Using IPython.display.audio to play audio in jupyter notebook not working when used inside a function 【发布时间】:2020-05-03 11:48:44 【问题描述】:

当使用下面的代码播放声音时:

import IPython.display as ipd
import numpy

sr = 22050 # sample rate
T = 0.5    # seconds
t = numpy.linspace(0, T, int(T*sr), endpoint=False) # time variable
x = 0.5*numpy.sin(2*numpy.pi*440*t)              # pure sine wave at 440 Hz
ipd.Audio(x, rate=sr, autoplay=True) # load a NumPy array

但是当我在函数中使用它时它停止工作:

import IPython.display as ipd
import numpy

def SoundNotification():
    sr = 22050 # sample rate
    T = 0.5    # seconds
    t = numpy.linspace(0, T, int(T*sr), endpoint=False) # time variable
    x = 0.5*numpy.sin(2*numpy.pi*440*t)              # pure sine wave at 440 Hz
    ipd.Audio(x, rate=sr, autoplay=True) # load a NumPy array

SoundNotification()

我尝试将音频分配给一个变量并返回它,它可以工作:

import IPython.display as ipd
import numpy

def SoundNotification():
    sr = 22050 # sample rate
    T = 0.5    # seconds
    t = numpy.linspace(0, T, int(T*sr), endpoint=False) # time variable
    x = 0.5*numpy.sin(2*numpy.pi*440*t)              # pure sine wave at 440 Hz
    sound = ipd.Audio(x, rate=sr, autoplay=True) # load a NumPy array
    return sound
sound = SoundNotification()
sound

但我想在不同的功能中使用声音:

import IPython.display as ipd
import numpy

def SoundNotification():
    sr = 22050 # sample rate
    T = 0.5    # seconds
    t = numpy.linspace(0, T, int(T*sr), endpoint=False) # time variable
    x = 0.5*numpy.sin(2*numpy.pi*440*t)              # pure sine wave at 440 Hz
    sound = ipd.Audio(x, rate=sr, autoplay=True) # load a NumPy array
    return sound

def WhereIWantToUseTheSound():    
    sound = SoundNotification()
    sound

WhereIWantToUseTheSound()

我该如何进行这项工作以及导致这种行为的原因是什么? 笔记本的内核是 Python 3。

编辑: 我想在预定活动中播放声音:

import IPython.display as ipd
import numpy
import sched, time

sound = []
def SoundNotification():
    sr = 22050 # sample rate
    T = 0.5    # seconds
    t = numpy.linspace(0, T, int(T*sr), endpoint=False) # time variable
    x = 0.5*numpy.sin(2*numpy.pi*440*t)              # pure sine wave at 440 Hz
    sound = ipd.Audio(x, rate=sr, autoplay=True) # load a NumPy array
    return sound


def do_something(sc): 
    print("Doing stuff...")
    # do your stuff
    sound_ = SoundNotification()
    s.enter(interval, 1, do_something, (sc,))
    return sound_


s = sched.scheduler(time.time, time.sleep)
interval = int(input("Interval between captures in seconds: "))
s.enter(0, 1, do_something, (s,))
s.run()

我不知道如何在同一个函数中返回声音并安排下一个事件。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,我打电话时播放了声音:

from IPython.display import Audio 
Audio('/path/beep.mp3', autoplay=True)

但是当它在函数内部时它不起作用。问题是函数调用并没有真正播放声音,它实际上是由返回到 Jupyter 输出的结果 html 播放的。

为了克服这个问题,您可以强制该函数使用 IPython 中的 display() 函数来呈现 HTML。这将起作用:

from IPython.display import Audio 
from IPython.core.display import display
def beep():
    display(Audio('/path/beep.mp3', autoplay=True))
beep();

【讨论】:

【参考方案2】:

两件事:

    您必须将音频对象 (sound) 设为全局,因为您是 返回该对象中的值,并且无法从外部访问 功能 在WhereIWantToUseTheSound() 中,您没有返回任何内容

代码:

import IPython.display as ipd
import numpy
sound = []
def SoundNotification():
    global sound
    sr = 22050 # sample rate
    T = 0.5    # seconds
    t = numpy.linspace(0, T, int(T*sr), endpoint=False) # time variable
    x = 0.5*numpy.sin(2*numpy.pi*440*t)              # pure sine wave at 440 Hz
    sound = ipd.Audio(x, rate=sr, autoplay=True) # load a NumPy array

    return sound

def WhereIWantToUseTheSound():    
    sound = SoundNotification()
    return sound


WhereIWantToUseTheSound()

我建议在WhereIWantToUseTheSound() 中使用另一个对象/var(sound) 名称

【讨论】:

这可行,但我认为我不能在我的实现中返回一个变量,我已经编辑了我的原始问题以显示我想在哪里使用代码【参考方案3】:

什么对我有用:

%matplotlib inline

使用笔记本顶部的 %matplotlib 魔法函数强制内联绘图帮助我渲染绘图,即使绘图对象的 show() 函数或 @987654324 的 display() 函数@ 没有被调用。

需要注意的是,这个问题在其他jupyter安装上不会出现

【讨论】:

以上是关于使用 IPython.display.audio 在 jupyter notebook 中播放音频在函数内使用时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter (IPython) Notebook 单元格中有多个 Audio 对象

在一个 Jupyter Notebook 单元中播放多种声音

librosa音频处理教程

从 Python 在 Linux 上播放 MP3

测试使用

第一篇 用于测试使用