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

news2024/9/23 3:18:22

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

  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. 优化音频质量和文件大小

结果如下

在这里插入图片描述

结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSC7261BH PD20瓦快充芯片

CSC7261BH是一款20瓦内置高压MOS的高性能、多工作模式的PWM控制芯片&#xff0c;内置多种保护机制。当系统为空载和轻载时&#xff0c;CSC7261BH 采用Burst和Green控制模式可有效地减少了空载和轻载时的损耗。当系统为中载和重载时&#xff0c;CSC7261BH采用CCM模式可有效提升电…

【kubernetes】K8S常见的发布方式

一、K8S常见的发布方式 蓝绿发布 两套环境交替升级&#xff0c;旧版本保留一定时间便于回滚 优点&#xff1a;对用户无感&#xff0c;是最安全的发布方式&#xff0c;业务稳定 缺点&#xff1a;需要两套系统&#xff0c;对资源要求比较高&#xff0c;成本特别高 灰度发布&…

STM32标准库学习笔记-3.外部中断

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 中断 中断含义&#xff1a;在计算机执行主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&…

使用docker compose一键部署 Portainer

使用docker compose一键部署 Portainer Portainer 是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 1、创建安装目录 mkdir /data/partainer/ -p && cd /data/partainer2、创建docker…

【C语言篇】数组和函数的实践:扫雷游戏(附源码)

文章目录 前言扫雷游戏的分析和设计扫雷游戏的功能说明游戏的分析和设计文件结构设计 扫雷游戏的代码实现初始化棋盘打印棋盘布置雷排查雷 扫雷游戏的拓展 前言 源码在最后 扫雷游戏的分析和设计 经典扫雷游戏 扫雷游戏的功能说明 使⽤控制台实现经典的扫雷游戏 游戏可以通…

8月14日微语报,星期三,农历七月十一

8月14日微语报&#xff0c;星期三&#xff0c;农历七月十一&#xff0c;工作愉快&#xff0c;生活喜乐&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、巴黎奥运会&#xff1a;32项次世界纪录被刷新&#xff0c;125项次奥运纪录被改写。 2、国家邮政局&#…

鸿蒙应用程序框架基础

鸿蒙应用程序框架基础 应用程序包基础知识应用的多Module设计机制Module类型 Stage模型应用程序包结构开发态包结构编译包形态发布台包结构选择合适的包类型 应用程序包基础知识 应用的多Module设计机制 **支持模块化开发&#xff1a;**一个应用通常会包含多种功能&#xff0…

【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)

多功能智能家居室内灯光控制系统设计与实现 目录&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、项目背景与目标 二、国内外研究现状&#xff1a; 2.1 国内研究现状&#xff1a; 2.2 国外研究现状&#xff1a; 2.3 发展趋势 三、硬件电路设计 3.1 总体概述 3.2 硬件连接总…

[NSSCTF 2022 Spring Recruit]babyphp

if嵌套&#xff0c;先过第一个if&#xff0c;需要a不含数字而且intval取整数 intval:通过使用指定的进制 base 转换&#xff08;默认是十进制&#xff09;&#xff0c;返回变量 value 的 int 数值。 intval() 不能用于 object&#xff0c;否则会产生 E_WARNING 错误并返回 1。…

微服务实战系列之玩转Docker(十)

前言 我们知道Docker的“使命”是为了快速完成应用的迁移和部署。为提升它的战斗能力&#xff0c;Docker官方携手发布了Docker Swarm—— 一个快速完成Docker集群构建的利器。那么请先回忆一下本系列第八篇&#xff08;重点compose&#xff09;和第九篇&#xff08;重点networ…

歌曲爬虫下载

本次编写一个程序要爬取歌曲音乐榜https://www.onenzb.com/ 里面歌曲。有帮到铁子的可以收藏和关注起来&#xff01;&#xff01;&#xff01;废话不多说直接上代码。 1 必要的包 import requests from lxml import html,etree from bs4 import BeautifulSoup import re impo…

Kaggle竞赛——心脏病患者预测与可视化

目录 准备工作1. 特征解释2. 生成探索性数据分析报告2.1 数据集导入2.2 生成数据分析报告 3. 可视化分析3.1 特征相关性分析3.2 患病人数统计3.3 特征与是否患病之间的关系 4. 数据处理4.1 定类数据处理4.2 独热编码 5. 模型搭建5.1 随机森林模型5.2 可视化决策树5.3 特征重要性…

SourceTree基础使用教程

SourceTree基础使用 在B站上搜了不少关于SourceTree的教学视频&#xff0c;多家比较后下面的视频干活比较多 sourcetree使用教程 大概就二十几分钟&#xff0c;跟着学了一个小时&#xff0c;边看边操作&#xff0c;印象更深刻一些 主要涉及以下操作&#xff1a; 1、新建分支…

vue-echarts---折线图 (直接cv就行,全注释)

1、效果展示 2、完整代码&#xff0c;直接cv即可跑起来 <template><div id"mainend"></div> </template><script> import * as echarts from echarts; export default {name: LineChart,mounted() {this.initChart();this.registerUs…

NXP i.MX8系列平台开发讲解 - 4.1.1 GNSS篇(一) - 定位基础知识

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 目录 专用名词&#xff1a; 1. GNSS 概述 1.2 四大GNSS 概述 1.2.1 GPS 1.2.2 BeiDou 1.2.3 GLONASS…

vue3 antdv3 将vxe-grid的头二行改为一行,解决最后一列不能自动根据屏幕的宽度自动缩放的问题。

1、先上个图&#xff1a; 官方地址&#xff1a; Vxe Table v4.6 header搞了二层&#xff0c;然后反馈过来&#xff0c;让调整&#xff1a; {title: 通讯地址,width: 200,showOverflow: tooltip,align: center,sortable: true,filters: companyOptions,filterRender: { name:…

国内首个支持国产化信创的开源云原生平台

国产化信创是指中国本土信息技术和创新产业的发展和推广。随着各种形势的复杂变化&#xff0c;推动国产化和信创已成为信息产业发展的重要方向。在这一背景下&#xff0c;国内的技术企业和开发者们纷纷投入到开源国产化和自主创新的浪潮中&#xff0c;力图摆脱对国外技术和服务…

谷歌开源Gemma-2 百亿参数大模型,性能超越Llama-3模型,免费使用

Gemma 模型 Gemma模型是谷歌发布的一个开源模型&#xff0c;任何人都可以免费下载预训练模型&#xff0c;进行使用。而谷歌最近也发布了Gemma 2 模型&#xff0c;模型参数超过了 200 亿大官&#xff0c;果真大模型最后都是拼参数的时候吗。 Gemma 2 模型发布 Gemma 2 模型可以…

【Linux系统编程】进程间的通信——管道通信

目录 前言&#xff1a; 一&#xff0c;管道的认识 二&#xff0c;管道的深入了解 2-1&#xff0c;管道的特点 2-2&#xff0c;深入学习管道 2-3&#xff0c;管道的特殊情况 三&#xff0c;匿名管道 四&#xff0c;Ubuntu系统和VSCode的使用 4-1&#xff0c;Ubuntu和VSC…

【ARM+Codesys 客户案例 】 基于RK3568/A40i/STM32+CODESYS在智能制造中的应用案例:全自动切片机器人

蔬菜是人们日常生活必不可缺的食品&#xff0c;并且食用方法多种多样。自步入小康社会以来&#xff0c;人们的生活节奏越来越快&#xff0c;很多传统服务已不能满足人们的物质需求和生活节奏。日常生活中通过手工快速切菜严重地威胁着人身安全&#xff0c;切菜时间过长或切菜不…