操作環境
Python版本: anaconda3 python3.7.4
操作系統: Ubuntu19.10
編譯器: pycharm社區版
用到的模塊: pyttsx3,requests
pysstx3模塊介紹
pyttsx3官網地址
pyttsx3(Text to Speech)是一個語音轉換模塊,它可以在離線的環境下工作,支持多個引擎,而且兼容於Python2和Python3.
首先下載pyttsx3模塊
pip install pyttsx3
(Windows系統)若你沒有安裝pywin32模塊,則還需安裝此模塊作為pyttsx3模塊的依賴
安裝pywin32
pip install pywin32
這個模塊很奇怪,下載的過程中經常會報錯,試了幾台電腦和不同操作系統的結果也是一樣,在檢查網絡和其他因素無誤后多試幾次就可以成功安裝此模塊.
安裝成功提示如下圖
注意:這個模塊運行必須在python3.7.4版本及以下才可以運行,否則會由於版本過高報錯
如果不知道自己的Python版本是多少,可以再終端輸入
測試pyttsx3庫
根據官網給出的簡單示范,我們可以測試一下是否可以使用本模塊
測試代碼:
import pyttsx3
engine = pyttsx3.init()
engine.say("I will speak this text")
engine.runAndWait()
若可以聽到一個男聲快速的說了一遍我們引用的句子,則證明本模塊安裝已經成功
自定義修改朗讀的語調、音色等參數
也是參照官方文檔,將這些參數調整成一個比較舒服的狀態
import pyttsx3
engine = pyttsx3.init() # 創建對象
""" 語速 """
rate = engine.getProperty('rate') # 獲取當前語速(默認值)
print (rate) # 打印當前語速(默認值)
engine.setProperty('rate', 175) # 設置一個新的語速
"""音量"""
volume = engine.getProperty('volume') # 獲取當前的音量 (默認值)(min=0 and max=1)
print (volume) # 打印當前音量(默認值)
engine.setProperty('volume',1.0) # 設置一個新的音量(0 < volume < 1)
"""音色"""
voices = engine.getProperty('voices') # 獲取當前的音色信息
engine.setProperty('voice', voices[0].id) # 改變中括號中的值,0為男性,1為女性
engine.say("Hello World!")
engine.runAndWait()
engine.stop()
在Windows系統中,這一段代碼已經可以通過pyttsx3模塊說出中文了,但是在Linux操作系統中,還需要修改一個參數
engine.setProperty('voice','zh') //將音色中修改音色的語句替換
開始制作有聲小說
通過剛才對pyttsx模塊的講解,我們已經可以了解到該模塊的基本原理以及各個參數所代表的含義,接下來我們就以pyttsx3模塊為基礎構建一個簡單的有聲小說.
基本思路
使用爬蟲requests模塊將小說文本從從網上下載到本地,並將內容保存在一個文本文件中,然后打開文本文件,調用pyttsx3模塊對文字進行識別,並朗讀出來.
操作步驟
首先找到一個小說網站(我選擇的是新筆趣閣小說網 因為這個網站沒有設置反爬機制 比較適合我們練手)
然后隨便找到一個小說,進入它的目錄頁,借助谷歌瀏覽器的插件xpath helper利用xpath語法提取到每一章小說
點進小說的內容頁,同樣利用插件提取到內容
然后就可以開始構建爬取小說的代碼了
為了節省時間,我先簡單的爬取一個章節
import requests
from lxml import etree
def main():
#小說的詳情頁
url = 'http://www.xbiquge.la/10/10489/'
#請求內容
response = requests.get(url).text
#轉化成xpath語法可以提取的形式
html = etree.HTML(response)
#提取小說內容頁的網址
data = html.xpath("//div[@class='box_con'][2]/div[@id='list']/dl/dd/a/@href")
#為了節省時間,先只提取一個章節的內容
sound = data[1]
#構造小說內容頁的網址
new_url = 'http://www.xbiquge.la' + str(sound)
#請求
response_1 = requests.get(new_url).content
html_1 = etree.HTML(response_1)
data_1 = html_1.xpath("//div[@id='content']/text()")
#用replace方法將提取到文本中的\xa0替換掉
noval = str(data_1).replace('\\xa0', '')
#替換掉\r
noval_1 = noval.replace("\\r',", '')
#將爬取到的小說內容存儲到文本文件中
with open('xiaoshuo.txt','w') as f:
f.write(noval_1)
if __name__ == '__main__':
main()
運行完成之后,就可以發現當前文件夾下多出了一個名為xiaoshuo.txt的文件,這就是我們爬取到的小說內容
導入有聲閱讀模塊
def say(filename='xiaoshuo.txt'):
with open(filename, 'r') as f:
line = f.read()
engine = pyttsx3.init()
engine.setProperty('volume',1.0)
engine.setProperty('rate', 175)
engine.setProperty('voice', 'zh')
engine.say(line)
engine.runAndWait()
最后再設置一個可以選擇章節的接口傳入主函數,運行程序即可聽到有聲小說的內容
完整代碼
import requests
from lxml import etree
import pyttsx3
def main(a):
#小說的詳情頁
url = 'http://www.xbiquge.la/10/10489/'
#請求內容
response = requests.get(url).text
#轉化成xpath語法可以提取的形式
html = etree.HTML(response)
#提取小說內容頁的網址
data = html.xpath("//div[@class='box_con'][2]/div[@id='list']/dl/dd/a/@href")
#為了節省時間,先只提取一個章節的內容
sound = data[int(a)]
#構造小說內容頁的網址
new_url = 'http://www.xbiquge.la' + str(sound)
#請求
response_1 = requests.get(new_url).content
html_1 = etree.HTML(response_1)
data_1 = html_1.xpath("//div[@id='content']/text()")
#用replace方法將提取到文本中的\xa0替換掉
noval = str(data_1).replace('\\xa0', '')
#替換掉\r
noval_0 = noval.replace("\\r',", '')
noval_1 = noval_0.replace('[', '')
#將爬取到的小說內容存儲到文本文件中
with open('xiaoshuo.txt','w') as f:
f.write(noval_1)
def say(filename='xiaoshuo.txt'):
with open(filename, 'r') as f:
line = f.read()
engine = pyttsx3.init()
engine.setProperty('volume',1.0)
engine.setProperty('rate', 175)
engine.setProperty('voice', 'zh')
engine.say(line)
engine.runAndWait()
if __name__ == '__main__':
a = input('輸入想要朗讀的章節(數字):')
main(a)
say()
等你運行完這個程序,你就會發現機器人的聲音實在是太難聽了.如果想要做更加清晰的有聲小說,可以調用百度人工智能的api接口來實現這個功能