Python pyttsx3庫(kù)實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音功能的示例
前言
在開(kāi)發(fā)語(yǔ)音交互應(yīng)用或需要文本轉(zhuǎn)語(yǔ)音功能的項(xiàng)目時(shí),pyttsx3 是一個(gè)非常實(shí)用的 Python 庫(kù)。它支持離線語(yǔ)音合成,無(wú)需聯(lián)網(wǎng)即可將文本轉(zhuǎn)換為語(yǔ)音。本文將詳細(xì)介紹 pyttsx3 的功能、用法以及常見(jiàn)問(wèn)題的解決方法,并通過(guò)示例代碼幫助你快速上手。
一、pyttsx3 是什么?
pyttsx3是一個(gè)輕量級(jí)的 Python 庫(kù),用于將文本轉(zhuǎn)換為語(yǔ)音。它支持多種語(yǔ)音引擎,包括 Windows 的 SAPI5 和 NSSpeechSynthesizer(Mac),并且可以離線運(yùn)行,無(wú)需依賴外部服務(wù)。
特點(diǎn):
離線運(yùn)行:無(wú)需聯(lián)網(wǎng)即可使用。
多平臺(tái)支持:支持 Windows、Mac 和 Linux。
簡(jiǎn)單易用:API 簡(jiǎn)潔,易于集成到項(xiàng)目中。
可擴(kuò)展性:支持自定義語(yǔ)音引擎和屬性。
二、安裝 pyttsx3
在開(kāi)始之前,確保你已經(jīng)安裝了 pyttsx3??梢酝ㄟ^(guò)以下命令安裝:
pip install pyttsx3
Windows用戶可能需要額外安裝:
pip install pywin32
記得把這兩個(gè)庫(kù)都加到Python解釋器里
安裝完成后,就可以開(kāi)始使用了。
三、pyttsx3 基本用法
1. 初始化引擎
pyttsx3 的核心是 init() 方法,用于初始化語(yǔ)音引擎。默認(rèn)情況下,它會(huì)自動(dòng)選擇系統(tǒng)支持的引擎。
import pyttsx3 # 初始化引擎 engine = pyttsx3.init()
2. 語(yǔ)音播放
使用 say() 方法將文本傳遞給引擎,然后調(diào)用 runAndWait() 方法開(kāi)始播放。
Python示例代碼
import pyttsx3
engine = pyttsx3.init()
engine.say("Hello, welcome to the pyttsx3 tutorial!")
engine.runAndWait()
效果展示:

3. 保存語(yǔ)音到文件
可以將生成的語(yǔ)音保存為 WAV 文件,方便后續(xù)使用。
import pyttsx3
engine = pyttsx3.init()
engine.save_to_file("Hello, welcome to the pyttsx3 tutorial!", "保存語(yǔ)音文件.wav")
engine.runAndWait()
效果展示

4.什么是 .wav 格式?
.wav(Waveform Audio File Format)是一種常見(jiàn)的音頻文件格式,主要用于存儲(chǔ)音頻數(shù)據(jù)。以下是它的主要特點(diǎn):
無(wú)損音頻格式:
.wav是一種無(wú)損音頻格式,能夠完整地保存音頻的原始數(shù)據(jù),不會(huì)因壓縮而損失音質(zhì)。因此,它常用于高質(zhì)量音頻的存儲(chǔ)和編輯。文件較大:
由于.wav是無(wú)損格式,文件通常較大。例如,一分鐘的音頻可能占用幾 MB 的存儲(chǔ)空間。兼容性好:
.wav格式被廣泛支持,幾乎所有的音頻播放器和編輯工具都可以讀取和處理.wav文件。應(yīng)用場(chǎng)景:
語(yǔ)音合成和音頻編輯(如
pyttsx3的輸出)。音頻錄制和后期處理。
音頻分析和研究。
四、語(yǔ)音屬性設(shè)置
pyttsx3 提供了多種屬性設(shè)置,可以自定義語(yǔ)音的速度、音量和聲音。
1. 設(shè)置語(yǔ)音速度
速度的范圍通常在 0 到 200 之間,默認(rèn)值為 200。
Python示例代碼
import pyttsx3
engine = pyttsx3.init()
engine.setProperty('rate', 150) # 設(shè)置速度為 150
engine.say("永遠(yuǎn)相信美好的事情即將發(fā)生 這個(gè)語(yǔ)音速度快嗎")
engine.runAndWait()
效果展示

2. 設(shè)置音量
音量的范圍是 0.0 到 1.0,默認(rèn)值為 1.0。
Python示例代碼
import pyttsx3
engine = pyttsx3.init()
engine.setProperty('volume', 0.5) # 設(shè)置音量為 50%
engine.say("Are you ok! 這個(gè)聲音大嗎 大的話給我點(diǎn)個(gè)贊好嗎?")
engine.runAndWait()
效果展示

