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

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

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

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

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

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

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

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

4.綜合應(yīng)用-語音助手
import pyttsx3
import datetime
import time
import random
import webbrowser
class SmartVoiceAssistant:
def __init__(self,name="啊阿貍不會拉桿"):
self.name=name
self.engine=pyttsx3.init()
# 設(shè)置默認語音參數(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):
"""說話功能"""
print(f"{self.name}:{text}")
self.engine.say(text)
self.engine.runAndWait()
def greet(self):
"""根據(jù)時間問候"""
hour=datetime.datetime.now().hour
if 5<=hour<12:
greeting="早上好!陽光明媚,祝你有個美好的一天。"
elif 12<=hour<18:
greeting="下午好!希望你今天過得愉快。"
else:
greeting="晚上好!今天過得怎么樣?"
self.speak(greeting)
def tell_time(self):
"""報時功能"""
now=datetime.datetime.now()
time_str=now.strftime("%H點%M分")
self.speak(f"現(xiàn)在是{time_str}")
def tell_date(self):
"""報日期功能"""
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"):
"""天氣播報(模擬數(shù)據(jù))"""
weather_templates=[
f"今天天氣{condition},氣溫{temperature}度,是個{self._get_day_comment(condition)}。",
f"氣象部門報告,今天{condition},溫度{temperature}度。",
f"今日天氣:{condition},{temperature}度。{self._get_weather_advice(condition)}"
]
self.speak(random.choice(weather_templates))
def _get_day_comment(self,condition):
"""根據(jù)天氣給出評價"""
good_conditions=["晴天","多云","晴間多云"]
if condition in good_conditions:
return "適合戶外活動的好日子"
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("以下是今日熱點新聞:")
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"好的,我會在{minutes}分鐘后提醒你{message}")
def reminder_task():
time.sleep(minutes*60)
self.speak(f"提醒時間到!{message}")
# 在實際應(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=[
"為什么程序員總是分不清萬圣節(jié)和圣誕節(jié)?因為Oct 31 和 Dec 25 是一樣的。",
"一個程序員去買菜,妻子叮囑他:'買10個蘋果,如果看到有香蕉,就買20個。'結(jié)果他回來了,帶了20個蘋果。妻子問他怎么回事,他說:'他們有香蕉。'",
"如何判斷一個人是否是程序員?問他下樓梯要多久,如果他回答'O(n)',那他就是程序員。",
"有一天,程序員的妻子讓他去買東西:'去買一瓶牛奶,如果有雞蛋,買六個。'程序員回來后,帶了六瓶牛奶。妻子問他:'為什么買六瓶?'他回答:'因為有雞蛋。'"
]
self.speak(random.choice(jokes))
def search_web(self,query):
"""模擬網(wǎng)絡(luò)搜索"""
self.speak(f"正在搜索:{query}")
# 實際應(yīng)用中可以打開瀏覽器
webbrowser.open(f"https://www.google.com/search?q={query}")
def interactive_mode(self):
"""交互模式"""
self.greet()
self.speak(f"我是{self.name},你的智能語音助手。有什么我能幫你的嗎?")
self.speak("我可以告訴你時間、日期、天氣,讀新聞,講笑話,或者設(shè)置提醒。")
# 在實際應(yīng)用中,這里應(yīng)該有語音識別和自然語言處理
# 但為了演示,我們使用簡單的輸入
print("\n可用命令:時間、日期、天氣、新聞、笑話、提醒、退出")
while True:
command=input("\n請輸入命令: ").strip().lower()
if "退出" in command:
self.speak("再見,期待與你的下次相遇!")
break
elif "時間" 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)新的治療方法,有望攻克多種疑難雜癥",
"全國多地加大環(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("抱歉,我沒有理解這個時間")
else:
self.speak("抱歉,我沒有理解你的命令??梢哉埬阒匦抡f一次嗎?")
# 使用示例
if __name__=="__main__":
assistant=SmartVoiceAssistant()
# 單獨功能演示
# assistant.greet()
# assistant.tell_time()
# assistant.tell_date()
# assistant.tell_weather("小雨", "22")
# assistant.tell_joke()
# 交互模式
# assistant.interactive_mode()
# 簡單演示
assistant.speak("演示開始")
assistant.greet()
assistant.tell_time()
assistant.tell_weather()
assistant.tell_joke()
assistant.speak("演示結(jié)束,感謝使用!")效果展示

七、常見問題與解決方法
1. 語音引擎初始化失敗
如果初始化失敗,可能是因為系統(tǒng)缺少語音引擎。可以嘗試以下方法:
確保系統(tǒng)已安裝語音引擎(如 Windows 的 SAPI5)。
指定驅(qū)動名稱初始化:
engine = pyttsx3.init(driverName='sapi5')
2. 語音播放無聲音
可能的原因包括:
音量設(shè)置為 0。
選擇了無效的聲音。
系統(tǒng)音量靜音或過低。
3. 保存的語音文件無法播放
確保保存的文件路徑正確,并且文件格式支持播放(如 WAV)。
八、總結(jié)
pyttsx3是一個功能強大且易于使用的文本轉(zhuǎn)語音庫,適合需要離線語音合成的場景。通過本文的介紹,你應(yīng)該已經(jīng)掌握了 pyttsx3 的基本用法和一些進階技巧。希望這些內(nèi)容能幫助你在項目中更好地應(yīng)用 pyttsx3!
到此這篇關(guān)于Python pyttsx3庫實現(xiàn)文本轉(zhuǎn)語音功能的示例的文章就介紹到這了,更多相關(guān)Python pyttsx3文本轉(zhuǎn)語音內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中數(shù)組nums[:]和nums的區(qū)別
本文主要介紹了python中數(shù)組nums[:]和nums的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Tensorflow tf.nn.atrous_conv2d如何實現(xiàn)空洞卷積的
這篇文章主要介紹了Tensorflow tf.nn.atrous_conv2d如何實現(xiàn)空洞卷積的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python基于Twilio及騰訊云實現(xiàn)國際國內(nèi)短信接口
這篇文章主要介紹了Python基于Twilio及騰訊云實現(xiàn)國際國內(nèi)短信接口,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
從頭學(xué)Python之編寫可執(zhí)行的.py文件
這篇文章主要介紹了從頭學(xué)Python之編寫可執(zhí)行的.py文件,具有一定參考價值,需要的朋友可以了解下。2017-11-11

