前言

在语音识别中,模型输出的结果只是单纯的文本结果,并没有根据语法添加标点符号,本教程就是针对这种情况,在语音识别文本中根据语法情况加入标点符号,使得语音识别系统能够输出在标点符号的最终结果。
注意,本教程只介绍使用,如果要训练自己的模型,需要看《基于PaddlePaddle训练中文标点符号模型》文章。

使用

使用主要分为三4步:

  1. 首先是下载模型,并解压到models/目录下,下载地址如下:
https://download.csdn.net/download/qq_33200967/75664996
  1. 需要使用PaddleNLP工具,所以需要提前安装PaddleNLP,安装命令如下:
python -m pip install paddlenlp -i https://mirrors.aliyun.com/pypi/simple/
  1. PPASR在0.1.3版本之后开始提供,提供了自动添加标点符号的工具,我们可以通过安装ppasr,来使用这个工具。
python -m pip install ppasr -i https://mirrors.aliyun.com/pypi/simple/ -U
  1. 对文本自动加上了标点符号,使用非常简单,如下。注意在V2版本之后导入库的路径变了,然后名称也变了。
from ppasr.infer_utils.pun_predictor import PunctuationPredictorpun_predictor = PunctuationPredictor(model_dir='models/pun_models')
result = pun_predictor('近几年不但我用书给女儿儿压岁也劝说亲朋不要给女儿压岁钱而改送压岁书')
print(result)

输出结果:

[2022-01-13 15:27:11,194] [    INFO] - Found C:\Users\test\.paddlenlp\models\ernie-1.0\vocab.txt
近几年,不但我用书给女儿儿压岁,也劝说亲朋,不要给女儿压岁钱,而改送压岁书。

源码地址,这个工具的全部源码如下:

import json
import os
import reimport numpy as np
import paddle.inference as paddle_infer
from paddlenlp.transformers import ErnieTokenizer
from ppasr.utils.logger import setup_loggerlogger = setup_logger(__name__)__all__ = ['PunctuationPredictor']class PunctuationPredictor:def __init__(self, model_dir, use_gpu=True, gpu_mem=500, num_threads=4):# 创建 configmodel_path = os.path.join(model_dir, 'model.pdmodel')params_path = os.path.join(model_dir, 'model.pdiparams')if not os.path.exists(model_path) or not os.path.exists(params_path):raise Exception("标点符号模型文件不存在,请检查{}和{}是否存在!".format(model_path, params_path))self.config = paddle_infer.Config(model_path, params_path)# 获取预训练模型类型pretrained_token = 'ernie-1.0'if os.path.exists(os.path.join(model_dir, 'info.json')):with open(os.path.join(model_dir, 'info.json'), 'r', encoding='utf-8') as f:data = json.load(f)pretrained_token = data['pretrained_token']if use_gpu:self.config.enable_use_gpu(gpu_mem, 0)else:self.config.disable_gpu()self.config.set_cpu_math_library_num_threads(num_threads)# enable memory optimself.config.enable_memory_optim()self.config.disable_glog_info()# 根据 config 创建 predictorself.predictor = paddle_infer.create_predictor(self.config)# 获取输入层self.input_ids_handle = self.predictor.get_input_handle('input_ids')self.token_type_ids_handle = self.predictor.get_input_handle('token_type_ids')# 获取输出的名称self.output_names = self.predictor.get_output_names()self._punc_list = []if not os.path.join(model_dir, 'vocab.txt'):raise Exception("字典文件不存在,请检查{}是否存在!".format(os.path.join(model_dir, 'vocab.txt')))with open(os.path.join(model_dir, 'vocab.txt'), 'r', encoding='utf-8') as f:for line in f:self._punc_list.append(line.strip())self.tokenizer = ErnieTokenizer.from_pretrained(pretrained_token)# 预热self('近几年不但我用书给女儿儿压岁也劝说亲朋不要给女儿压岁钱而改送压岁书')logger.info('标点符号模型加载成功。')def _clean_text(self, text):text = text.lower()text = re.sub('[^A-Za-z0-9\u4e00-\u9fa5]', '', text)text = re.sub(f'[{"".join([p for p in self._punc_list][1:])}]', '', text)return text# 预处理文本def preprocess(self, text: str):clean_text = self._clean_text(text)if len(clean_text) == 0: return Nonetokenized_input = self.tokenizer(list(clean_text), return_length=True, is_split_into_words=True)input_ids = tokenized_input['input_ids']seg_ids = tokenized_input['token_type_ids']seq_len = tokenized_input['seq_len']return input_ids, seg_ids, seq_lendef infer(self, input_ids: list, seg_ids: list):# 设置输入self.input_ids_handle.reshape([1, len(input_ids)])self.token_type_ids_handle.reshape([1, len(seg_ids)])self.input_ids_handle.copy_from_cpu(np.array([input_ids]).astype('int64'))self.token_type_ids_handle.copy_from_cpu(np.array([seg_ids]).astype('int64'))# 运行predictorself.predictor.run()# 获取输出output_handle = self.predictor.get_output_handle(self.output_names[0])output_data = output_handle.copy_to_cpu()return output_data# 后处理识别结果def postprocess(self, input_ids, seq_len, preds):tokens = self.tokenizer.convert_ids_to_tokens(input_ids[1:seq_len - 1])labels = preds[1:seq_len - 1].tolist()assert len(tokens) == len(labels)text = ''for t, l in zip(tokens, labels):text += tif l != 0:text += self._punc_list[l]return textdef __call__(self, text: str) -> str:# 数据batch处理try:input_ids, seg_ids, seq_len = self.preprocess(text)preds = self.infer(input_ids=input_ids, seg_ids=seg_ids)if len(preds.shape) == 2:preds = preds[0]text = self.postprocess(input_ids, seq_len, preds)except Exception as e:logger.error(e)return text

