如何在MATLAB中读取音频文件时保留语音停顿?
问题描述
我需要将一批WebM格式的人声录音导入MATLAB,使用audioread()读取后,时间序列丢失了语音中的停顿(静音时段被截断)。尝试过用VLC和ffmpeg将WebM转成.mp3、.ogg、.opus、.mp4格式再读取,停顿依然丢失。
补充:原WebM文件用VLC播放时停顿存在,但经VLC转换为任何格式后,停顿都无法保留。
现有代码
ffmpeg转WebM为WAV的代码
ffmpegPath = 'C:\Users\rapiduser\Downloads\ffmpeg-6.0-essentials_build\ffmpeg-6.0-essentials_build\bin\ffmpeg.exe'; %ffmpeg exe路径 listAudios = dir('Z:\data\files\*audio.webm'); %音频文件路径数组 nAudios = length(listAudios); outputFolder = dir('Y:\IntermediateData\WAVFiles'); %WAV文件存放目录 for idxAud = 1:nAudios inputFile = strcat(listAudios(idxAud).folder, '\', listAudios(idxAud).name); %输入文件路径 outputFile = strcat(outputFolder(1).folder, '\', listAudios(idxAud).name(1:end-5), '.wav'); %输出文件路径 command = strcat(ffmpegPath, " -i ", inputFile, " ", outputFile); %ffmpeg执行命令 [~] = system(command); end
读取WAV文件的代码
listWav = dir('Y:\IntermediateData\WAVFiles\*.wav'); %WAV文件列表 nAudios = length(listWav); for idxAud = 1:nAudios [y,Fs] = audioread(listWav(idxAud).folder + "\\" + listWav(idxAud).name); %读取单个文件 end
解决方法
问题根源是转码工具(VLC/ffmpeg)默认开启了静音修剪或有损编码优化,导致静音时段被丢弃。以下是具体解决步骤:
1. 修改ffmpeg转码命令,强制保留所有音频数据
在ffmpeg命令中添加参数,禁用静音移除逻辑并指定无损编码:
% 替换原command行 command = strcat(ffmpegPath, " -i ", inputFile, " -af ""silenceremove=enable=0"" -c:a pcm_s16le ", outputFile);
参数说明:
-af "silenceremove=enable=0":明确禁用静音移除滤镜,确保所有音频段(包括静音)完整保留-c:a pcm_s16le:指定输出为PCM 16位无损格式(WAV原生编码),避免有损压缩丢失音频信息
2. 验证转码文件的完整性
转码完成后,用VLC查看WAV文件的时长,确认与原WebM文件一致。若时长匹配,说明静音时段已被保留。
3. 直接用MATLAB读取WebM(无需转码)
MATLAB R2022b及以上版本支持直接读取WebM文件,可跳过转码步骤:
listAudios = dir('Z:\data\files\*audio.webm'); nAudios = length(listAudios); for idxAud = 1:nAudios inputFile = fullfile(listAudios(idxAud).folder, listAudios(idxAud).name); [y,Fs] = audioread(inputFile); % 后续处理逻辑 end
注:低版本MATLAB可能需要额外安装编解码器,但优先推荐使用高版本直接读取。
4. 调整VLC转码设置(若偏好VLC)
如果坚持用VLC转码,需关闭静音修剪选项:
- 打开VLC,选择「媒体」→「转换/保存」
- 添加原WebM文件后点击「转换」
- 在「音频编解码器」设置中,取消所有与静音修剪、自动裁剪相关的选项
- 选择输出格式为WAV(无损)后执行转码
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

