利用pydub和baidu语音api实现自动添加字幕

前言

原来想翻译一段视频,下了某字幕工具,发现有ai听译的功能,但是未认证用户只能体验1分钟(申请了认证却不通过),想想原理也挺简单,就自己写了。
另外字幕精准程度根据视频源音频清晰以及口音问题有所增减,个人认为这个工具的主要功能是方便打时间轴,听译还是自己上吧。
github地址: audio2srt

程序介绍

基本工具

  • 语言:python3.6
  • 需要模块:pydub api
  • 其他工具:狸窝或视频转音频工具,Adobe Audition或其他音频处理工具

提取音频

根据音频转换器的可输出格式,这里直接提取了wav格式的音频。百度语音识别API可以接受

pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)

但是pydub自带的AudioSegment可以直接输出wav而不需要调用到ffmpeg,故wav在此处比较合适。
(可选)可以根据需要用Adobe Audition去噪,并且观察下大概底噪的的范围,后面用作silence_thresh的变量值。

修改pydub的silence.py

主要是把截取视频的时间戳返回来,以便字幕定位,这一步可以直接改或者另存为。
另:若是用pip安装模块,寻找silence.py可以通过pip show来实现。

def split_on_silence(audio_segment, min_silence_len=1000, silence_thresh=-16, keep_silence=100,
                     seek_step=1):
    not_silence_ranges = detect_nonsilent(audio_segment, min_silence_len, silence_thresh, seek_step)

    chunks = []
    starttime=[]
    endtime=[]
    for start_i, end_i in not_silence_ranges:
        start_i = max(0, start_i - keep_silence)
        end_i += keep_silence

        chunks.append(audio_segment[start_i:end_i])
        starttime.append(start_i)
        endtime.append(end_i)

    return chunks,starttime,endtime

读取音频和预处理

预处理的目的是直接改成百度要求的:

录音参数必须符合 8k/16k 采样率、16bit 位深、单声道

且这样的音频体积较小后面处理起来比较快。

#读取音频 预处理
sound=AudioSegment.from_wav('.yinping/origin.wav')
sound=sound.set_frame_rate(16000)
sound=sound.set_channels(1)

切割音频转换成所需的WAV

split_on_silence的几个参数,大家按需改就好。注意silence_thresh变量可以用音频软件观察。

audio_segment :原始pydub.AudioSegment()对象
min_silence_len : (ms)用于切割一个沉默片段的最小长度 。默认值:1000毫秒
silence_thresh : (dBFS) 任何比这安静的值将被视为沉默。默认值:-16 dbfs
keep_silence :(ms) 在开始一端的块加入沉默值。使声音听起来不会像是突然切断。(默认值:100毫秒)

注意:
运行后会在指定文件夹生成切割后的片段,命名以0~N.wav,注意原始文件或其他重要音频不要被覆盖了。

#切割音频
min_silence_len=700
silence_thresh=-32
pieces,start_t,end_t=split_on_silence(sound,min_silence_len,silence_thresh)
silent = AudioSegment.silent(duration=1000)
  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现上传视频并且利用百度语音识别API视频添加字幕,需要完成以下几个步骤: 1. 在 Android Studio 中创建一个上传视频的功能,可以使用第三方库,例如 retrofit 或者 volley,实现上传视频到服务器。 2. 调用百度语音识别 API,将上传的视频进行语音识别,得到视频中的语音内容。 3. 将语音内容转化为字幕格式,例如 SRT 格式。 4. 将字幕文件与上传的视频进行合并,生成新的视频文件。 下面是大致的代码实现步骤: 1. 上传视频到服务器 ``` // 创建 Retrofit 实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://your.server.url/") .build(); // 创建 API 接口 VideoUploadApi api = retrofit.create(VideoUploadApi.class); // 创建 FileRequestBody,用于上传视频文件 FileRequestBody fileRequestBody = new FileRequestBody(videoFile); // 调用 API 接口上传视频 Call<UploadResult> call = api.uploadVideo(fileRequestBody); call.enqueue(new Callback<UploadResult>() { @Override public void onResponse(Call<UploadResult> call, Response<UploadResult> response) { // 上传成功 UploadResult result = response.body(); // 处理上传结果 } @Override public void onFailure(Call<UploadResult> call, Throwable t) { // 上传失败 // 处理上传失败的情况 } }); ``` 2. 调用百度语音识别 API ``` // 创建百度语音识别 API 实例 BaiduSpeechApi api = new BaiduSpeechApi(appId, appKey, secretKey); // 调用语音识别 API,获取语音内容 String speechContent = api.recognizeSpeech(videoFile); ``` 3. 将语音内容转化为字幕格式 ``` // 将语音内容转化为 SRT 格式字幕 String srtSubtitle = SrtSubtitleConverter.convertToSrt(speechContent); ``` 4. 将字幕文件与上传的视频进行合并 ``` // 创建 FFmpeg 实例 FFmpeg ffmpeg = FFmpeg.getInstance(context); // 设置 FFmpeg 命令行 String command = String.format("ffmpeg -i %s -vf subtitles=%s %s", videoFile.getAbsolutePath(), subtitleFile.getAbsolutePath(), outputVideoFile.getAbsolutePath()); // 执行 FFmpeg 命令行 ffmpeg.execute(command, new ExecuteBinaryResponseHandler() { @Override public void onSuccess(String message) { // 合并成功 } @Override public void onFailure(String message) { // 合并失败 } }); ``` 以上是大致的实现步骤,具体实现细节还需要根据具体情况进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值