前言
如今进行入自媒体行业的人越来越多,短视频也逐渐成为了主流,但好多时候是想如何把视频里面的语音转成文字,比如,录制会议视频后,做会议纪要;比如,网课教程视频,想要做笔记;比如,需要提取视频中文案使用;比如,需要给视频加个字幕;这时候,只要把视频转文字就好。
对于不是视频编辑专业人员,处理起来还是比较麻烦的,但网上也有好多可以用的小工具,这些工具大多数都标榜有自己技术和模型,但都是在线模型或者使用过一段时间之后就无法再使用了,这些工具实际上都是基于一些大公司提供的接口衍生出来的AI工具,使用效果也不错。但在处理的过程中,处理的文件要上传到大公司的服务器进行处理,这里可能会涉及到一些数据的安全问题。这些数据很大一部分有可能会涉及到数据泄露与安全的问题。
这个项目的核心算法是基于PaddlePaddle的语音识别加Python实现,使用的模型可以有自己训练,支持本地部署,支持GPU与CPU推理两种文案,可以处理短语音识别、长语音识别、实现输入的语音识别。
一、视频语音提取
想要把视频里面的语音进行识别,首先要对视频里面的语音进行提取,提取视频里的语音有很多用办法,可以借助视频编辑软件(如Adobe Premiere Pro、Final Cut Pro)中提取音频轨道,然后将其导出为音频文件。 也可以借助工具如FFmpeg或者moviepy,通过命令行将视频中的音频提取出来。
这里使用moviepy对视频里面的语音进行提取,MoviePy是一个功能丰富的Python模块,专为视频编辑而设计。使用MoviePy,可以轻松执行各种基本视频操作,如视频剪辑、视频拼接、标题插入等。此外,它还支持视频合成和高级视频处理,甚至可以添加自定义高级特效。这个模块可以读写绝大多数常见的视频格式,包括GIF。无论使用的是Mac、Windows还是Linux系统,MoviePy都能无缝运行,可以在不同平台上使用它。
MoviePy与FFmpeg环境安装:
pip install moviepy
pip install ffmpeg
因为使用moviepy提取出视频里面的音轨的比特率不是16000,不能直接输入到语音识别模型里面,这里还要借助FFmpeg的命来把音频采样率转成16000
提取音轨:
def video_to_audio(video_path,audio_path):
video = VideoFileClip(video_path)
audio = video.audio
audio_temp = "temp.wav"
if os.path.exists(audio_path):
os.remove(audio_temp)
audio.write_audiofile(audio_temp)
audio.close()
if os.path.exists(audio_path):
os.remove(audio_path)
cmd = "ffmpeg -i " + audio_temp + " -ac 1 -ar 16000 " + audio_path
subprocess.run(cmd,shell=True)
二、语音识别
1.PaddleSpeech语音识别
PaddleSpeech是一款由飞浆开源全能的语音算法工具箱,其中包含多种领先国际水平的语音算法与预训练模型。它提供了多种语音处理工具和预训练模型供用户选择,支持语音识别、语音合成、声音分类、声纹识别、标点恢复、语音翻译等多种功能。在这里可以找到基于PaddleSpeech精品项目与训练教程:https://aistudio.baidu.com/projectdetail/4692119?contributionType=1
语音识别(Automatic Speech Recognition, ASR) 是一项从一段音频中提取出语言文字内容的任务。
目前 Transformer 和 Conformer 是语音识别领域的主流模型,关于这方面的教程可以看飞浆官方发的课程:飞桨PaddleSpeech语音技术课程
2.环境依赖安装
我当前的环境是win10,GPU是N卡3060,使用cuda 11.8,cudnn 8.5,为了之后方便封装,使用conda来安装环境,如果没有GPU,也可以装cpu版本:
conda create -n video_to_txt python=3.8
python -m pip install paddlepaddle-gpu==2.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
3. 模型下载
可以从官方git上下载到合适自己的模型:https://github.com/PaddlePaddle/PaddleSpeech/blob/develop/README_cn.md
转换模型:
import argparse
import functools
from ppasr.trainer import PPASRTrainer
from ppasr.utils.utils import add_arguments, print_arguments
parser = argparse.ArgumentParser(description=__doc__)
add_arg = functools.partial(add_arguments, argparser=parser)
add_arg('configs', str, 'models/csfw/configs/conformer.yml', '配置文件')
add_arg("use_gpu", bool,服务器托管网 True, '是否使用GPU评估模型')
add_arg("save_quant", bool, False, '是否保存量化模型')
add_arg('save_model', str, 'models', '模型保存的路径')
add_arg('resume_model', str, 'models/csfw/models', '准备导出的模型路径')
args = parser.parse_args()
print_arguments(args=args)
# 获取训练器
trainer = PPASRTrainer(configs=args.configs, use_gpu=args.use_gpu)
# 导出预测模型
trainer.export(save_model_path=args.save_model,
resume_model=args.resume_model,
save_quant=args.save_quant)
4.语音识别
使用模型进行短语音识别:
def predict(self,
audio_data,
use_pun=False,
is_itn=False,
sample_rate=16000):
# 加载音频文件,并进行预处理
audio_segment = self._load_audio(audio_data=audio_data, sample_rate=sample_rate)
audio_feature = self._audio_featurizer.featurize(audio_segment)
input_data = np.array(audio_feature).astype(np.float32)[np.newaxis, :]
audio_len = np.array([input_data.shape[1]]).astype(np.int64)
# 运行predictor
output_data = self.predictor.predict(input_data, audio_len)[0]
# 解码
score, text = self.decode(output_data=output_data, use_pun=use_pun, is_itn=is_itn)
result = {
'text': text, 'score': score}
return result
看看识别结果,是全部整成一块,并没有短句与加标点符号:
5.断句与标点符号
可以基于飞浆的ERNIE训练标点行号模型:
添加标点符号代码:
import json
import os
import re
import numpy as np
import paddle.inference as paddle_infer
from paddlenlp.transformers import ErnieTokenizer
from ppasr.utils.logger import setup_logger
logger
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net