3. 設(shè)置聲音
可以切換不同的語(yǔ)音聲音,例如男性或女性聲音。
Python示例代碼
import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
# 切換到第一個(gè)可用的女性聲音
for voice in voices:
if "female" in voice.name.lower():
engine.setProperty('voice', voice.id)
break
engine.say("這是一個(gè)女生的聲音")
engine.runAndWait()
效果展示

五、pyttsx3 函數(shù)和參數(shù)總結(jié)
以下是 pyttsx3 的主要函數(shù)及其參數(shù)的詳細(xì)說(shuō)明:
| 函數(shù)/屬性 | 參數(shù) | 參數(shù)類型 | 說(shuō)明 |
|---|---|---|---|
| init() | driverName | str | 指定語(yǔ)音引擎驅(qū)動(dòng)名稱,默認(rèn)為系統(tǒng)默認(rèn)引擎 |
| say(text) | text | str | 將文本添加到語(yǔ)音隊(duì)列 |
| runAndWait() | 無(wú) | 無(wú) | 開(kāi)始播放語(yǔ)音并等待完成 |
| save_to_file() | text, filename | str, str | 將語(yǔ)音保存到文件,支持 WAV 格式 |
| setProperty() | name, value | str, any | 設(shè)置引擎屬性,如速度、音量、聲音等 |
| getProperty() | name | str | 獲取引擎屬性值 |
| setProperty('rate', value) | value | int | 設(shè)置語(yǔ)音速度,范圍通常為 0-200 |
| setProperty('volume', value) | value | float | 設(shè)置音量,范圍為 0.0-1.0 |
| setProperty('voice', value) | value | str | 設(shè)置語(yǔ)音聲音,值為可用聲音的 ID |
| stop() | 無(wú) | 無(wú) | 停止當(dāng)前語(yǔ)音播放 |
| endLoop() | 無(wú) | 無(wú) | 結(jié)束語(yǔ)音播放循環(huán) |
六、進(jìn)階用法
1. 獲取可用聲音列表
可以列出系統(tǒng)中所有可用的聲音,并選擇特定的聲音。
import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
print("Available voices:")
for i, voice in enumerate(voices):
# 手動(dòng)設(shè)置語(yǔ)言信息
if "Huihui" in voice.name:
voice.languages = ["zh-CN"] # 中文(簡(jiǎn)體)
elif "Zira" in voice.name:
voice.languages = ["en-US"] # 英語(yǔ)(美國(guó))
print(f"{i+1}. {voice.name} - {voice.languages[0]}")效果展示

2. 動(dòng)態(tài)調(diào)整語(yǔ)音屬性
可以在播放過(guò)程中動(dòng)態(tài)調(diào)整語(yǔ)音屬性,例如速度和音量。
Python示例代碼
import pyttsx3
engine = pyttsx3.init()
# 慢速播放
engine.setProperty('rate', 100)
engine.say("這是慢速語(yǔ)音")
# 快速播放
engine.setProperty('rate', 250)
engine.say("這是快速語(yǔ)音")
engine.runAndWait()
效果展示

3. 多語(yǔ)言支持
如果系統(tǒng)支持多語(yǔ)言語(yǔ)音,可以指定語(yǔ)言進(jìn)行語(yǔ)音合成。
Python示例代碼
import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
# 切換到中文語(yǔ)音
for voice in voices:
if "Chinese" in voice.name:
engine.setProperty('voice', voice.id)
break
engine.say("啊阿貍不會(huì)拉桿-pyttsx3!")
engine.runAndWait()
效果展示

