概述
实现一个翻译功能,中英文的互相转换。并可以播放翻译后的内容。 翻译接口调用的是百度翻译的api接口。
详细
一、需求分析
使用pygame实现一个翻译功能,并可以播放翻译内容。(模仿百度翻译做一个简单的demo)
二、程序实现
1、初始化pygame环境,声明出页面def renderText(text, position, view=screen):
# 设置字体样式大小
my_font = pygame.font.SysFont("SimHei", 25)
# 渲染文字
text = my_font.render(text, True, (255, 255, 255))
view.blit(text, position)
2、利用easygui弹出框实现内容输入import easygui as g
mg = g.enterbox('需要翻译的内容', title='翻译') # 文本输入框
3、将输入的内容显示到页面上def text(self, text):
global inputstr
self.strtext = text
print("验证 输入的内容呀:" + self.strtext)
renderText(self.strtext, (500, 100))
inputstr = self.strtext
print("inputstr:" + inputstr)
4、翻译功能的实现
翻译的实现,主要是向百度的翻译HTTP接口提交数据,然后获得返回,
实现如下:def GetResult(self):
q = self.strtext # 获取输入的内容
# 判断用户是否输入了内容
if q == "":
print("请先输入内容")
self.content.append("")
else:
print("输入的语句:" + q)
url = 'http://api./api/trans/vip/translate'
salt = str(random.randint(32768, 65536))
sigin = self._appid + q + salt + self._key
print(sigin)
m1 = hashlib.md5()
m1.update(sigin.encode('utf8'))
sign = m1.hexdigest()
print("加密更新后的:" + sign)
myurl = "" # 防止出现myurl未定义错误
for ch in q.encode('utf8'):
if ch > 127:
myurl = url + '?q=' + urllib.parse.quote(q) +
'&from=' + str(self._to) + '&to=' + str(self._from)+
'&appid=' + str(self._appid) + '&salt=' + str(salt)+
'&sign=' + sign
else:
myurl = url + '?q=' + urllib.parse.quote(q) +
'&from=' + str(self._from) + '&to=' + str(self._to)+
'&appid=' + str(self._appid) + '&salt=' + str(salt)+
'&sign=' + sign
response = requests.get(myurl)
data = response.json()
print(data)
length = len(data['trans_result'])
print(len(data['trans_result']))
print_content = "" # 存放翻译后的内容
for i in range(0, length):
if i == 0: # 防止第一行就出现换行
print_content = data['trans_result'][i]['dst']
else:
print_content = print_content + " \n" +
(data['trans_result'][i]['dst'])
print("翻译后的内容:" + print_content)
# self.t.delete(0.0, END) # 删除之前翻译出的内容
if self.content: # 判断self.content中是否存有之前翻译的内容,如果有,清空
self.content.clear()
self.content.append(print_content)
5、显示翻译后的内容def showTextAfterTrans(self):
global afterTransText
renderText(self.afterTransText, (500, 350))
afterTransText = self.afterTransText
6、语音播放功能
自己申请一个百度AI接口就可以def voice():
# 百度AI接口
APP_ID = 'XX'
API_KEY = 'XXXX'
SECRET_KEY = 'XXXX'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
global afterTransText
q = afterTransText.strip()
print("语音播放函数:")
print(q)
result = client.synthesis(q, 'zh', 4, {
'vol': 5
})
print(result)
# 识别正确返回语音二进制 错误则返回dict
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
f.close()
os.system('audio.mp3')
为了方便看清楚整个思路实现过程,贴出整体代码如下:# utf-8
import pygame
import random
import hashlib
import urllib
import requests
from aip import AipSpeech
import os
import easygui as g
from pygame.locals import *
# 初始化pygame环境
pygame.init()
# 创建窗口
# screen = pygame.display.set_mode((1280, 720))
screen = pygame.display.set_mode((1400, 750))
# 背景图片
background = pygame.image.load("background.png").convert()
# 转换语言按钮图片
buttonimage = "btnlanchange.png"
# 翻译按钮图片
btntransimage = "btntranslate.png"
# 语音播放按钮图片
btnvoiceimage = "btnvoice.png"
# 清除内容按钮图片
btnclearimage = "btnclear.png"
# 翻译后的内容
afterTransText = ""
font = pygame.font.SysFont('simsunnsimsun',30)
flag = False
btnx = 0 # 图片位置X坐标
btny = 0 # 图片位置Y坐标
w = 0 # 获取到的按钮图片的宽度
h = 0 # 获取到的按钮图片的高度
inputstr = "" # 通过弹出框输入的内容
mg = "" # 弹框输入的内容
# 按钮类
class Button(object):
def __init__(self, bimage, position):
self.buttonimage = pygame.image.load(bimage).convert()
self.position = position
def render(self):
global btnx, btny, w, h
w, h = self.buttonimage.get_size() # 获取图片的长和宽
# print("wh:")
# print(w, h)
x, y = self.position # 获取传入的位置参数
# print("xy:" + str(x), str(y))
btnx = x - w / 2 # 最终画出的位置x坐标
btny = y - h / 2 # 最终画出的位置y坐标
# print("画图片时的btnx,btny:")
# print(btnx, btny)
screen.blit(self.buttonimage, (btnx, btny))
'''
经输出验证:翻译按钮在画布上的坐标(825.0,255.0);语言转换按钮在画布上的坐标(620.0,52.5)
语音播放按钮在画布上的坐标(825.0,375.0);清除按钮在画布上的坐标(825.0,98.0)
'''
# 创建转换按钮button对象
button = Button(buttonimage, (665, 65))
# 创建翻译按钮btntranslate对象
btntranslate = Button(btntransimage, (850, 280))
# 创建语音播放按钮btnvoice对象
btnvoice = Button(btnvoiceimage, (850, 400))
# 创建文字清除按钮btnclear对象
btnclear = Button(btnclearimage, (850, 120))
# 写文字方法
def renderText(text, position, view=screen):
# 设置字体样式大小
my_font = pygame.font.SysFont("SimHei", 25)
# 渲染文字
text = my_font.render(text, True, (255, 255, 255))
view.blit(text, position)
# 显示源语言和目标语言
def language():
global flag
if not flag:
renderText("英文", (550, 50))
renderText("中文", (730, 50))
else:
renderText("中文", (550, 50))
renderText("英文", (730, 50))
# 源语言与目标语言转换按钮函数
def changeLan():
global flag
if flag:
flag = False
print(flag)
else:
flag = True
print(flag)
# 翻译实现类
class Translate:
def __init__(self):
self.strtext = ""
self.afterTransText = ""
self.content = [] # 定义空数组存放取到的内容
self._from = 'en'
self._to = 'zh'
self._appid = '自己申请的id'
self._key = '自己申请的key'
# 输入内容的函数
def text(self, text):
global inputstr
self.strtext = text
print("验证 输入的内容呀:" + self.strtext)
renderText(self.strtext, (500, 100))
inputstr = self.strtext
print("inputstr:" + inputstr)
# 触发的翻译函数
def afterTrans(self):
self.GetResult()
self.afterTransText = " " # 执行一次清空一次
print("验证清空吗?:" + self.afterTransText)
for item in self.content:
self.afterTransText = self.afterTransText + item
print("我是翻译完要显示的字符串呀:" + self.afterTransText)
# 存储并显示 翻译完的 句子的函数(防止点击翻译,显示完内容后 被刷新冲掉)
def showTextAfterTrans(self):
global afterTransText
renderText(self.afterTransText, (500, 350))
afterTransText = self.afterTransText
# 抓取翻译后返回的数据
def GetResult(self):
q = self.strtext # 获取输入的内容
# 判断用户是否输入了内容
if q == "":
print("请先输入内容")
self.content.append("")
else:
print("输入的语句:" + q)
url = 'http://api./api/trans/vip/translate'
salt = str(random.randint(32768, 65536))
sigin = self._appid + q + salt + self._key
print(sigin)
m1 = hashlib.md5()
m1.update(sigin.encode('utf8'))
sign = m1.hexdigest()
print("加密更新后的:" + sign)
myurl = "" # 防止出现myurl未定义错误
for ch in q.encode('utf8'):
if ch > 127:
myurl = url + '?q=' + urllib.parse.quote(q) + '&from=' + str(self._to) + '&to=' + str(
self._from) + '&appid=' + str(self._appid) + '&salt=' + str(salt) + '&sign=' + sign
else:
myurl = url + '?q=' + urllib.parse.quote(q) + '&from=' + str(self._from) + '&to=' + str(
self._to) + '&appid=' + str(self._appid) + '&salt=' + str(salt) + '&sign=' + sign
response = requests.get(myurl)
data = response.json()
print(data)
length = len(data['trans_result'])
print(len(data['trans_result']))
print_content = "" # 存放翻译后的内容
for i in range(0, length):
if i == 0: # 防止第一行就出现换行
print_content = data['trans_result'][i]['dst']
else:
print_content = print_content + " \n" + (data['trans_result'][i]['dst'])
print("翻译后的内容:" + print_content)
# self.t.delete(0.0, END) # 删除之前翻译出的内容
if self.content: # 判断self.content中是否存有之前翻译的内容,如果有,清空
self.content.clear()
self.content.append(print_content)
# 语音播放函数
def voice():
# 百度AI接口
APP_ID = '自己申请的id'
API_KEY = '自己申请的key'
SECRET_KEY = '自己申请的秘钥'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
global afterTransText
q = afterTransText.strip()
print("语音播放函数:")
print(q)
result = client.synthesis(q, 'zh', 4, {
'vol': 5
})
print(result)
# 识别正确返回语音二进制 错误则返回dict
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
f.close()
os.system('audio.mp3')
# 删除已输入内容函数
def clear():
global inputstr
inputstr = "点此输入需要翻译的内容"
# 创建translate的对象
translate = Translate()
def start():
global flag # 语言状态标志
isFirst = True
while True:
# 显示背景图
screen.blit(background, (0, 0))
# 显示翻译按钮图片
btntranslate.render()
# 显示语言栏
language()
# 显示语言转换按钮
button.render()
# 显示语音播放按钮
btnvoice.render()
# 显示清除按钮
btnclear.render()
# 显示输入的文本
# translate.text()
if isFirst:
renderText("点击此处输入翻译的内容", (500, 100))
else:
renderText(inputstr, (500, 100))
# 显示翻译后的文本内容
translate.showTextAfterTrans()
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT: # 监测是否按下退出按钮
pygame.quit()
exit()
elif event.type == pygame.MOUSEBUTTONDOWN: # 判断鼠标是否按下
pressed_array = pygame.mouse.get_pressed()
if pressed_array:
pos = pygame.mouse.get_pos() # 取到鼠标的坐标位置
mouse_x = pos[0]
mouse_y = pos[1]
print("鼠标点击坐标:")
print(mouse_x, mouse_y)
# 判断鼠标位置是否在 转换 按钮范围内
if 620.0 <= mouse_x <= 710.0 and 52.5 <= mouse_y <= 77.5:
print('我是语言转换按钮呀...') # 点击后触发的函数
changeLan() # 调用源语言与目标语言转换栏
# 判断鼠标坐标位置是否属于 翻译 按钮的坐标位置
elif 825.0 <= mouse_x <= 875.0 and 255.0 <= mouse_y <= 305.0:
print("我是翻译按钮呀...")
translate.afterTrans()
# 判断鼠标坐标位置是否属于 语音播放 按钮的坐标位置
elif 825.0 <= mouse_x <= 875.0 and 375.0 <= mouse_y <= 425.0:
print("我是播放语音按钮呀...")
voice()
elif 825.0 <= mouse_x <= 875.0 and 98.0 <= mouse_y <= 142:
print("我是清除按钮啊...")
clear()
elif 500.0 <= mouse_x <= 600.0 and 100.0 <= mouse_y <= 200.0:
print("弹出框....")
mg = g.enterbox('需要翻译的内容', title='翻译') # 文本输入框
text_surface = font.render(mg, True, (0, 0, 255))
print(mg) #
# g.textbox(msg="内容", title="", text=mg)
# 自动识别并把语言栏转换
for ch in mg.encode('utf8'):
if ch > 127:
flag = True
language()
else:
flag = False
language()
# 输入内容以后 需要把之前在这显示的内容清除
renderText(" ", (500, 100))
isFirst = False
translate.text(mg)
if __name__ == '__main__':
start()
以上可实现简单的翻译,转载请联系授权。