当前位置: 首页 > news >正文

用AI开发HTML双语阅读工具助力英语阅读

一、问题的提出

开学了,我本学期教授的是大学英语三。所教班级人数多,学生基础参差不齐,为了辅助学生更好地学习英语,我特地制作了一些教学资料供学生自主学习。

双语阅读工具就是其中之一。这个工具的特点是可以导入双语语料库,选择文本分隔方式后,可以以不同的颜色间隔显示原文和译文,便于学生对照和辨识。同时学生还可以一键切换双语的上下位置,转移学生的视觉焦点,提升阅读效率。点击播放,还可以播放当前目录下的音频,这样一款妥妥的自定义的双语英语阅读学习辅助工具。

二、问题的解决

然而实现这一点,其实并不简单。

第一步,我要找到课文原文和译文,通过语料清洗,删除行首的数字、空行,进行除噪后,分别存储为原文和译文两个不同的txt文本,接着再导入到tmxmall的aligner,把文本进行句对齐。

第二步,我还要从tmxmall中导出我对齐的文本,放在Word文件中,把我要标注的单词加粗,并存为【课文.docx】。

第三步,我使用无障碍标注工具,把【课文.docx】文件中的加粗单词进行标注,主要是调用了小牛机器翻译的API,把单词的文中释义标注在单词旁边。如下图所示:

图片

第四步,我们把标注好的文本复制到【课文带释义.TXT】文件当中备用。接着,我们打开ChatGPT,输入以下命令。

我想生成一个可以导入txt文件,用间隔颜色展示双语语料库的html文件,顶部设置有导入、重置、字体放大或缩小按钮,可以播放当前目录下的音频。右侧有滚动条,滚动时,顶部按钮一直显示,界面漂亮、清爽,可以大屏显示,在课堂上使用。可以添加一些必要的功能和参数,给出html代码。

