使用pyttsx3實現簡單tts服務
作業系統:Windows 10_x64
python版本:Python 3.9.2_x64
pyttsx3版本: 2.90
pyttsx3是一個tts引擎包裝器,可對接SAPI5、NSSS(NSSpeechSynthesizer)、espeak等引擎,實現統一的tts介面。

pyttsx3的地址://pypi.org/project/pyttsx3/
幫助文檔地址://pyttsx3.readthedocs.org/
安裝pyttsx3依賴包:
pip install pyttsx3
介面介紹
1、init介面
使用的具體引擎可以在init裡面指定:
pyttsx3.init([driverName : string, debug : bool]) → pyttsx3.Engine
入參:
driverName : 可選,用於指定tts引擎,若未指定,則使用系統默認引擎。
- sapi5 – windows環境
- nsss – Mac OS X環境
- espeak – 非windows和Mac OS X 的其它系統
debug : 可選,用於指定是否開啟調試功能,若未指定,則不開啟。

2、engine介面
使用init介面初始完畢,會返回engine對象。
engine對象的方法如下:

- connect
註冊回調函數用於訂閱事件。
入參及出參
connect(topic : string, cb : callable) → dict
topic :訂閱事件的名稱,有效的名稱
cb : 回調函數
返回token資訊,可用於後續取消訂閱。
可用事件如下:
started-utterance
引擎開始說話時觸發,回調函數定義如下:
onStartUtterance(name : string) -> None
started-word
引擎說詞語時觸發,回調函數定義如下:
onStartWord(name : string, location : integer, length : integer) -> None
finished-utterance
引擎說話結束時觸發,回調函數定義如下:
onFinishUtterance(name : string, completed : bool) -> None
error
引擎遇到錯誤時觸發,回調函數定義如下:
onError(name : string, exception : Exception) -> None
- disconnect
反註冊回調函數。
disconnect(token : dict)
token是connect函數返回的數據。
- endLoop
結束正在運行的事件循環。
- getProperty
獲取tts的屬性,比如語速、嗓音、音量等。
getProperty(name : string) -> object
參數:
name – 屬性名稱
object – 屬性對象
屬性列表:
rate – 語速
voice – 嗓音
voices – 嗓音集,列出 pyttsx3.voice.Voice 裡面定義的所有嗓音
volume – 音量
- isBusy
判斷當前引擎是否在執行文本轉語音。
isBusy() -> bool
返回值:
True – 正在執行文本轉語音
False – 未執行
- iterate
當使用外部事件循環時,該方法需要被調用。
- runAndWait
runAndWait() -> None
執行快取的命令並等待完成。
- save_to_file
執行語音轉文本操作,並生成音頻文件。
save_to_file(text : unicode, filename : string, name : string)
參數:
text – 要執行轉語音的文本
filename – 文件名稱
name – 可選,註冊需要通知的關鍵字
示例:
engine.save_to_file(‘Hello World’ , ‘test.mp3’)
- say
執行語音轉文本操作,並播放文本內容。
say(text : unicode, name : string) -> None
參數:
text – 要執行轉語音的文本
name – 可選,註冊需要通知的關鍵字
示例:
engine.say(‘I will speak this text!’, ‘speak’)
- setProperty
設置tts的屬性,比如語速、嗓音、音量等。
setProperty(name, value) -> None
參數:
name – 屬性名稱
value – 屬性值
屬性列表:
rate – 語速,設置每分鐘說幾個字
voice – 嗓音,可以設置不同嗓音的說話人
volume – 音量,介於0到1的小數
- startLoop
開始事件循環。
startLoop([useDriverLoop : bool]) -> None
- stop
停止當前正在運行的文本轉語音並清理命令隊列。
使用示例
1、使用pyttsx3播放語音及生成文件
簡單示例:
#! /usr/bin/env python3 #-*- coding:utf-8 -*- # pip install pyttsx3 import pyttsx3 def onStart(name): print('starting',name) def onWord(name,location,length): print('word',name,location,length) def onEnd(name,completed): print('finishing',name,completed) engine = pyttsx3.init() # 註冊回調函數 engine.connect('started-utterance', onStart) engine.connect('started-word', onWord) engine.connect('finished-utterance', onEnd) # 語音轉文本測試(直接播放) engine.say("I will speak this text") engine.say('I will speak this text!', 'speak') # 註冊 speak 關鍵字,進行事件通知 engine.say("我可以說話了") # 語音轉文本測試(文件存儲到磁碟) engine.save_to_file('我可以說話了', 'test.mp3') # 運行並等待 engine.runAndWait()
運行效果如下:

2、使用pyttsx3搭建簡單的tts服務
這裡使用tornado搭建簡單的http服務(tornado是一個開源的網路伺服器框架),來實現tts服務。
時序如下:

主邏輯程式碼如下:
def text2File(text,dstFile): engine = pyttsx3.init() engine.save_to_file(text,dstFile) engine.runAndWait() class MainHandler(tornado.web.RequestHandler): def get(self): tmpFile = "1.mp3" print("get",self.request.arguments) text = self.get_query_argument("text").strip() print("text : %s" % text) if len(text) > 0 : text2File(text,tmpFile) self.set_header('content-type', 'audio/mpeg') fbin = open(tmpFile,"rb").read() self.set_header('Content-Length', len(fbin)) self.set_header('Content-Disposition', 'attachment;filename="%s"'%tmpFile) self.write(fbin) self.finish() else: self.set_header('content-type', 'application/json') self.finish(json.dumps({"result" : "input text "})) def post(self): print("post") print(self.request.arguments)
運行效果如下:

可關注微信公眾號(聊聊博文)後回復 2022040401 獲得提取碼。