说明 在“「定投搜索」工具的一些分享”中有说到,通过 whsiper.cpp 识别的文本不准确的问题,包括存在繁体中文,错误的同音字,没有标点符号,突然增加的一些版权信息和告别语。
已经尝试使用 GLM4 进行文本的修改,修改效果不错。
以下分享此次使用 GLM4-9B 修改语音识别文本错误的过程。
安装Ollama Ollama 是一个开源项目,是在本地快速跑各种开源大模型的最优选择之一。它的安装过程非常简单。MacOS 和 Windows 都有一键安装包,Download Ollama on macOS ,下载后直接安装即可。
安装完成好,可以打开终端,能看到这些信息就说明Ollama已经安装成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ollama Usage: ollama [flags] ollama [command ] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model pull Pull a model from a registry push Push a model to a registry list List models ps List running models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information
安装GLM4 打开 Ollama 官网,搜索glm4, glm4 (ollama.com) ,复制运行命令ollama run glm4并在终端执行。
1 2 3 4 ollama run glm4 >>> Send a message (/? for help )
当其实输入消息时,表示模型已经安装成功,并可使用。
调用 此处直接上代码,prompt 是根据直译、反思、意译:提升 GPT 翻译质量的一种新策略
进行修改的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 public class OllamaUtils { public static String fixTxt (String prompt) { String system = "" " 你是精通简体中文的专家,尤其擅长修复文本内容错误。 规则: - 不要翻译英文。 - 把繁体中文修改成简体中文。 - 修改错别字,如:错误的成语、错误的词组。 - 修改错误的同音字,错误的同音字包括但不限于: * 孝来 -> 笑来 * 校来 -> 笑来 * 小莱 -> 笑来 * 李孝来 -> 李笑来 * 李小莱 -> 李笑来 * 李少莱 -> 李笑来 * 李小兰 -> 李笑来 * 李校来 -> 李笑来 * 李教来 -> 李笑来 * 健行 -> 践行 * 定头 -> 定投 - 删除无效内容。无效内容包括但不限于: * 文本段落后的版权说明,如: 1. 优优独播剧场——YoYo Television Series Exclusive 1. 请不吝点赞、订阅、转发、打赏,支持“明镜与点滴”栏目 * 文本段落后的突然的告别语,如: 1. 谢谢 1. 拜拜 1. 谢谢大家 - 添加上合适的标点符号。 策略: 分三步进行修改工作。 1. 根据文本内容进行修改,保持原有格式,不要遗漏任何信息。 2. 根据第一步的修改结果,指出其中存在的具体问题,要准确描述。 3. 根据第一步和第二步的指出的问题,重新修改,同时保持原有格式不变。 返回: - 只返回重新修改的结果 - 不返回具体问题 - 不返回修改的解释 现在请按照上面的要求从第一行开始修改文本内容。 " "" ; Kv kv = Kv.create().set("model" , "glm4" ).set("system" , system).set("prompt" , prompt); log.info("prompt: {}" , prompt); String result = OllamaUtils.generate(kv); log.info("result: {}" , result); return result; } public static String generate (Kv kv) { String prompt = kv.getStr("prompt" ); if (StrUtil.isBlank(prompt)) { throw new RuntimeException("prompt is empty" ); } HttpUtils http = HttpUtils.http("http://localhost:11434/api/generate" ); String model = kv.getStr("model" ); if (StrUtil.isBlank(model)) { kv.set("model" , "glm4" ); } Boolean stream = kv.getBoolean("stream" ); if (stream == null ) { kv.set("stream" , false ); } http.bodyJson(ONode.stringify(kv)); try { HttpResponse response = http.exec("post" ); if (response.code() != 200 ) { return "" ; } String body = response.bodyAsString(); if (StrUtil.isBlank(body)) { return "" ; } ONode node = ONode.load(body); return node.get("response" ).getString(); } catch (IOException e) { log.error(e.getMessage(), e); } return "" ; } }
测试 1 2 3 4 5 6 7 8 9 class OllamaUtilsTest { @Test void generate () { String txt = "那么Bitstamp呢确实是一个老牌的这个交易所 然后呢当然现在不大了 以前呢曾经火过 那么再看哈 这位同学发过来的那个陌生人给他的链接 是跟Bitstamp半毛钱关系没有的那么一个链接 我在这里呢就不发那个假的链接了 因为有可能会产生误导" ; OllamaUtils.fixTxt(txt); } }
输出内容,输出的结果还是让我满意的,最新生成的数据已经开始索引到 ES 里面。
1 2 prompt: 那么Bitstamp呢确实是一个老牌的这个交易所 然后呢当然现在不大了 以前呢曾经火过 那么再看哈 这位同学发过来的那个陌生人给他的链接 是跟Bitstamp半毛钱关系没有的那么一个链接 我在这里呢就不发那个假的链接了 因为有可能会产生误导 result: 那么Bitstamp确实是一个老牌的交易所,然后当然现在不大了。以前呢曾经火过。那么再看哈,这位同学发过来的那个陌生人给他的链接,是跟Bitstamp半毛钱关系没有的那么一个链接。我在这里呢就不发那个假的链接了,因为有可能会产生误导。