IPython.display.Audio无法正确处理`.ogg`文件类型?

时间:2016-08-22 11:07:57

标签: python ipython mime jupyter ogg

我正在使用Jupyter进行一些音频分析,并尝试使用.ogg播放IPython.display.Audio个文件。由于PyCharm经常无法打开大.ipynb个文件,因此我主要使用Web浏览器在localhost:8888查看我的Notebook文件。

enter image description here

这张照片是我用Chrome获得的。正如您所看到的, FailToDisplay.ogg 取自我的工作,音频播放栏未激活。 File-ACDC _-_ Back_In_Black-sample.ogg song sample.mp3 都是从Internet下载的。 3个文件的完整性都经过验证,即它们都可以通过音频播放器正确播放。

我还使用Microsoft Edge和Firefox对其进行了测试,结果大致相同。 2 .ogg个播放列表均处于非活动状态,而.mp3播放栏处于活动状态并且运行正常。所以我猜这个问题不依赖于网络浏览器。

我使用Chrome Developer Tool检查了这3个音频播放栏的html源代码,它们都像:

<audio controls="controls">
                    <source src="data:None;base64,VERYLONGTEXT" type="None">
                    Your browser does not support the audio element.
                </audio>

mp3的typeaudio/mpeg,ogg的typeNone。经过一些谷歌搜索,我想这与 MIME 类型有关。所以我用命令mimetype检查了3个音频文件:

$ mimetype ./*
./AudioDisplayErrorTest.ipynb:          text/plain
./FailToDisplay.ogg:                    audio/x-vorbis+ogg
./File-ACDC_-_Back_In_Black-sample.ogg: video/x-theora+ogg
./song sample.mp3:                      audio/mpeg

不是很奇怪。然后我发现这篇博文How to set MIMETYPES on server : Forums : PythonAnywhere并测试了我的python MIME类型设置:

>>> import mimetypes
>>> mimetypes.guess_type("foo.ogg")
(None, None)

现在我不知道接下来该怎么做这种情况。这只是Jupyter或IPython或系统范围内的错误吗?我在哪里可以改变这种行为?

我的Python环境设置是

audioread==2.1.4
ipykernel==4.4.1
ipython==5.1.0
ipython-genutils==0.1.0
ipywidgets==4.1.1
jupyter==1.0.0
jupyter-client==4.3.0
jupyter-console==5.0.0
jupyter-core==4.1.1
librosa==0.4.3
nbconvert==4.2.0
nbformat==4.0.1
notebook==4.2.2
numpy==1.11.1
openpyxl==2.3.2
pydub==0.16.5

1 个答案:

答案 0 :(得分:3)

由于没有人给出提示,我想我必须独自工作......

首先查看IPython.display.audioipython/display.py at 48b01aadcbb6a53d2c77fa250c8a4344931c357c · ipython/ipython

的源代码
def _repr_html_(self):
    src = """
            <audio controls="controls" {autoplay}>
                <source src="{src}" type="{type}" />
                Your browser does not support the audio element.
            </audio>
          """
    return src.format(src=self.src_attr(),type=self.mimetype, autoplay=self.autoplay_attr())

这是生成音频控制块的html源代码的代码,type是从self.mimetype分配的。 self.mimetype源自reload()

    if self.filename is not None:
        self.mimetype = mimetypes.guess_type(self.filename)[0]
    elif self.url is not None:
        self.mimetype = mimetypes.guess_type(self.url)[0]
    else:
        self.mimetype = "audio/wav"

很明显,如果mimetypes.guess_type("filename.ogg")[0]获得None,那么我们会type == None,这会导致非活动的音频控制块。

18.7. mimetypes — Map filenames to MIME types — Python 2.7.12 documentation我了解到MIME类型可以从文件加载或动态添加mimetypes.add_type()。它还默认说mimetypes将从Windows注册表加载。我尝试使用一个小实用程序FileTypesMan - Alternative to 'File Types' manager of Windows修改.ogg的系统范围MIME类型设置,但它没有反映在mimetypes上,所以我想我必须放手。< / p>

最后我意识到使用IPython.display.Audio之前的猴子补丁可能会起作用,它确实有效:

enter image description here

解决问题可能并不完美,但至少它有效。所以现在就是这样。