python應用(2):寫個python程序給自己用


用python寫一個程序,然后在命令行上執行,看不到界面(UI),這種程序很常見了,叫命令行程序。然而很多人,特別是不懂程序的人,更需要看到的是一個有界面的,能通過鼠標操作的程序,畢竟已經邁進“窗口”的時代,雖然Dos還存在。所以,怎么用python弄出有界面的程序呢?

界面也是一個工具,所以,有沒有界面工具庫呢?必須得有,而且有很多個,你搜索“python界面庫”就可以看到很多這方面的介紹,而我要介紹的,是python最早就有的tkinter,通過它來實現界面程序。

tkinter內置在python中,所以不用再安裝,直接import進來使用就是了。沿用上一節介紹的文本轉語音的程序,我現在要寫一個界面程序,上面有兩個按鈕,一個用來選擇文本文件,一個是“轉換成語音”,來看看怎么實現吧。

(1)TTS的GUI程序

from tkinter import *
import tkinter.messagebox as msgbox
import tkinter.filedialog as filedlg
import os
import pyttsx3
from pydub import AudioSegment
import threading

txtfile = ""
window = Tk()
pathlabel = Label(window, text="...")

def fileFunc():
    default_dir = "文件路徑"
    global txtfile
    global pathlabel
    txtfile = filedlg.askopenfilename(title="選擇文件", initialdir=(os.path.expanduser(default_dir)))
    (path, fname) = os.path.split(txtfile)
    pathlabel["text"] = fname

def converThreadFunc(content):
    outfile = "out.aiff"
    tts = pyttsx3.init()
    tts.save_to_file(content, outfile)
    tts.runAndWait()

def convertFunc():
    if len(txtfile) == 0:
        msgbox.showinfo("提示", "請先選擇文本文件")
        return
    content = open(txtfile, "r", encoding="utf-8").read()
    if len(content)==0:
        msgbox.showinfo("提示", "文本文件沒有內容,轉換終止,不輸出語音文件")
        return
    t1 = threading.Thread(target=converThreadFunc, args=(content,))
    t1.start()
    t1.join()
    outfile = "out.aiff"
    AudioSegment.from_file(outfile).export("out.mp3", format="mp3")
    msgbox.showinfo("提示", "轉換成功,程序目錄下的out.mp3就是最終的語音文件:%s" % os.getcwd())
    os.system("open '%s'" % os.getcwd())
    
def main():
    window.title("TTS-文本轉換語音")
    window.geometry("320x320+100+100")
    filebtn = Button(window, text="選擇文本文件", command=fileFunc)
    convertbtn = Button(window, text="轉換成語音", command=convertFunc)
    filebtn.place(x=10, y=10)
    pathlabel.place(x=10, y=40)
    convertbtn.place(x=10, y=80)
    window.mainloop()

if __name__=="__main__":
    main()

抓重點來看。

1、使用了tkinter的控件,messagebox是提示框,filedialog是文件選擇控件,再比如Button跟Label,這些都是常用的控件,它們的創建跟屬性設置,也有不少詳情,你可以搜索來了解。

2、這里用place方法來設置控件的位置,類似的方法還有pack、grid等。

3、業務邏輯上,重點是處理兩個按鈕的點擊事件,也就是那兩個def出來的xxFunc函數了。

4、文本轉語音的處理,使用了上節介紹的代碼,也沒有什么神秘的。

5、pyttsx3.engine的函數runAndWait在執行完后會結束當前線程,所以,不能在主線程即UI線程來執行這個函數,而要啟動一個thread來執行它,否則runAndWait執行后主界面就會消失,這不是預期的事情。

運行起來后的一個截圖是這樣的:
tts-gui截圖

程序弄好了,先不管它丑不丑吧,至少功能可以用了。如果是自己使用的話,那怎么樣才能快速地啟用這個程序呢?

(2)結合alfred來調用程序

之前介紹過怎么在mac系統上快速地切換或啟動一個程序,使用的工具就是alfred,這是一個超級好用的工具。那現在再次使用alfred來啟用剛才寫的程序。

關於alfred的安裝或使用,網上很多介紹,我之前介紹“mac環境與工具”時也有介紹,但是,這里有一個地方要注意:手動用終端執行上面的python程序是可以正常運作的,但一旦通過alfred執行python程序,那在AudioSegment.form_file時就會異常,最終export不出語音文件,就算直接在python代碼中執行ffmpeg命令也一樣會失敗,判斷是,alfred執行python腳本的情況下,AudioSegment(包括它使用的ffmpeg)沒有權限訪問文件。 考慮到這種情況,就要變通一下了:讓alfred打開一個新的終端,並且讓這個終端執行python程序--按這個思路來制作工具。

1、在alfred上新建一個“Script Filter”:
tts激活入口

2、新的terminal會執行cmd.sh腳本,這個腳本是這樣的:

cd '/Users/freejet/Library/Application Support/Alfred 3/Alfred.alfredpreferences/workflows/user.workflow.4D91A493-39F3-433C-9D33-65917236A6F5'
source ~/Desktop/pyenv/bin/activate
python3 demo_gui.py

先是cd到這個alfred腳本即workflow所在的目錄,這個目錄路徑你可以通過右鍵workflow找到,然后激活python3的環境(第一節介紹到的內容),最后執行python程序也就是上面介紹的“TTS的GUI程序”。

把這個cmd.sh放到當前workflow的目錄中,這樣alfred才能找到它。

3、執行一下,效果是這樣的:
tts運行效果

最后的那個out.mp3就是最終想要的文件,你可以聽一下(如果你是在公眾號內看到這篇文章的話):
(out.mp3試聽)

對應的文本是這樣的:

瑤草一何碧,春入武陵溪。溪上桃花無數,花上有黃鸝,我欲穿花尋路,直入白雲深處,浩氣展虹霓。只恐花深里,紅露濕人衣。坐玉石,欹玉枕,拂金徽。謫仙何處,天人伴我白螺杯。我為靈芝仙草,不為朱唇丹臉,長嘯亦何為!醉舞下山去,明月逐人歸。——宋.黃庭堅《水調歌頭.游覽》

你已經開始吐槽了吧:這語音效果怎么這么差!

傳統的TTS就這樣子了,有得聽就不錯了,如果想要“有感情”的效果那一般要使用成熟的語音合成接口,或者自己訓練一個出來。但不管語音效果怎么樣,本文的目的已經達到了:怎么用python寫一個程序,然后給自己快速地調用到。so,see you。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM