Python使用pyttsx3庫(kù)實(shí)現(xiàn)離線文字轉(zhuǎn)語(yǔ)音功能
pyttsx3庫(kù)
0、簡(jiǎn)介
文檔:https://pypi.ac.cn/project/pyttsx3/
pyttsx3 是 Python 輕量級(jí)的離線文本轉(zhuǎn)語(yǔ)音(TTS, Text-to-Speech) 庫(kù),區(qū)別于 gTTS(需要聯(lián)網(wǎng)),它直接調(diào)用操作系統(tǒng)內(nèi)置的語(yǔ)音引擎,無(wú)需網(wǎng)絡(luò)即可實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音,響應(yīng)速度快,且支持跨平臺(tái)(Windows、macOS、Linux)。
# 基礎(chǔ)安裝(Windows 直接可用,Linux/macOS 需額外依賴) pip install pyttsx3 # Linux:需安裝 espeak 和 libespeak1 sudo apt-get install espeak libespeak1 # macOS:若語(yǔ)音異常,可安裝 pyobjc pip install pyobjc
1、基礎(chǔ)文本轉(zhuǎn)語(yǔ)音(入門用法)
import pyttsx3 # 1. 初始化語(yǔ)音引擎 engine = pyttsx3.init() # 2. 設(shè)置要朗讀的文本(支持中文,Windows 自帶中文語(yǔ)音包) text = "你好,我是pyttsx3庫(kù),這是基礎(chǔ)的文本轉(zhuǎn)語(yǔ)音示例。" # 3. 執(zhí)行朗讀(將文本加入朗讀隊(duì)列)(可多次調(diào)用,按順序朗讀) engine.say(text) # 4. 等待朗讀完成(必須調(diào)用,否則程序會(huì)直接結(jié)束,無(wú)語(yǔ)音輸出) engine.runAndWait() # 5. 釋放引擎資源(可選,建議在程序結(jié)束時(shí)調(diào)用) engine.stop()
2、自定義語(yǔ)速、音量(常用配置)
import pyttsx3
# 初始化引擎
engine = pyttsx3.init()
# ========== 1. 調(diào)整語(yǔ)速 ==========
# 獲取當(dāng)前語(yǔ)速(默認(rèn)約200詞/分鐘,值越小越慢)
# getProperty(key):獲取引擎屬性,常用 key 包括 rate(語(yǔ)速)、volume(音量)、voices(語(yǔ)音列表);
current_rate = engine.getProperty('rate')
print(f"當(dāng)前語(yǔ)速:{current_rate}")
# 設(shè)置新語(yǔ)速(建議范圍:100-300)
# setProperty(key, value):設(shè)置引擎屬性,音量值必須在 0.0-1.0 之間,語(yǔ)速值無(wú)嚴(yán)格上限,但建議在 100-300 之間。
engine.setProperty('rate', 150) # 放慢語(yǔ)速
# ========== 2. 調(diào)整音量 ==========
# 獲取當(dāng)前音量(范圍0.0-1.0,默認(rèn)1.0)
current_volume = engine.getProperty('volume')
print(f"當(dāng)前音量:{current_volume}")
# 設(shè)置新音量(0.8表示80%音量)
engine.setProperty('volume', 0.8)
# 朗讀文本
text = "我現(xiàn)在的語(yǔ)速是150詞/分鐘,音量是80%。"
engine.say(text)
engine.runAndWait()
engine.stop()
3、切換語(yǔ)音類型(男聲 / 女聲)
Windows 系統(tǒng)中,中文語(yǔ)音包通常名稱包含 “慧慧”“曉曉” 等,語(yǔ)言代碼為 zh-CN;
若找不到中文語(yǔ)音,可在 Windows 控制面板的 “語(yǔ)音識(shí)別” 中安裝中文語(yǔ)音包。
import pyttsx3
engine = pyttsx3.init()
# 1. 獲取所有可用的語(yǔ)音列表
# voices 是一個(gè)列表,每個(gè)元素是語(yǔ)音對(duì)象,包含 id(唯一標(biāo)識(shí))、name(名稱)、language(語(yǔ)言)等屬性;
voices = engine.getProperty('voices')
print("可用的語(yǔ)音包列表:")
for idx, voice in enumerate(voices):
print(f"序號(hào):{idx},名稱:{voice.name},語(yǔ)言:{voice.languages}")
# 2. 切換語(yǔ)音(以Windows為例,通常0是英文男聲,1是中文女聲)
engine.setProperty('voice', voices[1].id) # 切換到中文女聲
# 3. 朗讀中文文本
engine.say("你好,我是中文女聲,現(xiàn)在切換了語(yǔ)音類型。")
engine.runAndWait()
# (可選)切換回英文男聲
engine.setProperty('voice', voices[0].id)
engine.say("Hello, I am English male voice.")
engine.runAndWait()
engine.stop()
4、中斷正在朗讀的語(yǔ)音(交互場(chǎng)景)
import pyttsx3
import time
import threading
# 初始化引擎
engine = pyttsx3.init()
engine.setProperty('rate', 100) # 放慢語(yǔ)速,方便測(cè)試中斷
# 定義朗讀函數(shù)
def read_long_text():
long_text = "這是一段很長(zhǎng)的文本,用于測(cè)試中斷功能。我會(huì)慢慢朗讀,你可以在朗讀過(guò)程中觸發(fā)中斷。" * 3
engine.say(long_text)
engine.runAndWait()
# 啟動(dòng)朗讀線程(避免阻塞主線程)
read_thread = threading.Thread(target=read_long_text)
read_thread.start()
# 等待3秒后中斷朗讀
time.sleep(3)
print("正在中斷朗讀...")
engine.stop() # 中斷當(dāng)前朗讀
# 等待線程結(jié)束
read_thread.join()
print("朗讀已中斷")
5、批量朗讀文件中的文本(讀取文件 + 語(yǔ)音朗讀)
import pyttsx3
def read_text_from_file(file_path):
# 初始化引擎
engine = pyttsx3.init()
engine.setProperty('rate', 160)
engine.setProperty('volume', 0.9)
try:
# 讀取文件內(nèi)容(指定編碼為utf-8,避免中文亂碼)
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 分段朗讀(避免文本過(guò)長(zhǎng)導(dǎo)致卡頓)
paragraphs = content.split('\n') # 按換行符分段
for para in paragraphs:
if para.strip(): # 跳過(guò)空行
engine.say(para)
engine.runAndWait()
except FileNotFoundError:
print(f"錯(cuò)誤:未找到文件 {file_path}")
except Exception as e:
print(f"讀取文件出錯(cuò):{e}")
finally:
engine.stop()
# 調(diào)用函數(shù),讀取并朗讀txt文件
if __name__ == "__main__":
read_text_from_file("test.txt") # 確保當(dāng)前目錄有test.txt文件,且內(nèi)容為中文/英文
6、將語(yǔ)音保存為音頻文件(擴(kuò)展用法)
pyttsx3 本身不支持直接保存音頻,但可通過(guò) Windows 自帶的 SAPI5 實(shí)現(xiàn)(最簡(jiǎn)便,僅適用于 Windows):
import pyttsx3
from comtypes.client import CreateObject # 需要安裝:pip install comtypes
def text_to_audio(text, output_path):
# 初始化SAPI5語(yǔ)音引擎
speaker = CreateObject("SAPI.SpVoice")
# 初始化音頻流
stream = CreateObject("SAPI.SpFileStream")
# 設(shè)置輸出文件格式(WAV格式)
stream.Open(output_path, 3) # 3 = SPSF_CREATE_ALWAYS
speaker.AudioOutputStream = stream
# 執(zhí)行語(yǔ)音合成并保存
speaker.Speak(text)
# 關(guān)閉流
stream.Close()
# 測(cè)試:將文本保存為WAV文件
if __name__ == "__main__":
text = "這是保存為音頻文件的示例,輸出格式為WAV。"
text_to_audio(text, "output.wav")
print(f"音頻已保存到 output.wav")
到此這篇關(guān)于Python使用pyttsx3庫(kù)實(shí)現(xiàn)離線文字轉(zhuǎn)語(yǔ)音功能的文章就介紹到這了,更多相關(guān)Python pyttsx3離線文字轉(zhuǎn)語(yǔ)音內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python將csv數(shù)據(jù)導(dǎo)入mysql數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了如何使用python將csv數(shù)據(jù)導(dǎo)入mysql數(shù)據(jù)庫(kù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-05-05
解決jupyter notebook啟動(dòng)后沒有token的坑
這篇文章主要介紹了解決jupyter notebook啟動(dòng)后沒有token的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Python中反轉(zhuǎn)二維數(shù)組的行和列問(wèn)題
這篇文章主要介紹了Python中反轉(zhuǎn)二維數(shù)組的行和列問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
pycharm最新免費(fèi)激活碼至2099年(21.3.18親測(cè)可用)
這篇文章主要介紹了pycharm最新的激活碼及激活碼的使用方法,幫助大家更好的利用pycharm學(xué)習(xí)python,感興趣的朋友可以了解下。2021-03-03
Python的Django框架中設(shè)置日期和字段可選的方法
這篇文章主要介紹了Python的Django框架中設(shè)置日期和字段可選的方法,是Django設(shè)置當(dāng)中的基本操作,需要的朋友可以參考下2015-07-07
python pandas.DataFrame選取、修改數(shù)據(jù)最好用.loc,.iloc,.ix實(shí)現(xiàn)
今天小編就為大家分享一篇python pandas.DataFrame選取、修改數(shù)據(jù)最好用.loc,.iloc,.ix實(shí)現(xiàn)。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
簡(jiǎn)單學(xué)習(xí)Python多進(jìn)程Multiprocessing
這篇文章主要和大家一起簡(jiǎn)單的學(xué)習(xí)Python多進(jìn)程Multiprocessing ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08

