如何在Kaldi-Vosk语音转文本系统中获取纯文本自定义输出
解决方案:提取Vosk转录结果中的纯文本内容
方法一:修改Python脚本(从源头过滤,推荐)
直接修改test_ffmpeg.py,让它只输出text字段的内容,忽略中间的partial相关输出:
修改后的test_ffmpeg.py代码:
#!/usr/bin/env python3 from vosk import Model, KaldiRecognizer, SetLogLevel import sys import subprocess import json SetLogLevel(0) sample_rate = 16000 model = Model("..") rec = KaldiRecognizer(model, sample_rate) process = subprocess.Popen(['ffmpeg', '-loglevel', 'quiet', '-i', sys.argv[1], '-ar', str(sample_rate) , '-ac', '1', '-f', 's16le', '-'], stdout=subprocess.PIPE) while True: data = process.stdout.read(4000) if len(data) == 0: break if rec.AcceptWaveform(data): # 解析JSON结果,提取text字段 result_json = json.loads(rec.Result()) print(result_json.get("text", "")) # 跳过PartialResult的输出,不打印中间临时结果 # 处理最终结果,提取text字段 final_json = json.loads(rec.FinalResult()) print(final_json.get("text", ""))
修改说明:
- 移除了
PartialResult的打印逻辑,不需要中间的临时转录内容 - 对
Result()和FinalResult()返回的JSON字符串做解析,仅提取并打印text字段的值 - 使用
get("text", "")避免因字段缺失导致的报错
方法二:修改Bash脚本(事后过滤已有JSON内容)
如果不想修改Python脚本,可以在Bash合并步骤中用jq工具过滤text字段(需先安装jq:sudo apt install jq):
修改后的Bash脚本:
#!/bin/bash # 修正原脚本的赋值语法错误 af="$1" afe="${af}.wav" python3 chunker.py "$af" # 转录每个chunk,保留原始JSON输出 for file in "${af}"/*.wav; do python3 test_ffmpeg.py "$file" >> "${file}.txt" done # 清空总文件后,过滤并合并text字段内容 > "${af}.txt" for f in "${af}"/*.txt; do # 提取text字段并过滤空值 jq -r '.text | select(. != null)' "$f" >> "${af}.txt" done
说明:
jq -r '.text'读取JSON内容,提取text字段的原始值(不带引号)select(. != null)过滤掉partial类型JSON输出的空值
额外修正:原Bash脚本的语法错误
原脚本中afe= $af + ".wav"是错误的Bash赋值语法,应改为afe="${af}.wav",否则会触发执行错误。
内容的提问来源于stack exchange,提问作者SAGE KHAN
相关产品推荐
相关产品推荐

