用LLM提高语音转文本的准确率

张开发
2026/4/10 21:02:55 15 分钟阅读

分享文章

用LLM提高语音转文本的准确率
语音转文本转换也称为自动语音识别ASR或音频转录是将口语音频转换为书面文本的过程生成的文本称为转录稿。虽然基于 Transformer 的模型现已广泛应用于语音转文本转换但对于较小或资源匮乏的语言它们的性能仍然较差。一个转录错误就可能完全改变句子的意思。对于某些语言如芬兰语拆分复合词或扭曲专有名词有时就足以使转录稿令人困惑、误导甚至无法使用。在我们的项目中我们处理一些少数民族语言如芬兰语的语音转文本转换。虽然最先进的模型如 OpenAI 的gpt-4o-transcribe或开源的 Whisper 模型如WhisperX系列提供了令人印象深刻的语音转文本性能但它们对少数民族语言的准确性仍然不如英语等主要语言。最常见的语音转文本错误通常分为三类插入错误模型添加了未被说出的额外词汇删除错误模型删除了被说出的词汇替换错误模型用错误的词汇替换正确的词汇拼写错误拼写错误、形态变化或由发音引起的扭曲这些错误会降低可读性有时甚至完全改变转录稿的含义。微调是提高转录质量的一种方法。但它需要大量标记的音频和文本数据来训练更强的模型而对于许多语言或领域来说这些数据的可用性是一个挑战。在本文中我们将讨论如何评估语音转文本质量识别模型产生的最常见的转录错误开发基于大语言模型LLM的后转录音频转录增强方法并评估该增强方法。这种方法专注于提高芬兰语数据的语音转文本质量然而它可以很容易地定制为任何其他语言。双通道基于大语言模型的增强方法的整体思路如下使用任何语音转文本模型生成转录稿将转录稿发送到大语言模型进行拼写聚焦修复通道通道1将结果发送到大语言模型进行第二个上下文感知修复通道通道2这种方法显著提高了转录稿质量。虽然它最初是为芬兰语设计的但可以通过更新双通道提示词来匹配特定语言的模式从而适配其他语言。转录增强流程使用双通道大语言模型方法作者提供的图片这种方法是我们GAIK 项目工具包的独立软件组件参见此链接可以通过以下方式安装pip install gaik[enhance-transcript]GAIK 工具包 提供了一整套组件和指导用于构建以知识为中心的生成式 AI 解决方案从战略方向到可部署的实现在此链接内容。本文讨论的完整代码可在 GitHub 上找到。让我们开始吧。1. 评估语音转文本质量有两种方法可以评估语音转文本质量。第一种方法是主观的需要手动比较转录文本称为假设与语音对应的正确文本称为参考。另一种方法是客观的使用质量指标比较假设和参考转录稿。我们将在本文中使用这种方法因为它提供了一种一致且可测量的方式来比较转录稿质量。语音转文本质量最常见的客观指标是词错误率WER它衡量假设转录稿中与参考转录稿不同的词汇数量。WER 基于替换、删除和插入错误计算方法如下WER (S D I) / N * 100%其中S 替换数D 删除数I 插入数N 参考转录稿中的总词数WER 越低越好。除了上述指标外我还使用了拼写错误率因为许多语音转文本错误并非完全错误的词汇它们是接近正确的拼写。例如“hammas” 与 “hamas”以及“Vastuuhenkilö” 与 “Vastuu henkilö”。这些基本上是替换错误但它们比不相关的替换更接近预期的词汇。换句话说每个拼写错误都是替换错误但并非每个替换错误都是拼写错误。为了测量这一点我使用了莱文斯坦距离Levenshtein distance它是衡量两个字符串之间相似性的指标。较小的莱文斯坦距离意味着两个词更相似。如果转录稿词元和参考词元之间的归一化距离小于或等于 0.4我将其视为类似拼写的替换。莱文斯坦距离和归一化距离的计算方法如下莱文斯坦距离 min(插入数 删除数 替换数) 归一化距离 莱文斯坦距离 / 参考词元长度我使用 Python 库jiwer来计算 WER、替换率、删除率和插入率。基于莱文斯坦距离的拼写相似性使用 Python 库rapidfuzz计算。side_by_side_compare.py脚本参见 GitHub 仓库对参考和假设文本进行归一化使用jiwer逐词对齐并计算 WER、替换率、删除率、插入率以及单独的拼写错误率等指标。下图展示了如何检测和突出显示上述错误。请注意某些错误可能既是替换错误又是拼写错误。真实文本REF和转录文本HYP并排对比的片段作者提供的图片2. 识别最常见的转录问题在开发基于大语言模型的转录错误修复方法之前我分析了最常见的语音转文本错误。请注意此分析侧重于芬兰语音频记录然而相同的方法可以应用于任何其他语言。为此我分析了多个芬兰语音频记录的参考转录稿和语音转文本假设通过side_by_side_compare.py生成的并排比较。我还使用大语言模型审查这些参考-假设对并识别最常见的错误模式。我在芬兰语转录中发现了以下问题错误的品牌名称和专有名词接近正确的人名变体错误拆分的复合词破损或不一致的连字符扭曲的外来词芬兰语形态错误拼写错误相同术语使用不一致缺失的词汇额外插入的词汇错误的词汇替换其中一些错误不会影响可读性和/或准确性。例如缺失短功能词或添加填充词通常不会非常大地改变句子的整体含义。其他错误可能会影响可读性和准确性。拆分的复合词、扭曲的名称和错误的替换可能使句子令人困惑或完全改变其含义。大多数频繁的语音转文本问题可以通过基于大语言模型的后转录修复方法解决。大语言模型可以利用其对芬兰语拼写、词汇、形态和上下文的了解进行有针对性的更正。我使用此分析设计了一种基于大语言模型的双通道转录稿增强方法。3. 基于大语言模型的双通道转录后增强这种方法在不添加任何额外信息、不删除重要信息和不重新生成完整转录稿的情况下对转录稿进行有针对性的修复。有针对性的修复对于保持转录稿的正确部分完整减少重新生成产生的幻觉可能性同时只关注需要更正的部分非常重要。TranscriptEnhancer软件组件 将这种方法实现为双通道提示词管道。它以原始转录稿由语音转文本模型生成作为输入并生成增强版本以及包含所有更改详细信息的可选结构化输出。在这些实验中我使用 OpenAI 的gpt-5.4模型进行转录稿增强。然而该方法是模型无关的其他模型也应该以相同的方式工作。31 通道1拼写和一致性修复在TranscriptEnhancer中通道1enhance_transcript.py中的PASS1_SYSTEM_PROMPT专注于更正拼写并在整个转录稿中保持一致性。它不考虑句子结构或语法。它查看单个词元并对它们进行归一化。通道1的主要目标是更正拼写错误归一化重复术语使它们一致修复专有名词的大小写修复明显的复合词分词问题完全按原样保留数字通道1保持严格的字数不添加或删除词汇因为激进的改写可能会引入幻觉。我发现保持编辑最小化使输出更加安全。通道1中最重要的规则是绝不删除词汇保持标点和词序不变只进行局部更正除非预期拼写明显否则保留专有名称不重新解释数字如果不确定保持原样不变完整的通道1提示词PASS1_SYSTEM_PROMPT请参阅 GAIK 工具包的enhance_transcript.py软件组件。3.2 通道2基于上下文的修复通道2enhance_transcript.py中的PASS2_SYSTEM_PROMPT接收通道1的输出并修复需要句子级上下文的部分。与按词元工作的通道1不同通道2跨周围的从句阅读以决定是否需要修复。通道2的主要目标是合并拆分的复合词拆分错误合并的词修复连字符插入缺失的短功能词提高整个转录稿的一致性我也在通道2中保持严格的规则。我不想让模型将转录稿改写成精美的书面芬兰语。我希望它忠实于口语芬兰语因为如果转录稿变得过于精美它就不再像口语了。我在通道2中包含了一个插入预算。模型每100个词的转录稿最多可以插入2个词。这有助于降低产生幻觉或不必要的添加的风险。通道2中最重要的规则是保留口语芬兰语保持编辑小而局部绝不改写整个句子只在语法强烈需要时才插入短功能词绝不编造名称、品牌或事实不确定的情况保持原样不变完整的通道2提示词PASS2_SYSTEM_PROMPT请参阅 GAIK 工具包的enhance_transcript.py软件组件。3.3 构建 TranscriptEnhancer 组件为了使双通道工作流可重用我将其打包成一个名为TranscriptEnhancer的类它将双通道大语言模型增强管道封装到一个可重用的对象中。enhancer TranscriptEnhancer( api_configconfig, use_azureFalse, # 使用标准 OpenAI API 密钥 )enhance_text()方法从字符串中读取转录稿enhance_file()方法从文本文件中读取转录稿。当调用TranscriptEnhancer类的enhance_text()或enhance_file()方法时转录稿会经过通道1和通道2。两个通道完成后类返回一个包含原始转录稿和增强版本的TranscriptEnhancerResult对象。该类还接受一些可选参数使分析更容易。如果generate_summaryTrue组件会计算增强过程中进行了多少次插入、删除和替换。如果diff_chunksTrue它会返回转录稿中哪些部分发生更改的列表。两种方法都使用SequenceMatcher并在两个通道完成后的最终结果上操作。可以通过additional_instructions传递额外指令这些指令会附加到第二通道提示词中。此选项可用于需要额外规则的特定领域转录稿例如保留公司名称或产品术语。最终结果存储在 Pydantic 模型中可以使用model_dump()或model_dump_json()导出为 Python 字典或 JSON 对象。有关TranscriptEnhancerResult类的完整实现请参阅 GAIK 工具包的 enhance_transcript.py 脚本。以下是导入、初始化和使用TranscriptEnhancer对象的示例。此示例存在于 GitHub 仓库 的enhanced_transcript_example.py中。TranscriptEnhancer类作为 GAIK 工具包的软件组件导入。从 GAIK 工具包的config.py导入的get_openai_config方法配置并创建 OpenAI 和 Azure 客户端。相同的配置脚本还设置了大语言模型名称在本例中为gpt-5.4。当我们使用 OpenAI 的 API 密钥时我们设置use_azure False。from gaik.software_components.enhance_transcript import ( TranscriptEnhancer, get_openai_config, ) config get_openai_config(use_azureFalse) enhancer TranscriptEnhancer(api_configconfig) # 从那里我们可以增强原始字符串enhancer.enhance_text # 或文本文件enhancer.enhance_file。 result enhancer.enhance_file( transcript_file, generate_summaryTrue, diff_chunksTrue, additional_instructions( 完全按原样保留所有公司名称。 ), )当generate_summaryTrue时结果包含更改了多少词以及以何种方式更改的详细信息。CorrectionSummary(total_changes3, insertions0, deletions0, substitutions3)当diff_chunksTrue时结果包含原始和增强转录稿之间所有修改部分的列表。result enhancer.enhance_text( transcript_textHei, 23.8.2025 Vetämän Kaltenbach-sahalla viereinen turva-aita toimii yleisenä liinatelineenä. Vastuu henkilö otti havainnon käsittelyyn., diff_chunksTrue, ) for chunk in result.diff_chunks: print(chunk) # DiffChunk(kindsubstitute, originalVetämän, correctedVetämön) # DiffChunk(kindsubstitute, originalVastuu henkilö, correctedVastuuhenkilö)每个DiffChunk都有一个kind属性值为substitute、insert或delete。这可用于准确检查更改了什么、将更正输入审查 UI或分析大批量转录稿的增强行为。TranscriptEnhancer返回一个TranscriptEnhancerResult。完整结构使用model_dump_json()序列化{ original_text: Hei, 23.8.2025 Vetämän Kaltenbach-sahalla viereinen turva-aita toimii yleisenä liinatelineenä. Vastuu henkilö otti havainnon käsittelyyn., enhanced_text: Hei, 23.8.2025 Vetämön Kaltenbach-sahalla viereinen turva-aita toimii yleisenä liinatelineenä. Vastuuhenkilö otti havainnon käsittelyyn., source_file: Sample.txt, correction_summary: { total_changes: 3, insertions: 0, deletions: 1, substitutions: 2 }, diff_chunks: [ {kind: substitute, original: Vetämän, corrected: Vetämön}, {kind: substitute, original: Vastuu henkilö, corrected: Vastuuhenkilö} ] }4. 评估结果为了评估转录稿增强方法的有效性我使用了前面讨论的相同指标WER、拼写错误率以及插入率、删除率和替换率。我使用不同的语音转文本模型生成了15个转录稿。每个语音转文本模型为同一组15个音频文件生成转录稿。对于每个音频文件我还通过让芬兰语母语者听录音并转录来手动创建参考转录稿。用于从不同语音转文本模型生成转录稿的代码可在 GitHub 仓库的transcribers文件夹中找到。每个转录稿然后通过 GAIK 工具包的转录稿增强组件进行增强。增强版本与原始语音转文本输出和手动创建的参考转录稿进行比较。比较使用eval_enhanced.py脚本参见 GitHub 仓库进行。此脚本读取参考转录稿、原始假设及其增强版本。然后使用jiwer进行词对齐和使用rapidfuzz进行基于莱文斯坦距离的拼写错误检测计算 WER、拼写错误率以及插入率、删除率和替换率。结果汇总每个语音转文本模型的所有转录稿。下图显示了增强前后的整体 WER。多个模型的原始和增强转录稿的词错误率结果显示所有测试模型的 WER 都有所降低。最大的改进出现在芬兰语微调的 WhisperX 模型whisper-large-finnish-v3-ct2-parameters中。OpenAI 的gpt-4o-transcribe其 WER 已经最低仍然从增强方法中受益平均 WER 降低了1.33个百分点。下表细分了 WER 的各个组成部分包括替换率、删除率、插入率和拼写错误率。语音转文本模型基准测试 — 原始 vs 增强由于增强提示词中的严格约束删除率和插入率要么保持不变要么仅略有降低除了 WhisperX large-v3 的略微增加。通道1禁止任何词的添加或删除通道2强制执行严格的插入预算每100个词最多插入两个词。假设中已经存在的删除语音转文本模型在转录过程中完全遗漏的词无法通过后处理单独恢复因为在该阶段没有可用的音频信息来重建所说的内容。最显著的改进是在拼写和替换错误方面。由于通道1的直接作用所有模型的拼写错误率都大幅下降通道1针对接近正确的词元、不一致的术语拼写和大小写错误。替换率也遵循类似的模式各模型降低了2-4个百分点。这与通道2修复复合词合并、连字符修复和外来词归一化的性质一致。下图显示了原始和增强转录稿的并排差异视图。修改的词元在原始转录稿中以红色突出显示在更正版本中以绿色突出显示。在此示例中更正是拼写和形态修复而周围的文本完全保持不变。原始和更正转录稿的截图## 5. 如何适配其他语言带有文档的完整源代码可在 GitHub 上找到。TranscriptEnhancer软件组件目前专为芬兰语音设计其中PASS1_SYSTEM_PROMPT和PASS2_SYSTEM_PROMPT编码了芬兰语特定的行为。然而拼写规则、词修复逻辑、口语形式保留列表、功能词插入白名单和语法安全规则都可以修改为任何其他语言。要将组件适配为不同语言唯一需要更改的部分是提示词。以下是可以完成的方法通道1将芬兰语正字法规则和一致性归一化指南替换为目标语言的等效规则。应用相同的方法来识别目标语言中反复出现的性能问题错误。更新任何特定于语言的示例。通道2将功能词白名单替换为目标语言的等效集合。更新复合词处理规则、口语形式保留指令和语法安全规则。PASS1_SYSTEM_PROMPT和PASS2_SYSTEM_PROMPT从包中导出因此可以在不分叉完整实现的情况下读取、修改并传递回作为新语言变体的基础。原文链接用LLM提高语音转文本的准确率 - 汇智网

更多文章