构建具有音频功能的中英翻译器:一个Python应用程序的旅程

在当今的全球化世界中,语言翻译工具变得越来越重要。作为一名软件开发者,我最近完成了一个有趣的项目:一个结合了翻译、文字转语音和数据管理功能的中英翻译器。在这篇博客中,我将分享这个应用程序的主要特性和开发过程中的一些见解。

C:\pythoncode\new\travlelanguage.py

全部代码

python 复制代码
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开发的,主要功能包括:

  1. 中英文翻译
  2. 文本转语音(TTS)
  3. 音频文件的保存和播放
  4. 数据管理(包括保存到数据库和导出到Excel)
  5. 音频文件合并

主要特性详解

1. 翻译功能

使用Google Translate API实现翻译功能。用户输入中文文本后,程序会自动将其翻译成英文。这为快速理解和学习新词汇提供了便利。

2. 文本转语音

集成了pyttsx3库来实现文本转语音功能。用户可以听到翻译后的英文发音,这对于语言学习者来说是一个很有价值的功能。

3. 音频管理

应用程序允许用户保存生成的音频文件,并可以随时播放。这为创建个人化的语音库提供了可能。

4. 数据管理

所有的翻译记录都保存在SQLite数据库中,用户可以方便地查看、删除记录。此外,还可以将数据导出为Excel文件,便于进一步分析或共享。

5. 音频合并

用户可以选择多个音频文件并将它们合并成一个单独的MP3文件。这个功能对于创建自定义的语音课程或复习材料非常有用。

技术细节

  • GUI框架:使用wxPython创建用户界面
  • 翻译API:Google Translate(通过deep_translator库)
  • 数据库:SQLite
  • 音频处理:pydub和pygame库
  • Excel导出:openpyxl库

开发过程中的挑战和解决方案

  1. 兼容性问题:在集成不同库时遇到了一些兼容性问题,特别是与wxPython和音频处理库相关的问题。通过仔细研究文档和在线社区的帮助,最终解决了这些问题。

  2. 性能优化:处理大量数据和音频文件时,性能是一个挑战。通过优化数据库查询和使用异步处理来改善了应用程序的响应性。

  3. 用户体验:设计一个直观且功能丰富的界面是一个挑战。通过多次迭代和用户反馈,不断改进了界面设计。

未来改进计划

  1. 支持更多语言对
  2. 添加语音识别功能,实现语音输入
  3. 实现云同步,使用户可以在多个设备上访问他们的翻译和音频数据
  4. 优化音频质量和文件大小

结果如下

结论

开发这个中英翻译器不仅是一次有趣的编程练习,更是一次探索语言学习工具潜力的旅程。通过结合翻译、语音和数据管理功能,我们创造了一个功能丰富的应用程序,它不仅可以帮助用户翻译文本,还能辅助语言学习过程。

相关推荐
夏木~36 分钟前
Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率
数据库·oracle
Dream_Snowar38 分钟前
速通Python 第四节——函数
开发语言·python·算法
W215538 分钟前
Liunx下MySQL:表的约束
数据库·mysql
西猫雷婶39 分钟前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
黄名富43 分钟前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
汪洪墩1 小时前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
一个程序员_zhangzhen2 小时前
sqlserver新建用户并分配对视图的只读权限
数据库·sqlserver
zfj3212 小时前
学技术学英文:代码中的锁:悲观锁和乐观锁
数据库·乐观锁··悲观锁·竞态条件
吴冰_hogan2 小时前
MySQL InnoDB 存储引擎 Redo Log(重做日志)详解
数据库·oracle