前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ffmpeg silenceremove自动过滤静音部分(语音听写API漏听问题)scilab,octave/matlab响度时间关系图 plotwav db

ffmpeg silenceremove自动过滤静音部分(语音听写API漏听问题)scilab,octave/matlab响度时间关系图 plotwav db

原创
作者头像
Kitov
发布2022-06-17 15:14:00
9850
发布2022-06-17 15:14:00
举报

问题情景

体验某云语音听写(或语音转写、语音识别)API时的,音频文件中出现超过2-3s左右的间隔就停止识别了,漏听了一大段内容。又不想自己手动边听边裁剪,怎么办呢。

ffprobe 23ll.wav语音文件信息:Duration时长有44s
ffprobe 23ll.wav语音文件信息:Duration时长有44s
44s怎么可能才说这么点字
44s怎么可能才说这么点字

ffmpeg查看响度信息

ffmpeg -i 23ll.wav -af volumedetect -f null dummy
ffmpeg -i 23ll.wav -af volumedetect -f null dummy

好了,用ffmpeg volumedetect滤镜看到了响度(db)的统计信息,最大值,最小值,怎么看到每一时间的响度呢

ffmpeg -i 23ll.wav -filter_complex "showwavespic=s=1024x768:split_channels=1"  -frames:v 1 23ll.png
ffmpeg -i 23ll.wav -filter_complex "showwavespic=s=1024x768:split_channels=1" -frames:v 1 23ll.png

试试showwavespic,这个图没坐标轴,不好看,而且量纲也不知道,再试试scilab,octave/matlab

scilab,octave/matlab 画响度时间图 再根据它用silenceremove

1.octave/matlab代码(maxdb值来自ffmpeg -af volumedetect)

代码语言:javascript
复制
close all;clf
try;pkg load signal;catch;end;
db=@(x)log10(abs(x))*20;  %根据分贝的定义
[y,fs]=audioread('23ll.wav','native');
maxdb=-1.5;  
%//get from  ffmpeg -i 23ll.wav -af volumedetect -f null dummy
y=db(y);y=y+maxdb-max(y);
plot([1:length(y)]/fs,y);xlabel('t (s)');ylabel('y (db)');
saveas(gcf,'23ll.jpg','jpg');
%sound(y,fs); 

时间响度图1(过滤前的原23ll.wav)中间有几个响度低于-40db的沟壑显然没语音
时间响度图1(过滤前的原23ll.wav)中间有几个响度低于-40db的沟壑显然没语音
放大来看,16.5~19.5有一段低于-40db的沟壑,估为2.5s吧
放大来看,16.5~19.5有一段低于-40db的沟壑,估为2.5s吧

于是ffmpeg -i 23ll.wav -af silenceremove=stop_periods=-1:stop_duration=2.5:stop_threshold=-40dB 23lloutput1.wav

duration时长从44s变成了39s左右,喂给API试一下
duration时长从44s变成了39s左右,喂给API试一下
识别结果长了一点,但是不够39s的,再看看有什么问题
识别结果长了一点,但是不够39s的,再看看有什么问题

scilab代码(maxdb值来自ffmpeg -af volumedetect)(功能一样写法不同)

代码语言:javascript
复制
function y=db(x);
    y=log10(abs(x))*20;
endfunction;
[y, fs, bits] = wavread('23lloutput1.wav');
maxdb=-1.5;
//get from  ffmpeg -i 23ll.wav -af volumedetect -f null dummy
y=db(y);y=y+maxdb-max(y);
plot([1:length(y)]/fs,y);xlabel('t (s)');ylabel('y (db)');

scilab图 显然还有31s有个小于-40db的沟壑
scilab图 显然还有31s有个小于-40db的沟壑
滚轮放大后拖动画面,有30.5-32.5s长达2s的低于-40db的沟壑
滚轮放大后拖动画面,有30.5-32.5s长达2s的低于-40db的沟壑

于是再来一遍,stop_duration改成2,ffmpeg -i 23ll.wav -af silenceremove=stop_periods=-1:stop_duration=2:stop_threshold=-40dB 23lloutput2.wav

duration时长又减到了38.25s,喂给API试一下
duration时长又减到了38.25s,喂给API试一下
这次结果很好
这次结果很好

再用scilab看看响度/时间关系图

scilab中的代码
scilab中的代码
完美,太长的间隔都被清除了, 收工
完美,太长的间隔都被清除了, 收工

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题情景
  • ffmpeg查看响度信息
  • scilab,octave/matlab 画响度时间图 再根据它用silenceremove
    • 1.octave/matlab代码(maxdb值来自ffmpeg -af volumedetect)
      • scilab代码(maxdb值来自ffmpeg -af volumedetect)(功能一样写法不同)
      相关产品与服务
      语音识别
      腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转化成文字的PaaS产品,为企业提供精准而极具性价比的识别服务。被微信、王者荣耀、腾讯视频等大量业务使用,适用于录音质检、会议实时转写、语音输入法等多个场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档