天氣真的是愈來愈冷啦,有時候咱們想翻看網頁新聞,可是又冷的不想把手拿出來,移動鼠標翻看。這時候,是否是特別想電腦像講故事同樣,給咱們念出來呢?人生苦短,我有python啊,試試用 Python 來朗讀給你聽吧。html
網頁轉換成語音,步驟無外乎:python
網頁正文識別,獲取到正文的文本內容;git
文本轉語音,經過接口將文本轉換成語音文件;github
語音文件的發聲,即將語音文件讀出;函數
1 網頁正文識別測試
之因此用 Python,就是由於 Python 有着豐富的庫,網頁正文識別也不在話下。這裏用ui
readability、goose3編碼
1.1 readabilityurl
readability 支持 Python3,使用 pip install readability-lxml 安裝便可。spa
readability 使用起來也很方便:
import requests from readability import Document response = requests.get('http://news.china.com/socialgd/10000169/20180616/32537640_all.html') doc = Document(response.text) print(doc.title())
可是 readability 提取到的正文內容不是文本,裏面仍包含 HTML 標籤。
固然也能夠結合其餘組件再對 HTML 進行處理,如 html2text,咱們這裏就再也不延伸,有興趣的能夠自行嘗試。
1.2 goose3
Goose 原本是一個用 Java 編寫的文章提取器,後來就有了 Python 實現版: goose3 。
使用起來也很方便,同時對中文支持也不錯。使用 pip install goose3 便可安裝。
>>> from goose3 import Goose >>> from goose3.text import StopWordsChinese >>> url = 'http://news.china.com/socialgd/10000169/20180616/32537640_all.html' >>> g = Goose({'stopwords_class': StopWordsChinese}) >>> article = g.extract(url=url) >>> print(article.cleaned_text[:150])
北京時間6月15日23:00(聖彼得堡當地時間18:00),2018年世界盃B組一場比賽在聖彼得堡球場展開角逐,伊朗1比0險勝摩洛哥,伊朗前鋒阿茲蒙半場結束前錯過單刀機會,鮑哈杜茲第95分鐘自擺烏
龍。這是伊朗20年來首度在世界盃決賽圈取勝。
本屆世界盃,既相繼出現替補便進球,貼補梅開二度以及東道主
能夠看出網頁正文提取效果還不錯,基本知足咱們的要求,可使用!
注意:goose 還有另一個 Python2 的版本:Python-Goose,使用方法和 goose3 基本同樣。
2 文本轉語音
文本轉語音,百度、阿里、騰訊、訊飛等都有提供 REST API 接口,阿里和騰訊的申請相對時間較長,阿里的貌似還要收費,百度和訊飛的在線申請後便可使用。
沒辦法,好的東西得來老是要曲折一些。其中百度的沒有調用量的限制(其實默認是 200000 次/天),訊飛有天天 500 次的限制。
這裏咱們使用百度的 REST API 接口中的語言合成接口,一方面緣由是百度的調用次數沒有限制,另外一方面,我大體看了下訊飛的接口文檔,接口限制仍是比較多的。還有就是百度提供了 REST API 的 Python 封裝,使用也更方便。
2.1 baidu-aip 的使用
百度提供了 Python SDK,使用 pip install baidu-aip 能夠直接安裝。接口的使用能夠參考接口文檔:http://ai.baidu.com/docs#/TTS-Online-Python-SDK/top。
使用示例以下:
from aip import AipSpeech """
你的 APPID AK SK
都可在服務控制檯中的應用列表中查看。
""" APP_ID = '你的 App ID' API_KEY = '你的 Api Key' SECRET_KEY = '你的 Secret Key' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = client.synthesis('你好,你在作什麼', 'zh', 3, { 'vol': 5, }) # 識別正確返回語音二進制 錯誤則返回dict 參照下面錯誤碼 if not isinstance(result, dict): with open('auido.mp3', 'wb') as f: f.write(result)
接口參數:
接口對單次傳入的文本進行了限制,合成文本長度必須小於 1024 字節,若是文本長度過長,就須要進行切割處理,採用屢次請求的方式,分別轉換成語音文件,最後再將多個語音文件合併成一個。
2.2 文本切割
可使用以下代碼將文本分割成多個長度爲 500 的文本列表
# 將文本按 500 的長度分割成多個文本 text_list = [text[i:i+500] for i in range(0, len(text), 500)]
咱們使用 pydub 來處理生成的音頻文件。使用 pip install pydub 便可安裝。
另外還 Ubuntu 環境須要安裝依賴的,使用 sudo apt-get install libav-tools 安裝便可,而在 Windows 環境須要到 https://ffmpeg.zeranoe.com/builds/ 下載 FFmpeg,並將其配置到環境變量中。
若還有問題,能夠參考官網配置:https://github.com/jiaaro/pydub。
# 合併音頻文件 def merge_voice(file_list): voice_dict = {} song = None for i,f in enumerate(file_list): if i == 0: song = AudioSegment.from_file(f,"mp3") else: # 拼接音頻文件 song += AudioSegment.from_file(f,"mp3") # 刪除臨時音頻 os.unlink(f) # 導出合併後的音頻文件,格式爲MP3格式 file_name = str(uuid.uuid1()) + ".mp3" song.export(file_name, format="mp3") return file_name
經過百度的接口,咱們能夠將文字轉化成音頻文件,下面的問題就是如何播放音頻文件。
3 音頻文件播放
網上獲取到 Python 播放 wav 文件的方式由好幾種,包括 pyaudio、pygame、winsound、playsound。不過測試下來,只有 playsound 成功。其餘方式有興趣的能夠試下,有問題能夠留言交流。
使用 pip install playsound 安裝後便可使用。
使用也很簡單
>>> from playsound import playsound >>> playsound('/path/to/a/sound/file/you/want/to/play.mp3')
說明:音頻的播放須要在圖形化頁面下運行,由於命令行模式下,沒有播放聲音的出口。
python page2voice.py -u https://so.gushiwen.org/shiwenv_c244fc77f6fb.aspx
運行後,代碼就會自動解析網頁並進行朗讀啦。
至此,網頁到音頻的轉換就結束了,固然程序沒有這麼完美,好比中英文混合的網頁解析和轉換的結果就不怎麼理想,可是純中文的新聞頁面效果仍是不錯的。