使用pyttsx3實現簡單tts服務

操作系統:Windows 10_x64
python版本:Python 3.9.2_x64
pyttsx3版本: 2.90
 
pyttsx3是一個tts引擎包裝器,可對接SAPI5、NSSS(NSSpeechSynthesizer)、espeak等引擎,實現統一的tts接口。

 pyttsx3的地址:https://pypi.org/project/pyttsx3/

 幫助文檔地址:https://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)

運行效果如下:

 

 本文涉及資源下載地址:https://pan.baidu.com/s/1Dc8zlL2fs8p4ebF916WyXQ

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章