利用python制作点读翻译软件(基于google api)
摘要:实现点读功能,自动朗读翻译整段。
完整代码git地址:https://github.com/luoqingyu/Read-translation-machine
程序思路:首先是获取要翻译和朗读的英文数据来源,这里假定我们正在阅读PDF,遇到一段有困难的话,我想要实现的是使用鼠标左键将句子整体选上实现朗读和翻译。
1.获取需要翻译的内容:选中需要翻译的句子,ctrl+c复制到剪切板上,利用python读取剪切板内容,获取带翻译数据。
2.朗读:获取到待翻译的数据后,调用pyttsx语言库对文本进行朗读。
3.翻译:获取剪切板内容后,调用googletrans库获取翻译结果。
4.界面显示:主要是显示翻译内容,使用tkinter库绘制界面。
实现效果:
分模块实现
1.获取截切板内容朗读 readCopy.py
#-*- coding: utf-8 -*-
import win32clipboard
import win32clipboard as wc #用以获取剪切板内容的支持库
import win32con
import pyttsx #语言支持库
import chardet
import time
def speakInit():
engine = pyttsx.init() #初始化语音引起
rate = engine.getProperty('rate') #获取初始语速 初始为200我觉得有点快,改成了120
engine.setProperty('rate', 120) #修改初始语速
voices = engine.getProperty('voices') #选择发音人物,听了所有人物,觉得这个id的小姐姐声音好听
engine.setProperty('voice', "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_ZIRA_11.0")
return engine #返回一个初始化好的语言借口
def getCopyText(): #获取剪切板内容
wc.OpenClipboard()
copy_text= wc.GetClipboardData(win32con.CF_TEXT)
wc.CloseClipboard()
return copy_text
old_text = "hi" #剪切板内容更新了才进行朗读
if __name__ == "__main__": #测试函数
old_text = "hi"
engine = speakInit() #初始化语言接口
while (1):
time.sleep(1) #延时1s防止频繁访问剪切板
print chardet.detect(getCopyText()) #打印剪切板内容
if (getCopyText() != old_text): #如果剪切板更新了
try:
engine.say(getCopyText())
time.sleep(1)
engine.say(getCopyText())
engine.runAndWait()
old_text = getCopyText()
except:
pass
2.调用google翻译api testtestGoogletrans.py
#-*- coding: utf-8 -*-
from googletrans import Translator #倒入google翻译包
def translate(sendwords): #编写中文翻译函数
translator = Translator()
return (translator.translate(sendwords,dest='zh-CN').text)
if __name__ == "__main__": #测试函数
print ('20')
words= "We trained a large, deep convolutional neural network"
translate(words)
3.编写界面和主函数 主函数使用了以上两个文件,请保持这些文件在一个文件夹中
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
import tkinter as tk
from googletrans import Translator
import readCopy
import testtestGoogletrans #倒入所需库
old_text = ''
new_text = 'hi'
engine = readCopy.speakInit()
def update_timeText(): #差看剪切板文字是否更新
global old_text
global new_text
new_text = readCopy.getCopyText()
print (new_text+ '+') #显示内容方便调试
print (old_text+'-')
if (new_text != old_text):
try:
words = new_text
result = testtestGoogletrans.translate(words)
Label2.configure(text=result)
Label2.pack
old_text =new_text
window.after(1000, update_timeText) #程序精髓,1S后更新界面
return read_text()
except:
window.after(1000, update_timeText) #有异常也要更新
else:
window.after(1000, update_timeText)
def read_text(): #读剪切板内容
global engine
engine.say(new_text)
engine.runAndWait()
def init(): #界面初始化
window = tk.Tk()
Button1=tk.Button(window, text='再次朗读', command=lambda:read_text())
Button1.place(x=350,y=20)
window.title('daydayup点读机')
window.geometry('400x200')
Label1=tk.Label(window,text='结果')
Label1.place(x=10,y=10)
Label2=tk.Label(window,text='*******', font = ("Arial, 14"),wraplength=300)
Label2.place(x=20,y=40)
return Label2 ,window
if __name__ == "__main__":
Label2,window=init()
engine = readCopy.speakInit()
new_text = readCopy.getCopyText()
try:
words = new_text
result=testtestGoogletrans.translate(words)
Label2.configure(text=result)
Label2.place(x=20, y=40)
Label2.pack()
update_timeText()
window.wm_attributes('-topmost', 1)
window.mainloop()
except:
pass
整理完成