4.綜合應(yīng)用-語(yǔ)音助手
import pyttsx3
import datetime
import time
import random
import webbrowser
class SmartVoiceAssistant:
def __init__(self,name="啊阿貍不會(huì)拉桿"):
self.name=name
self.engine=pyttsx3.init()
# 設(shè)置默認(rèn)語(yǔ)音參數(shù)
self.engine.setProperty('rate',160)
self.engine.setProperty('volume',0.9)
# 嘗試設(shè)置女聲(如果有的話)
voices=self.engine.getProperty('voices')
for voice in voices:
if voice.gender=='female'or('female'in voice.name.lower()):
self.engine.setProperty('voice',voice.id)
break
def speak(self,text):
"""說(shuō)話功能"""
print(f"{self.name}:{text}")
self.engine.say(text)
self.engine.runAndWait()
def greet(self):
"""根據(jù)時(shí)間問(wèn)候"""
hour=datetime.datetime.now().hour
if 5<=hour<12:
greeting="早上好!陽(yáng)光明媚,祝你有個(gè)美好的一天。"
elif 12<=hour<18:
greeting="下午好!希望你今天過(guò)得愉快。"
else:
greeting="晚上好!今天過(guò)得怎么樣?"
self.speak(greeting)
def tell_time(self):
"""報(bào)時(shí)功能"""
now=datetime.datetime.now()
time_str=now.strftime("%H點(diǎn)%M分")
self.speak(f"現(xiàn)在是{time_str}")
def tell_date(self):
"""報(bào)日期功能"""
now=datetime.datetime.now()
date_str=now.strftime("%Y年%m月%d日")
weekday_names=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"]
weekday=weekday_names[now.weekday()]
self.speak(f"今天是{date_str},{weekday}")
def tell_weather(self,condition="晴天",temperature="26"):
"""天氣播報(bào)(模擬數(shù)據(jù))"""
weather_templates=[
f"今天天氣{condition},氣溫{temperature}度,是個(gè){self._get_day_comment(condition)}。",
f"氣象部門報(bào)告,今天{condition},溫度{temperature}度。",
f"今日天氣:{condition},{temperature}度。{self._get_weather_advice(condition)}"
]
self.speak(random.choice(weather_templates))
def _get_day_comment(self,condition):
"""根據(jù)天氣給出評(píng)價(jià)"""
good_conditions=["晴天","多云","晴間多云"]
if condition in good_conditions:
return "適合戶外活動(dòng)的好日子"
elif "雨" in condition:
return "適合在家看書的日子"
else:
return "普通的日子"
def _get_weather_advice(self,condition):
"""根據(jù)天氣給出建議"""
if "雨" in condition:
return "記得帶傘哦!"
elif "晴" in condition:
return "記得防曬!"
elif "雪" in condition:
return "注意保暖!"
else:
return "祝你有愉快的一天!"
def read_news(self,news_list):
"""閱讀新聞"""
self.speak("以下是今日熱點(diǎn)新聞:")
for i,news in enumerate(news_list,1):
self.speak(f"新聞{i}:{news}")
time.sleep(0.5)
def set_reminder(self,minutes,message):
"""設(shè)置提醒"""
self.speak(f"好的,我會(huì)在{minutes}分鐘后提醒你{message}")
def reminder_task():
time.sleep(minutes*60)
self.speak(f"提醒時(shí)間到!{message}")
# 在實(shí)際應(yīng)用中,這里應(yīng)該使用線程而不是阻塞
#import threading
# reminder_thread = threading.Thread(target=reminder_task)
# reminder_thread.daemon = True
# reminder_thread.start()
# 為了演示,我們使用以下注釋掉的代碼
# reminder_task()
def tell_joke(self):
"""講笑話"""
jokes=[
"為什么程序員總是分不清萬(wàn)圣節(jié)和圣誕節(jié)?因?yàn)镺ct 31 和 Dec 25 是一樣的。",
"一個(gè)程序員去買菜,妻子叮囑他:'買10個(gè)蘋果,如果看到有香蕉,就買20個(gè)。'結(jié)果他回來(lái)了,帶了20個(gè)蘋果。妻子問(wèn)他怎么回事,他說(shuō):'他們有香蕉。'",
"如何判斷一個(gè)人是否是程序員?問(wèn)他下樓梯要多久,如果他回答'O(n)',那他就是程序員。",
"有一天,程序員的妻子讓他去買東西:'去買一瓶牛奶,如果有雞蛋,買六個(gè)。'程序員回來(lái)后,帶了六瓶牛奶。妻子問(wèn)他:'為什么買六瓶?'他回答:'因?yàn)橛须u蛋。'"
]
self.speak(random.choice(jokes))
def search_web(self,query):
"""模擬網(wǎng)絡(luò)搜索"""
self.speak(f"正在搜索:{query}")
# 實(shí)際應(yīng)用中可以打開(kāi)瀏覽器
webbrowser.open(f"https://www.google.com/search?q={query}")
def interactive_mode(self):
"""交互模式"""
self.greet()
self.speak(f"我是{self.name},你的智能語(yǔ)音助手。有什么我能幫你的嗎?")
self.speak("我可以告訴你時(shí)間、日期、天氣,讀新聞,講笑話,或者設(shè)置提醒。")
# 在實(shí)際應(yīng)用中,這里應(yīng)該有語(yǔ)音識(shí)別和自然語(yǔ)言處理
# 但為了演示,我們使用簡(jiǎn)單的輸入
print("\n可用命令:時(shí)間、日期、天氣、新聞、笑話、提醒、退出")
while True:
command=input("\n請(qǐng)輸入命令: ").strip().lower()
if "退出" in command:
self.speak("再見(jiàn),期待與你的下次相遇!")
break
elif "時(shí)間" in command:
self.tell_time()
elif "日期" in command:
self.tell_date()
elif "天氣" in command:
self.tell_weather()
elif "新聞" in command:
sample_news=[
"科學(xué)家發(fā)現(xiàn)新的治療方法,有望攻克多種疑難雜癥",
"全國(guó)多地加大環(huán)保力度,空氣質(zhì)量顯著改善",
"最新研究表明,每天喝八杯水可能并非必要"
]
self.read_news(sample_news)
elif "笑話" in command:
self.tell_joke()
elif "提醒" in command:
self.speak("你想要我提醒你什么?")
message=input("提醒內(nèi)容: ")
self.speak("幾分鐘后提醒?")
try:
minutes=int(input("分鐘數(shù): "))
self.set_reminder(minutes,message)
except ValueError:
self.speak("抱歉,我沒(méi)有理解這個(gè)時(shí)間")
else:
self.speak("抱歉,我沒(méi)有理解你的命令??梢哉?qǐng)你重新說(shuō)一次嗎?")
# 使用示例
if __name__=="__main__":
assistant=SmartVoiceAssistant()
# 單獨(dú)功能演示
# assistant.greet()
# assistant.tell_time()
# assistant.tell_date()
# assistant.tell_weather("小雨", "22")
# assistant.tell_joke()
# 交互模式
# assistant.interactive_mode()
# 簡(jiǎn)單演示
assistant.speak("演示開(kāi)始")
assistant.greet()
assistant.tell_time()
assistant.tell_weather()
assistant.tell_joke()
assistant.speak("演示結(jié)束,感謝使用!")效果展示

七、常見(jiàn)問(wèn)題與解決方法
1. 語(yǔ)音引擎初始化失敗
如果初始化失敗,可能是因?yàn)橄到y(tǒng)缺少語(yǔ)音引擎。可以嘗試以下方法:
確保系統(tǒng)已安裝語(yǔ)音引擎(如 Windows 的 SAPI5)。
指定驅(qū)動(dòng)名稱初始化:
engine = pyttsx3.init(driverName='sapi5')
2. 語(yǔ)音播放無(wú)聲音
可能的原因包括:
音量設(shè)置為 0。
選擇了無(wú)效的聲音。
系統(tǒng)音量靜音或過(guò)低。
3. 保存的語(yǔ)音文件無(wú)法播放
確保保存的文件路徑正確,并且文件格式支持播放(如 WAV)。
八、總結(jié)
pyttsx3是一個(gè)功能強(qiáng)大且易于使用的文本轉(zhuǎn)語(yǔ)音庫(kù),適合需要離線語(yǔ)音合成的場(chǎng)景。通過(guò)本文的介紹,你應(yīng)該已經(jīng)掌握了 pyttsx3 的基本用法和一些進(jìn)階技巧。希望這些內(nèi)容能幫助你在項(xiàng)目中更好地應(yīng)用 pyttsx3!
到此這篇關(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)文章希望大家以后多多支持腳本之家!
- Python調(diào)用JAR包的類和方法詳細(xì)指南
- Python實(shí)現(xiàn)文件/文件夾復(fù)制功能
- Python實(shí)現(xiàn)無(wú)痛修改第三方庫(kù)源碼的方法詳解
- Python如何使用__slots__實(shí)現(xiàn)節(jié)省內(nèi)存和性能優(yōu)化
- Python+PyQt5實(shí)現(xiàn)多屏幕協(xié)同播放功能
- Python中隨機(jī)休眠技術(shù)原理與應(yīng)用詳解
- 基于Python開(kāi)發(fā)高效文件搜索與內(nèi)容匹配工具
- Python模塊Uvicorn實(shí)戰(zhàn)
相關(guān)文章
python中數(shù)組nums[:]和nums的區(qū)別
本文主要介紹了python中數(shù)組nums[:]和nums的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
python代碼中的縮進(jìn)規(guī)則詳細(xì)解釋(史上最全)
這篇文章主要介紹了代碼縮進(jìn)的重要性以及在Python語(yǔ)言中的具體規(guī)則,代碼縮進(jìn)有助于提高代碼的可讀性和整潔性,并且是Python語(yǔ)言中一個(gè)強(qiáng)制性的語(yǔ)法要求,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
Tensorflow tf.nn.atrous_conv2d如何實(shí)現(xiàn)空洞卷積的
這篇文章主要介紹了Tensorflow tf.nn.atrous_conv2d如何實(shí)現(xiàn)空洞卷積的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
淺談keras 模型用于預(yù)測(cè)時(shí)的注意事項(xiàng)
這篇文章主要介紹了淺談keras 模型用于預(yù)測(cè)時(shí)的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python基于Twilio及騰訊云實(shí)現(xiàn)國(guó)際國(guó)內(nèi)短信接口
這篇文章主要介紹了Python基于Twilio及騰訊云實(shí)現(xiàn)國(guó)際國(guó)內(nèi)短信接口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
從頭學(xué)Python之編寫可執(zhí)行的.py文件
這篇文章主要介紹了從頭學(xué)Python之編寫可執(zhí)行的.py文件,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
python實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

