現在網上基本都沒有對應的基於神經網絡聲音分類識別的較簡單的教程,所以我打算通過我自己的思路,編寫出一個實現男女聲音識別的一個深度學習的模型。
因為沒有驗證過該想法是否正確,所以想通過該博客來記錄實驗的結果,無論最終是否能成功識別男女聲音,我都想將此次的實驗記錄下來。
首先從網站http://festvox.org/cmu_arctic/dbs_bdl.html,爬取相關的男人和女人的聲音文件。
爬取過程的代碼如下,省略,以下直接用到我的代碼倉庫中的爬取代碼:(將在最后提供爬取的男女聲音文件集合,A表示男人聲音,B表示女人聲音)
漫長的等待結果,由於是外網,雖然聲音文件都很小,但是每個都要下載很久,這里不管了,先讓他慢慢爬取,接着通過博客:
https://segmentfault.com/a/1190000020905581?utm_source=tag-newest
得到對應聲音的波形圖繪制方法。
思路就是通過聲音所生成的波形圖,然后將圖片代入神經網絡中,讓其自己分析出特征,看能否實現聲音的識別。
這時候,聲音還沒有爬取完成,我們接着等待,可以先去吃個蘋果。
爬取完成之后,選取了qq音樂中的一首歌然后試試看能不能生成:
結果出現了,錯誤:RuntimeWarning: Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work
warn("Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work", RuntimeWarning)
通過這篇博客https://blog.csdn.net/qq_40152706/article/details/89058480得知,要下載對應ffprobe的包,所以這里先下載:
設置環境變量,解壓后設置環境變量。
根據上述的博客,我們可以編寫出以下的生成波形圖的通用函數:
def sound_to_image(filename, out): # 讀取生成波形圖 samplerate, data = wavfile.read(filename) times = np.arange(len(data)) / float(samplerate) # print(len(data), samplerate, times) # 可以以寸為單位自定義寬高 frameon=False 為關閉邊框 fig = plt.figure(figsize=(20, 5), facecolor="White") # plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on') ax = fig.add_axes([0, 0, 1, 1]) ax.axis('off') plt.fill_between(times, data, linewidth='1', color='green') plt.xticks([]) plt.yticks([]) plt.savefig(out, dpi=100, transparent=False, bbox_inches='tight', edgecolor='w') # plt.show() # image_dirchange_to(r'C:\Users\Halo\Desktop\1.6項目開發過程','.jpg',r'C:\Users\Halo\Desktop\1.6項目開發過程\test','.bmp',20,20)
將圖片轉化成聲波圖的效果如下:
將圖片轉化成160*40的大小之后,經過不斷的學習
構建卷積神經網絡模型:
將對應的數據經過,參數的不斷調試,測試得第一個卷積層大小為2,步長為1時有較好的識別效果。100次迭代之后,如下:
接下來抽取從網上下載的另外的聲音文件進行識別:
去下載了幾個聲音來進行識別:
選中的是男人的聲音標記為A,未選中的是女人的聲音。
接下來構建卷積神經網絡模型。用softmax函數進行識別,由於是二分類問題,構建的模型參數如下:
識別結果
其中arctic_a02開頭的是男人聲音,arctic_a01開頭是女人的聲音,由此,聲音識別的卷積神經網絡搭建完成,能夠分辨出男人女人的聲音。
5個樣本識別正確率100%。