在当今的全球化世界中,语言翻译工具变得越来越重要。作为一名软件开发者,我最近完成了一个有趣的项目:一个结合了翻译、文字转语音和数据管理功能的中英翻译器。在这篇博客中,我将分享这个应用程序的主要特性和开发过程中的一些见解。
C:\pythoncode\new\travlelanguage.py
全部代码
import wx
import wx.grid
import sqlite3
import datetime
import os
from deep_translator import GoogleTranslator
import pyttsx3
from pydub import AudioSegment
import pygame
import openpyxl
class TranslatorFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Chinese-English Translator', size=(800, 600))
panel = wx.Panel(self)
self.chinese_text = wx.TextCtrl(panel, pos=(5, 5), size=(200, 25))
self.translate_button = wx.Button(panel, label='Translate', pos=(210, 5), size=(70, 25))
self.english_text = wx.TextCtrl(panel, pos=(5, 35), size=(200, 25))
self.speak_button = wx.Button(panel, label='Speak', pos=(210, 35), size=(70, 25))
self.save_button = wx.Button(panel, label='Save', pos=(285, 35), size=(70, 25))
self.grid = wx.grid.Grid(panel, pos=(5, 70), size=(780, 400))
self.grid.CreateGrid(0, 3)
self.grid.SetColLabelValue(0, "Chinese")
self.grid.SetColLabelValue(1, "English")
self.grid.SetColLabelValue(2, "WAV Path")
# Add buttons for all features
self.play_button = wx.Button(panel, label='Play', pos=(5, 480), size=(70, 25))
self.merge_button = wx.Button(panel, label='Merge', pos=(80, 480), size=(70, 25))
self.export_button = wx.Button(panel, label='Export to Excel', pos=(155, 480), size=(100, 25))
self.select_all_button = wx.Button(panel, label='Select All', pos=(260, 480), size=(70, 25))
self.open_db_button = wx.Button(panel, label='Open DB', pos=(335, 480), size=(70, 25))
self.delete_button = wx.Button(panel, label='Delete Selected', pos=(410, 480), size=(100, 25))
self.translate_button.Bind(wx.EVT_BUTTON, self.on_translate)
self.speak_button.Bind(wx.EVT_BUTTON, self.on_speak)
self.save_button.Bind(wx.EVT_BUTTON, self.on_save)
self.play_button.Bind(wx.EVT_BUTTON, self.on_play)
self.merge_button.Bind(wx.EVT_BUTTON, self.on_merge)
self.export_button.Bind(wx.EVT_BUTTON, self.on_export)
self.select_all_button.Bind(wx.EVT_BUTTON, self.on_select_all)
self.open_db_button.Bind(wx.EVT_BUTTON, self.on_open_db)
self.delete_button.Bind(wx.EVT_BUTTON, self.on_delete_selected)
self.translator = GoogleTranslator(source='zh-CN', target='en')
self.engine = pyttsx3.init()
self.conn = sqlite3.connect('travelenglish.db')
self.create_table()
self.Show()
def create_table(self):
cursor = self.conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS travelenglish
(chinese TEXT, english TEXT, wav_path TEXT)''')
self.conn.commit()
def on_translate(self, event):
chinese = self.chinese_text.GetValue()
english = self.translator.translate(chinese)
self.english_text.SetValue(english)
def on_speak(self, event):
english = self.english_text.GetValue()
self.engine.say(english)
self.engine.runAndWait()
def on_save(self, event):
chinese = self.chinese_text.GetValue()
english = self.english_text.GetValue()
wav_path = f"audio_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}.wav"
self.engine.save_to_file(english, wav_path)
self.engine.runAndWait()
cursor = self.conn.cursor()
cursor.execute("INSERT INTO travelenglish VALUES (?, ?, ?)", (chinese, english, wav_path))
self.conn.commit()
self.update_grid()
def update_grid(self):
cursor = self.conn.cursor()
cursor.execute("SELECT * FROM travelenglish")
rows = cursor.fetchall()
self.grid.ClearGrid()
current_rows = self.grid.GetNumberRows()
if current_rows < len(rows):
self.grid.AppendRows(len(rows) - current_rows)
elif current_rows > len(rows):
self.grid.DeleteRows(0, current_rows - len(rows))
for i, row in enumerate(rows):
for j, value in enumerate(row):
self.grid.SetCellValue(i, j, str(value))
def on_play(self, event):
selected_rows = self.grid.GetSelectedRows()
if selected_rows:
wav_path = self.grid.GetCellValue(selected_rows[0], 2)
pygame.mixer.init()
pygame.mixer.music.load(wav_path)
pygame.mixer.music.play()
def on_merge(self, event):
selected_rows = self.grid.GetSelectedRows()
wav_paths = [self.grid.GetCellValue(row, 2) for row in selected_rows]
combined = AudioSegment.empty()
for wav_path in wav_paths:
sound = AudioSegment.from_wav(wav_path)
combined += sound
output_path = f"merged_{datetime.datetime.now().strftime('%Y%m%d')}_{len(wav_paths)}.mp3"
combined.export(output_path, format="mp3")
wx.MessageBox(f"Merged audio saved as {output_path}", "Merge Complete")
def on_export(self, event):
with wx.FileDialog(self, "Save Excel file", wildcard="Excel files (*.xlsx)|*.xlsx",
style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:
if fileDialog.ShowModal() == wx.ID_CANCEL:
return
pathname = fileDialog.GetPath()
try:
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = "Translation Data"
# Add headers
headers = ["Chinese", "English", "WAV Path"]
for col, header in enumerate(headers, start=1):
sheet.cell(row=1, column=col, value=header)
# Add data
for row in range(self.grid.GetNumberRows()):
for col in range(self.grid.GetNumberCols()):
sheet.cell(row=row+2, column=col+1, value=self.grid.GetCellValue(row, col))
workbook.save(pathname)
wx.MessageBox(f"Data exported to {pathname}", "Export Complete")
except IOError:
wx.LogError(f"Cannot save file '{pathname}'.")
def on_select_all(self, event):
self.grid.SelectAll()
def on_open_db(self, event):
self.update_grid()
wx.MessageBox("Database table loaded into grid", "Open Database")
def on_delete_selected(self, event):
selected_rows = self.grid.GetSelectedRows()
if not selected_rows:
wx.MessageBox("No rows selected", "Delete Error")
return
dlg = wx.MessageDialog(self, "Are you sure you want to delete the selected records?",
"Confirm Deletion", wx.YES_NO | wx.ICON_QUESTION)
result = dlg.ShowModal()
dlg.Destroy()
if result == wx.ID_YES:
cursor = self.conn.cursor()
for row in sorted(selected_rows, reverse=True):
chinese = self.grid.GetCellValue(row, 0)
english = self.grid.GetCellValue(row, 1)
wav_path = self.grid.GetCellValue(row, 2)
# Delete from database
cursor.execute("DELETE FROM travelenglish WHERE chinese=? AND english=? AND wav_path=?",
(chinese, english, wav_path))
# Delete WAV file
if os.path.exists(wav_path):
os.remove(wav_path)
self.conn.commit()
self.update_grid()
wx.MessageBox(f"{len(selected_rows)} record(s) deleted", "Delete Complete")
if __name__ == '__main__':
app = wx.App()
frame = TranslatorFrame()
app.MainLoop()
应用程序概述
这个应用程序是使用Python开发的,主要功能包括:
- 中英文翻译
- 文本转语音(TTS)
- 音频文件的保存和播放
- 数据管理(包括保存到数据库和导出到Excel)
- 音频文件合并
主要特性详解
1. 翻译功能
使用Google Translate API实现翻译功能。用户输入中文文本后,程序会自动将其翻译成英文。这为快速理解和学习新词汇提供了便利。
2. 文本转语音
集成了pyttsx3库来实现文本转语音功能。用户可以听到翻译后的英文发音,这对于语言学习者来说是一个很有价值的功能。
3. 音频管理
应用程序允许用户保存生成的音频文件,并可以随时播放。这为创建个人化的语音库提供了可能。
4. 数据管理
所有的翻译记录都保存在SQLite数据库中,用户可以方便地查看、删除记录。此外,还可以将数据导出为Excel文件,便于进一步分析或共享。
5. 音频合并
用户可以选择多个音频文件并将它们合并成一个单独的MP3文件。这个功能对于创建自定义的语音课程或复习材料非常有用。
技术细节
- GUI框架:使用wxPython创建用户界面
- 翻译API:Google Translate(通过deep_translator库)
- 数据库:SQLite
- 音频处理:pydub和pygame库
- Excel导出:openpyxl库
开发过程中的挑战和解决方案
-
兼容性问题:在集成不同库时遇到了一些兼容性问题,特别是与wxPython和音频处理库相关的问题。通过仔细研究文档和在线社区的帮助,最终解决了这些问题。
-
性能优化:处理大量数据和音频文件时,性能是一个挑战。通过优化数据库查询和使用异步处理来改善了应用程序的响应性。
-
用户体验:设计一个直观且功能丰富的界面是一个挑战。通过多次迭代和用户反馈,不断改进了界面设计。
未来改进计划
- 支持更多语言对
- 添加语音识别功能,实现语音输入
- 实现云同步,使用户可以在多个设备上访问他们的翻译和音频数据
- 优化音频质量和文件大小
结果如下
结论
开发这个中英翻译器不仅是一次有趣的编程练习,更是一次探索语言学习工具潜力的旅程。通过结合翻译、语音和数据管理功能,我们创造了一个功能丰富的应用程序,它不仅可以帮助用户翻译文本,还能辅助语言学习过程。