经过不断调试,终于生成了以下代码,大家可以保存到html文件中使用:

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>双语语料库展示</title><style>body {font-family: "Microsoft YaHei", sans-serif;margin: 0;background: linear-gradient(135deg, #f0f3f7, #e6ebef);}header {position: fixed;top: 0;width: 100%;background: linear-gradient(90deg, #2c3e50, #1abc9c);color: white;padding: 12px 20px;display: flex;justify-content: space-between;align-items: center;z-index: 1000;box-shadow: 0 4px 6px rgba(0,0,0,0.2);}#controls {display: flex;gap: 10px;align-items: center;}#controls button, #controls select, #controls input[type="file"] {padding: 6px 12px;font-size: 14px;border-radius: 20px;border: none;cursor: pointer;background: #ecf0f1;color: #2c3e50;box-shadow: 0 2px 4px rgba(0,0,0,0.2);transition: all 0.2s ease;}#controls button:hover, #controls select:hover, #controls input[type="file"]:hover {background: #1abc9c;color: white;}#audioPlayer {height: 32px;}#content {margin-top: 100px;padding: 20px;}.entry {margin-bottom: 20px;border-radius: 12px;box-shadow: 0 4px 8px rgba(0,0,0,0.15);overflow: hidden;transition: transform 0.2s ease, box-shadow 0.2s ease;}.entry:hover {transform: scale(1.02);box-shadow: 0 6px 12px rgba(0,0,0,0.25);}.target {background: #a8e6a3; /* 亮绿色 */padding: 12px;font-weight: bold;font-size: 18px;}.source {background: #aed6f1; /* 亮蓝色 */padding: 12px;font-size: 16px;}</style>
</head>
<body><header><div id="controls"><input type="file" id="fileInput"><select id="parseMode"><option value="oddEven">奇偶行</option><option value="tab">Tab 分隔</option><option value="pipe">| 分隔</option><option value="triple">||| 分隔</option></select><button onclick="resetContent()">重置</button><button onclick="swapPosition()">交换位置</button></div><audio id="audioPlayer" controls><source src="audio.mp3" type="audio/mpeg">你的浏览器不支持音频播放。</audio></header><div id="content"></div><script>let fontSize = 16;let isSwapped = JSON.parse(localStorage.getItem("isSwapped")) || false;document.getElementById('fileInput').addEventListener('change', handleFile);function handleFile(event) {const file = event.target.files[0];if (!file) return;const reader = new FileReader();reader.onload = e => {const lines = e.target.result.split(/\r?\n/).filter(l => l.trim());const mode = document.getElementById("parseMode").value;const entries = parseCorpus(lines, mode);displayEntries(entries);};reader.readAsText(file, "utf-8");}function parseCorpus(lines, mode) {let entries = [];if (mode === "tab") {lines.forEach(line => {const parts = line.split("\t");if (parts.length >= 2) entries.push([parts[1], parts[0]]);});} else if (mode === "pipe") {lines.forEach(line => {const parts = line.split("|");if (parts.length >= 2) entries.push([parts[1], parts[0]]);});} else if (mode === "triple") {lines.forEach(line => {const parts = line.split("|||");if (parts.length >= 2) entries.push([parts[1], parts[0]]);});} else if (mode === "oddEven") {for (let i = 0; i < lines.length; i += 2) {if (i + 1 < lines.length) entries.push([lines[i+1], lines[i]]);}}return entries;}function displayEntries(entries) {const container = document.getElementById("content");container.innerHTML = "";entries.forEach(([target, source]) => {const entry = document.createElement("div");entry.className = "entry";if (isSwapped) {entry.innerHTML = `<div class="source">${source}</div><div class="target">${target}</div>`;} else {entry.innerHTML = `<div class="target">${target}</div><div class="source">${source}</div>`;}container.appendChild(entry);});}function resetContent() {document.getElementById("content").innerHTML = "";}function changeFontSize(delta) {fontSize += delta;document.getElementById("content").style.fontSize = fontSize + "px";}function swapPosition() {isSwapped = !isSwapped;localStorage.setItem("isSwapped", JSON.stringify(isSwapped));// 重新渲染已有条目const entries = [...document.querySelectorAll(".entry")].map(entry => {const target = entry.querySelector(".target").textContent;const source = entry.querySelector(".source").textContent;return [target, source];});displayEntries(entries);}</script>
</body>
</html>

最终的效果如下,可以显示双语、播放音频,同时还带有单词的注释内容。

三、学后总结

这个双语阅读工具,整合文字、音频、注释信息等,而且当鼠标放到指令行还会有突起动画,便于识别。

遗憾的是文本大小设置还有问题,不过可以用ctrl+中键滚动鼠标来实现页面字体放大或缩小。后期可以继续改进这个工具。

外语教学和英语学习过程中,都会遇到的一些个性化的小问题,看起来很难,其实都可以转化技术实现的问题,借助AI大模型,善用提示词,让AI帮助我们,轻松实现我们的编程梦想,把思想转化为现实。

关注我,学习更多Python和大模型在英语教学和学习方面的应用!

http://www.dtcms.com/a/394198.html

相关文章:

  • AI论文速读 | 当大语言模型遇上时间序列:大语言模型能否执行多步时间序列推理与推断
  • 如何使用升腾C92主机搭建本地Linux编译服务器并通过Windows映射访问共享目录
  • 测试DuckDB-rs项目中的示例程序
  • 分布式协议与算法实战-实战篇
  • 【硬件-笔试面试题-105】硬件/电子工程师,笔试面试题(知识点:详细讲讲什么是链表和数组)
  • 【获取地址栏的搜索关键字】功能-总结
  • 关于__sync_bool_compare_and_swap的使用及在多核多线程下使用时的思考
  • 【嵌入式简单外设篇】-433MHz 无线遥控模块
  • 计算机视觉(opencv)实战三十——摄像头实时风格迁移,附多种风格转换
  • 【数据分享】《中国农村统计年鉴》(1985-2024年)全pdf和excel
  • 2025年中国研究生数学建模竞赛“华为杯”C题 围岩裂隙精准识别与三维模型重构完整高质量成品 思路 代码 结果分享!全网首发!
  • [Linux]文件与 fd
  • FFmpeg 深入精讲(二)FFmpeg 初级开发
  • 睡眠脑电技术文章大纲
  • 计算机等级考试Python语言程序设计备考•第二练
  • 【Python】面向对象(一)
  • Jetson 设备监控利器:Jtop 使用方式(安装、性能模式、常用页面)
  • 「数据获取」《商洛统计年鉴》(2001-2024)
  • 链表的探索研究
  • 2025年工程项目管理软件全面测评
  • JAVA算法练习题day17
  • Nacos:服务注册和配置中心
  • Linux 命令行快捷键
  • EasyClick JavaScript Number
  • LeetCode:42.将有序数组转化为二叉搜索树
  • 海外代理IP网站有哪些?高并发场景海外代理IP服务支持平台
  • JavaScript数据交互
  • 11.2.5 自定义聊天室
  • 力扣:字母异味词分组
  • Linux视频学习笔记