问题情景
体验某云语音听写(或语音转写、语音识别)API时的,音频文件中出现超过2-3s左右的间隔就停止识别了,漏听了一大段内容。又不想自己手动边听边裁剪,怎么办呢。
ffmpeg查看响度信息
好了,用ffmpeg volumedetect滤镜看到了响度(db)的统计信息,最大值,最小值,怎么看到每一时间的响度呢
试试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);
于是ffmpeg -i 23ll.wav -af silenceremove=stop_periods=-1:stop_duration=2.5:stop_threshold=-40dB 23lloutput1.wav
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)');
于是再来一遍,stop_duration改成2,ffmpeg -i 23ll.wav -af silenceremove=stop_periods=-1:stop_duration=2:stop_threshold=-40dB 23lloutput2.wav
再用scilab看看响度/时间关系图