参考资料

  1. https://github.com/yeyupiaoling/PPASR
  2. https://github.com/PaddlePaddle/PaddleSpeech

给语音识别文本加上标点符号相关推荐

  1. 用100行python代码发现语音识别文本错误词,并将结果和正确词一一对应

    在做nlp任务时,我们常常和语音结合起来,即将语音转为文本,然后将文本做一系列任务. 但是语音转换成文本,肯定有一系列错误. 我们可以文本纠错 文本纠错见我的另一篇博客. 中文文本纠错 算例实现(有算 ...

  2. DIY 智能家居语音助理 —— 语音控制万物

    本文作者:默. 开源电子平台兴起以来,诞生了不少的创客们,他们用天马行空的想象力,创造出各种新鲜有趣的作品,他们热衷于改变千篇一律的生活,享受科技创造带来的乐趣.其中与我们的生活息息相关的就包括智能家 ...

  3. html转机器语言,【转】HTML5的语音输入 渐进使用HTML5语言识别, so easy! – 文艺里的小清新...

    转自: 一.本不想写此文 HTML5语音识别( 现在一般用在搜索 上),目前相关介绍还是挺多的.为何呢?因为很简单! 下面是个普通文本框: 而稍稍多敲几个字母,其就变成了支持HTML5语音API的语音 ...

  4. pr文字转语音有插件吗_自媒体非常实用的文字转语音软件,配合PR软件实用简直绝配...

    原标题:自媒体非常实用的文字转语音软件,配合PR软件实用简直绝配 大家都知道抖音越来越火,里面有很多小姐姐.小哥哥声音都是那么甜蜜好听,有很多微信公证号里面都插入语音了,有很好的电影片段想要配音,可惜 ...

  5. 语音识别方案 - 联想语音团队多场景实时语音文字转换方案

    [本文转载自联想乐语音论坛] 语音技术一直是人工智能的重要领域之一,其应用也日益广泛.语音技术本身也包括许多细分领域,如远场语音识别.副语言语音属性.说话人日志.声纹识别防欺骗攻击和零资源TTS等. ...

  6. 烽火2640路由器命令行手册-11-IP语音配置命令

    IP语音配置命令 目  录 第1章 配置拨号对命令... 1 1.1 配置拨号对命令... 1 1.1.1 dial-peer voice. 1 1.1.2 application. 2 1.1.3 ...

  7. 语音信号的录制和处理

    题目要求: 1.录制一段自己的语音信号,并对录制的信号进行采样: 2.画出采样后的语音信号的时域波形和频谱图: 3.给定滤波器的性能指标,采用窗函数法和双线性变换法设计滤波器, 并划出滤波器的频域响应 ...

  8. 干货 应用阿里AI一句话识别 java 实现语音实时识别

    首次讲讲思路,如果说不定大佬们也可以自己完成  ,如果大佬们懒得弄那就直接 看这里看这里 上面我已经实现了语音的实时录入检测识别并且附带了录入和识别的子项目 1.)本地语音的实时录入.并检测是否有语音 ...

  9. c语言中可以输入中文标点符号,SCIM中 输入中文标点符号的方法

    方法一: 切换到智能拼音输入法,使用 ibdfh 或 ifuhao 或 isymbol 可以输入中文标点符号,当然还包括更多你可能需要的符号.透过上面的内容,其实也蛮好记的,第一个是 i 加上标点符号 ...

最新文章

  1. “突破•重塑”2017年数据中心设施讨论
  2. opencv 图像去噪要点总结
  3. 关于高阶导数的一个不等式估计
  4. 用C语言输出一个字符串的所有子串
  5. CM: How to get the complete url of a product attachment
  6. [Leetcode][第332题][JAVA][重新安排行程][欧拉回路 / 欧拉通路][优先队列][DFS]
  7. mysql proxy 主从_【MYSQL知识必知必会】MySQL主从复制读写分离(基于mysql-proxy实现)...
  8. 最新剑指offer刷题笔记js(含新旧俩版所有题)
  9. Python教程_1_引言
  10. 【算法导论】第15章动态规划
  11. TP框架Queue队列使用
  12. 3D建模操作详细步骤
  13. Windows进行磁盘碎片化整理
  14. 新入职公司离职率高怎么办
  15. Trident API
  16. 安卓 高德SDK 将当前坐标居地图中心
  17. 修改本地hosts的方法
  18. 程序实例python_程是什么意思 带程字的男孩名字 用程字起名的寓意
  19. 目前的大数据,具体有哪些优势?
  20. 下载YouTube视频的一种方法

热门文章

  1. solidworks装配体改为柔性_软件技巧:大神整理的SolidWorks技巧总结
  2. 2021多益网络春季校园招聘游戏研发笔试题(回忆版)
  3. 详细分析stm32f10x.h
  4. 万能页面加载loading
  5. MATLAB实现大家来找茬GUI程序
  6. C语言停车场管理系统
  7. 主流的开源免费erp(至少十年以上历史)
  8. Java面试题,208道
  9. excel 两日期相减
  10. 计算机本科毕业设计-智能分类垃圾桶