前言

如今进行入自媒体行业的人越来越多,短视频也逐渐成为了主流,但好多时候是想如何把视频里面的语音转成文字,比如,录制会议视频后,做会议纪要;比如,网课教程视频,想要做笔记;比如,需要提取视频中文案使用;比如,需要给视频加个字幕;这时候,只要把视频转文字就好。 对于不是视频编辑专业人员,处理起来还是比较麻烦的,但网上也有好多可以用的小工具,这些工具大多数都标榜有自己技术和模型,但都是在线模型或者使用过一段时间之后就无法再使用了,这些工具实际上都是基于一些大公司提供的接口衍生出来的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

查看原文