程序截图
程序源代码
# https://pysimplegui.readthedocs.io/en/latest/
import PySimpleGUI as sg
# https://www.programcreek.com/python/index/322/win32gui
import win32gui
# http://www.selenium.org.cn/
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import keyboard
import time
import sys
# 主题色
sg.theme('DarkAmber')
# 窗口布局
layout = [
[sg.Text('请输入需要转换为语音的文字')],
[sg.Multiline('曾经沧海难为水,除却巫山不是云。', size=(100,10), key='textContent')],
[sg.Button('打开Edge浏览器调用大声朗读', key='ttsButton')]
]
# 创建窗口
window = sg.Window('调用Edge大声朗读功能实现文字转语音', layout)
# 获取所有真实窗口
def get_all_windows():
def call(hwnd, param):
if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
param.append(hwnd)
winds = []
win32gui.EnumWindows(call, winds)
return winds
# 定义文件名和文件路径,保存文本内容到文件
textFilename = "temp.html"
filepath = sys.path[0] + '\\' + textFilename
def saveTextContent(textContent):
with open(textFilename, 'a') as out:
out.truncate(0)
out.write(textContent)
# 定义Edge浏览器驱动变量
edgeDriver = None
# 循环处理事件
while True:
event, values = window.read()
# 用户点击X关闭窗口或点击退出按钮(同时关闭Edge浏览器)
if event == sg.WIN_CLOSED:
if(edgeDriver is not None):
edgeDriver.close()
break
if event == 'ttsButton':
# 获取文字
textContent = values['textContent']
textContent = textContent.replace("\n","</div><br/><div>")
# 将文字保存为文件
saveTextContent('<html><body><div>'+textContent+'</div></body></html>')
# 必须安装了Edge浏览器
# 打开Edge浏览器,地址栏输入查看版本:edge://settings/help
# 官网下载相应版本的驱动,将其放在python安装目录:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
driverFile = r'C:\Users\winds\AppData\Local\Programs\Python\Python37\msedgedriver.exe'
# 未调用过Edge浏览器时才会调用
if(edgeDriver is None):
# 使用Selenium调用Edge浏览器(executable_path参数已被弃用,使用Service对象)
serviceObj = Service(driverFile)
edgeDriver = webdriver.Edge(service=serviceObj)
# 设置浏览器大小
# edgeDriver.set_window_size(400,300)
edgeDriver.maximize_window()
# 打开文件
edgeDriver.get(filepath)
# 暂停1秒
time.sleep(1)
else:
# 已经调用了Edge浏览,则刷新(刷新会隐藏大声朗读控制栏)
edgeDriver.refresh()
# 暂停1秒
time.sleep(1)
# 查找所有窗口
winds = get_all_windows()
edgeWindow = None
edgeTitle = None
edgeClassName = None
for wind in winds:
title = win32gui.GetWindowText(wind)
className = win32gui.GetClassName(wind)
# 判断是否Edge浏览器窗口
if title.find(textFilename)>=0:
edgeWindow = wind
edgeTitle = title
edgeClassName = className
# 将Edge浏览器设为前台窗口
win32gui.SetForegroundWindow(edgeWindow)
# 暂停1秒
time.sleep(1)
# 键盘操作(大声朗读组合键,第一次调出大声朗读控制栏)
keyboard.press_and_release("ctrl+shift+u")
# 暂停1秒
time.sleep(1)
# 键盘操作(大声朗读组合键,第二次时执行大声朗读功能)
keyboard.press_and_release("ctrl+shift+u")
# 暂停1秒
time.sleep(1)
# 执行浏览器朗读快捷键:ctrl+shift+u
# element = edgeDriver.find_element(By.TAG_NAME, 'body')
# element.send_keys(Keys.CONTROL + Keys.SHIFT + 'u') # 组合键操作工具栏大声朗读功能失败
# element.send_keys(Keys.CONTROL + 'a') # 组合键全选功能可以使用(猜测组合键只能对网页中的内容起作用)
window.close()
补充说明
- webdriver 的组合键功能不能调用大声朗读。
- 当文字较多时大声朗读有卡顿现象。
- 大声朗读的中文语音有:Huihui、Kangkang、Yaoyao,另外有时候还会有:Xiaoxiao、Yunyang。(后两个是自然语音,接近真人发音)
- 程序驱动Edge浏览器时不会出现真人发音选项,而直接打开浏览器会出现真人发音选项,狗日的。
网友评论