Python工具箱系列(六十五)

语音识别(下)

北京大学的饶毅教授是非常令人尊敬的科学家。他的一篇最短致辞,轰动全网,是一个学者、有良知的人对学生的期待与祝福。为了方便比对,先将饶毅的原文列举如下。

在祝福裹着告诫呼啸而来的毕业季,请原谅我不敢祝愿每一位毕业生都成功、都幸福;因为历史不幸地记载着:有人的成功代价是丧失良知;有人的幸福代价是损害他人。从物理学来说,无机的原子逆热力学第二定律出现生物是奇迹;从生物学来说,按进化规律产生遗传信息指导组装人类是奇迹。超越化学反应结果的每一位毕业生都是值得珍惜的奇迹;超越动物欲望总和的每一位毕业生都应做自己尊重的人。过去、现在、将来,能够完全知道个人行为和思想的只有自己;世界上很多文化借助宗教信仰来指导人们生活的信念和世俗行为;而对于无神论者——也就是大多数中国人——来说,自我尊重是重要的正道。在你们加入社会后看到各种离奇现象,知道自己更多弱点和缺陷,可能还遇到小难大灾后,如何在诱惑和艰难中保持人性的尊严、赢得自己的尊重并非易事,却很值得。这不是:自恋、自大、自负、自夸、自欺、自闭、自怜,而是:自信、自豪、自量、自知、自省、自赎、自勉、自强。自尊支撑自由的精神、自主的工作、自在的生活。

我祝愿:

退休之日,你觉得职业中的自己值得尊重;迟暮之年,你感到生活中的自己值得尊重。不要问我如何做到,50年后返校时告诉母校你如何做到:在你所含全部原子再度按热力学第二定律回归自然之前,它们既经历过物性的神奇,也产生过人性的可爱。

我们下载视频后,提取后进行音频分割,并且使用两种方法进行语音识别。以下代码演示了这个过程。

import auditok
import paddle

# 导入百度在线的API
from aip import AipSpeech
from moviepy.editor import VideoFileClip
from paddlespeech.cli.asr import ASRExecutor
from paddlespeech.cli.asr.infer import ASRExecutor
from paddlespeech.cli.text import TextExecutor


def extract_audio(videofile, audiofile):
    """
    从视频文件导出音频来

    Args:
        videofile (string): 视频文件
        audiofile (string): 音频文件
    """
    video = VideoFileClip(videofile)
    video.audio.write_audiofile(audiofile, ffmpeg_params=[
                                "-ar", "16000", "-ac", "1"])


def splitaudio(audiofilename, plotflag=False, playflag=False):
    """
    分割音频文件

    Args:
        audiofilename (string): 音频文件
        plotflag (bool, optional): 是否画图显示
        playflag (bool, optional): 是否播放分割后的音频片断

    Returns:
        list: 切分后的音频片断文件列表
    """

    region = auditok.load(audiofilename)
    if plotflag:
        regions = region.split_and_plot(min_dur=1, max_dur=50, max_silence=0.5)
    else:
        regions = region.split(min_dur=1, max_dur=50, max_silence=0.5)

    # 将分割进行输出
    filelist = []
    recfile = open('split.csv', 'w', encoding='utf-8')

    for index, clip in enumerate(regions):
        if playflag:
            clip.play(progress_bar=True)
        filename = f"clip-{index}.wav"
        clip.save(filename)
        filelist.append(filename)
        recfile.write(
            f"""{filename},{clip.meta['start']},{clip.meta['end']}\r\n""")
    recfile.close()
    return filelist


def stt_paddlespeech(audiofilename):
    """
    对语音进行文字识别,并且使用标点符号进行标注

    Args:
        audiofilename (string): 音频文件

    Returns:
        string: 文字识别结果
    """
    asr_executor = ASRExecutor()
    text_executor = TextExecutor()

    text = asr_executor(
        audio_file=audiofilename,
        device=paddle.get_device())
    result = text_executor(
        text=text,
        task='punc',
        model='ernie_linear_p3_wudao',
        device=paddle.get_device())

    return result


def get_file_content(audiofilename):
    """
    读取文件

    Args:
        audiofilename (string): 音频文件

    Returns:
        bytes: 音频文件的内容(字节流)
    """
    with open(audiofilename, "rb") as fp:
        return fp.read()


def stt_baiduspeech(audiofilename):
    """
    使用百度云语音技术进行识别

    Args:
        audiofilename (string): 音频文件

    Returns:
        string: 文字识别结果
    """
    APP_ID = "25488691"
    API_KEY = "znWXeviMeMu4hR3Z8AHzkL6H"
    SECRET_KEY = "c9MGyuik2ahPVNa1ECVDav6SctBoZ52z"
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    result = client.asr(
        get_file_content(audiofilename),
        "wav",
        16000,
        {
            # 普通话
            "dev_pid": 1536,
        },
    )
    return result['result']


targetaudio_linux = "/root/test/wave/beijin.wav"

# 第一步,将视频文件中的音频志出来
extract_audio('/root/test/mp4/beijin.mp4', targetaudio_linux)

# 第二步,先分割音频
result = splitaudio(targetaudio_linux, plotflag=True)

# 第三步,对每个片断,使用paddlespeech/baidu api进行识别,并且将结果保存到文件中
with open('result.csv', 'w', encoding='utf-8') as fout:
    for file in result:
        result1 = stt_paddlespeech(file)
        result2 = stt_baiduspeech(file)
        fout.write(f'{file},{result1},{result2[0]}\r\n')

上述代码在第一次运行时,会下载所需要的模型库,相对较慢。后续再次运行时会快一些,但语音识别的过程本身还是比较慢的。在代码中,将分割结果与识别结果分别保存起来,后续使用excel进行加工后,将两种方式的效果与原文比对如下图所示。

python-stt-02.png

标红的行为识别不正确的地方。统计下来有12个片断识别不太正确,识别效果一言难尽非常感人,所以还是人类自身的识别能力非凡。最后将安装第三库的过程重复如下。

pip install moviepy
pip install auditok
pip install baidu-aip

从效果上来看,无论是在线API还是离线模型,识别结果效果都差强人意。如果用于电影字幕的制作,效果可能更差,最终还是需要人去校对,否则翻译出来的结果令人啼笑皆非。

posted @ 2025-08-15 16:36  西安衍舆航天  阅读(12)  评论(0)    收藏  举报