听写工具
朗读语言
语速
词表(每行一个,可填中文 / 英文 / 拼音)
自定义词库/语音播报/自动批改
朗读语言
语速
词表(每行一个,可填中文 / 英文 / 拼音)
· 基于浏览器 Web Speech API 朗读,无需联网
· 自带 6 个例词,可整段替换:每行一个词 / 句
· 按 Enter 提交答案,空格 重听
了解工具定位 · 使用场景 · 对比优势
小学生家长每天需要给孩子听写课本生字词,但口音不准、速度难控制、反复念读费嗓子。使用本工具,家长只需将本周生词批量导入自定义词库,工具自动生成标准语音播报,支持逐词间隔调节和随机乱序,孩子独立完成听写后自动批改错字,家长只需查看错误报告针对性巩固。
英语学习者背单词时常常只认形不认音,听写时听不出单词。本工具支持自定义词库导入(如雅思核心词汇、教材单元词汇),语音播报可选择英音/美音、正常/慢速,听写完成后自动比对拼写,高亮错误字母并显示正确拼写,帮助建立音形对应关系。
医学生需要大量听写拉丁文药名、解剖学名词,这些词汇在通用听写软件中无法识别。使用本工具的自定义词库功能,将教材附录的术语表批量导入,语音播报按专业发音规则朗读,自动批改时能准确识别复杂字母组合,大幅提升专业词汇听写效率。
备考语文古诗词默写时,容易写错同音字(如‘坐’与‘座’)。本工具支持将整首诗词作为词库导入,语音播报朗读诗句原文,用户逐句默写后自动批改,标记错别字并给出正确写法。对于长诗词,可分段听写,降低记忆负担,精准定位易错字。
| 维度 | 本工具 | 竞品 A(讯飞听见) | 传统方法(纸笔听写) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,音频和文本均不上传服务器 | 音频上传至云端转写 | 完全本地,无电子数据留存 |
| 处理速度 | 实时转写,无网络延迟 | 上传后需等待数秒至数分钟 | 人工逐字听写,速度取决于操作者 |
| 离线可用 | 完全离线,不依赖网络 | 必须联网使用 | 完全离线 |
| 自定义词库 | 支持导入专业术语/生僻词库 | 支持行业词库,需付费或定制 | 无,完全依赖人工识别 |
| 自动批改 | 支持语音播报后自动比对并标记错误 | 提供转写文本,无自动批改功能 | 人工对照批改,耗时且易遗漏 |
| 语音播报 | 内置播报功能,可调节语速/重复次数 | 无播报功能,仅提供转写 | 需另备录音设备或人工朗读 |
| 收费模式 | 免费,无使用次数限制 | 按转写时长收费(约 0.33 元/分钟起) | 仅需纸笔,时间成本高 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 今天天气真好,我们去公园散步吧。 | 今天天气真好,我们去公园散步吧。 | 典型场景:标准普通话短句听写 |
| 人工智能(AI)是计算机科学的一个分支,它企图了解智能的实质。 | 人工智能(AI)是计算机科学的一个分支,它企图了解智能的实质。 | 典型场景:含英文缩写和括号的学术句子 |
| 窸窸窣窣 饕餮 魑魅魍魉 茕茕孑立 沆瀣一气 | 窸窸窣窣 饕餮 魑魅魍魉 茕茕孑立 沆瀣一气 | 边界 case:生僻字词听写,测试词库覆盖率 |
| 第1章 绪论 1.1 研究背景 1.2 研究意义 1.3 国内外研究现状 | 第1章 绪论 1.1 研究背景 1.2 研究意义 1.3 国内外研究现状 | 边界 case:含数字序号和换行的结构化文本 |
| 他说:“你确定吗?”她回答:“是的,我确定。” | 他说:“你确定吗?”她回答:“是的,我确定。” | 易错 case:中英文引号混用,测试标点处理 |
| 我是中国人,我爱我的祖国。我是中国人,我爱我的祖国。 | 我是中国人,我爱我的祖国。我是中国人,我爱我的祖国。 | 易错 case:重复句子,测试自动批改能否识别 |
| (空输入) | 请输入听写内容 | 边界 case:空输入,测试空值处理 |
苹果, 香蕉, 橘子苹果
香蕉
橘子词库按行解析,逗号、空格会被当作词的一部分,导致语音播报时读出标点或产生意外停顿。
苹果
香蕉苹果
香蕉空行会被解析为一个空词,自动批改时可能匹配到空白字符,导致误判为错误。
speed: 10(最高速)speed: 3~5听写训练需要留出书写时间;速度过快会导致用户来不及写,失去训练效果。
输入 "Apple" 但词库是 "apple",标记为错误开启大小写忽略选项(如支持)或统一使用小写默认批改是精确匹配,大小写不一致会被判错;若训练目标不区分大小写,需手动统一。
苹果
苹果
香蕉苹果
香蕉重复词条会导致同一个词被播报两次,浪费听写轮次,且批改时可能产生重复标记。
第1课
hello!第一课
hello语音播报引擎对数字和符号的发音可能不符合预期(如 "!" 读作 "感叹号"),干扰听写训练。
手机通知音与语音播报同时播放开启勿扰模式或关闭系统通知系统提示音会打断听写节奏,导致用户漏听或误听播报内容。
公式推导 · 流程图解 · 依据出处
Score = (Correct / Total) × 100
Score — 听写正确率(百分比)Correct — 用户输入与标准答案完全匹配的字数Total — 本次听写总字数听写 20 个词,用户正确写出 17 个。则 Correct=17, Total=20, Score = (17 / 20) × 100 = 85%。批改结果:正确率 85%,错词 3 个(如“晨曦”误写为“晨希”)。
适用于工具内置的自动批改功能,基于逐字精确匹配(含多音字容错)。不适用于自由听写(无标准答案)或语义相似但字形不同的场景。
3 种主流语言 · 复制即用
import pyttsx3
import difflib
# 语音播报:将文本转为语音
engine = pyttsx3.init()
engine.say("请听写以下词语:苹果、香蕉、橘子")
engine.runAndWait()
# 自动批改:对比听写结果与标准答案
def auto_grade(user_input: str, answer: str) -> dict:
user_words = user_input.replace(",", ",").split(",")
answer_words = answer.split("、")
ratio = difflib.SequenceMatcher(None, user_words, answer_words).ratio()
return {
"correct_count": sum(1 for u, a in zip(user_words, answer_words) if u.strip() == a.strip()),
"total": len(answer_words),
"accuracy": round(ratio * 100, 1)
}
# 示例
result = auto_grade("苹果,香蕉,桔子", "苹果、香蕉、橘子")
print(result) # {'correct_count': 2, 'total': 3, 'accuracy': 66.7}package main
import (
"fmt"
"strings"
"github.com/sajari/fuzzy"
)
// 自动批改:基于模糊匹配计算准确率
func autoGrade(userInput, answer string) (int, int, float64) {
userWords := strings.Split(userInput, ",")
answerWords := strings.Split(answer, "、")
model := fuzzy.NewModel()
model.SetThreshold(1)
model.Train(answerWords)
correct := 0
for i, u := range userWords {
if i < len(answerWords) && strings.TrimSpace(u) == strings.TrimSpace(answerWords[i]) {
correct++
}
}
accuracy := float64(correct) / float64(len(answerWords)) * 100
return correct, len(answerWords), accuracy
}
func main() {
correct, total, acc := autoGrade("苹果,香蕉,桔子", "苹果、香蕉、橘子")
fmt.Printf("正确 %d/%d,准确率 %.1f%%\n", correct, total, acc) // 正确 2/3,准确率 66.7%
}// 语音播报:使用 Web Speech API
function speak(text) {
const utterance = new SpeechSynthesisUtterance(text);
utterance.lang = 'zh-CN';
speechSynthesis.speak(utterance);
}
speak('请听写以下词语:苹果、香蕉、橘子');
// 自动批改:对比用户输入与标准答案
function autoGrade(userInput, answer) {
const userWords = userInput.split(/[,,]/).map(w => w.trim());
const answerWords = answer.split(/[、,]/).map(w => w.trim());
let correct = 0;
userWords.forEach((word, i) => {
if (i < answerWords.length && word === answerWords[i]) correct++;
});
return {
correct,
total: answerWords.length,
accuracy: Math.round((correct / answerWords.length) * 100 * 10) / 10
};
}
console.log(autoGrade('苹果,香蕉,桔子', '苹果、香蕉、橘子'));
// { correct: 2, total: 3, accuracy: 66.7 }9 个高频疑问