2016-08-22 104 views
2

我正在用Jupyter做一些音頻分析的東西,並嘗試使用IPython.display.Audio播放.ogg文件。由於PyCharm經常無法打開大文件.ipynb,我主要使用網絡瀏覽器查看我的Notebook文件,其格式爲localhost:8888IPython.display.Audio無法正確處理`.ogg`文件類型?

enter image description here

這張照片是我所得到的Chrome瀏覽器。正如你所看到的,FailToDisplay.ogg是從我的作品中取得的,音頻播放欄未激活。 File-ACDC _-_ Back_In_Black-sample.ogg and song sample.mp3都是從網上下載的。 3個文件的完整性都是有效的,即它們都可以用音頻播放器正確播放。

我還使用Microsoft Edge和Firefox對其進行了測試,結果基本相同。 2 .ogg播放欄全部不活動,而.mp3播放欄處於活動狀態,並且完美無瑕。所以我想這個問題不是依賴網頁瀏覽器。

我檢查與Chrome開發者工具這三個音頻playbars的HTML源代碼,他們都是這樣的:

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

type的MP3是OGG audio/mpegtypeNone。經過一些谷歌搜索,我想這與MIME類型有關。所以我用命令檢查了3個音頻文件mimetype

$ 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 
+0

好吧,我自己想清楚了。 – Joshz

回答

2

既然沒有人給出了一個提示,我想我得單獨工作...

首先看到的IPython.display.audio源代碼:ipython/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源代碼的代碼,typeself.mimetype。而self.mimetypereload()得出:

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上,所以我想我必須放過它。

最後我意識到IPython.display.Audio之前猴子補丁使用很可能會工作,它確實:

enter image description here

它可能不是完美的解決問題,但至少它的工作原理。現在就這樣吧。