Jupyter Notebook中如何连续播放实时生成的numpy音频数组?
问题解决方案:Jupyter Notebook循环播放numpy格式音频数组
原代码失效原因
原代码仅在循环内创建了
IPython.display.Audio实例,没有主动触发Jupyter Notebook的输出渲染流程,因此不会产生任何播放行为。
可行解决方案
方案1:修正IPython原生调用(无需额外安装依赖)
在循环内主动调用display方法渲染音频对象即可生效,代码示例:
import numpy as np import IPython.display as ipd from IPython.display import display sr = 22000 three_songs = np.array([[0,1,0,1,1,1,1,0,0,0,],[1,0,0,0,1,0,1,0,1,0,],[0,0,0,0,0,1,0,0,0,0,]]) for song in three_songs: display(ipd.Audio(song, rate=sr, autoplay=True))
注意:当前多数浏览器会阻止无用户交互的自动音频播放,运行代码前点击一次Notebook空白区域触发交互即可正常播放
方案2:底层系统音频调用(更适合动态生成音频的场景)
使用sounddevice库直接调用系统音频接口播放,完全绕过Jupyter前端限制,延迟更低,适配你每隔5-10秒生成新音频数组的场景:
- 首先安装依赖:
pip install sounddevice - 播放代码示例:
import numpy as np import sounddevice as sd sr = 22000 three_songs = np.array([[0,1,0,1,1,1,1,0,0,0,],[1,0,0,0,1,0,1,0,1,0,],[0,0,0,0,0,1,0,0,0,0,]]) for song in three_songs: sd.play(song, samplerate=sr) sd.wait() # 等待当前音频播放完成再执行后续逻辑,避免多段音频重叠
如果是异步生成音频的场景,不需要等前一段播完再生成下一段,可以单独维护一个播放队列,生成新数组后直接加入队列即可连续播放。
方案3:预合并数组播放(适合所有音频数组已提前生成的场景)
如果所有音频片段都已经生成完成,直接拼接成完整数组后一次播放即可:
import numpy as np import IPython.display as ipd sr = 22000 three_songs = np.array([[0,1,0,1,1,1,1,0,0,0,],[1,0,0,0,1,0,1,0,1,0,],[0,0,0,0,0,1,0,0,0,0,]]) full_audio = np.concatenate(three_songs) ipd.Audio(full_audio, rate=sr)
内容的提问来源于stack exchange,提问作者Michael Korn
相关产品推荐
相关产品推荐

