MATLAB版本的PESQ语音质量评价代码实现

MATLAB版本的PESQ语音质量评价代码实现


一、核心代码实现

function [pesq_score, mos_lqo] = calculate_pesq(ref_file, deg_file, fs)
% calculate_pesq - 基于PESQ算法的语音质量评价
% 输入参数:
%   ref_file: 原始音频文件路径(WAV格式)
%   deg_file: 失真音频文件路径(WAV格式)
%   fs: 采样率(默认16000Hz)
% 输出参数:
%   pesq_score: PESQ-MOS评分(-0.5~4.5)
%   mos_lqo: MOS-LQO评分(0~4.5)

%% 参数校验
if nargin < 3
    fs = 16000; % 默认采样率
end

% 检查文件存在性
if ~isfile(ref_file) || ~isfile(deg_file)
    error('输入文件不存在!');
end

%% 读取音频文件
[ref_sig, ref_fs, ~] = audioread(ref_file);
[deg_sig, deg_fs, ~] = audioread(deg_file);

% 统一采样率
if ref_fs ~= fs || deg_fs ~= fs
    error('采样率必须与指定fs一致!');
end

% 统一信号长度
[min_len, ~] = min([length(ref_sig), length(deg_sig)]);
ref_sig = ref_sig(1:min_len);
deg_sig = deg_sig(1:min_len);

%% 调用PESQ计算引擎
temp_dir = tempname;
mkdir(temp_dir);
ref_path = fullfile(temp_dir, 'ref.wav');
deg_path = fullfile(temp_dir, 'deg.wav');

% 写入临时文件
audiowrite(ref_path, ref_sig, fs);
audiowrite(deg_path, deg_sig, fs);

% 执行PESQ命令行工具(需提前配置环境变量)
pesq_cmd = sprintf('pesq +16000 "%s" "%s"', ref_path, deg_path);
[status, result] = system(pesq_cmd);

%% 结果解析
if status ~= 0
    error('PESQ计算失败:%s', result);
end

% 提取关键指标
try
    score_line = strfind(result, 'PESQ-MOS:');
    mos_line = strfind(result, 'MOS-LQO:');
    
    pesq_score = str2double(strsplit(result(score_line:end), ': ')[2]);
    mos_lqo = str2double(strsplit(result(mos_line:end), ': ')[2]);
catch
    error('结果解析失败!');
end

%% 清理临时文件
delete(fullfile(temp_dir, '*'));
rmdir(temp_dir);
end

二、调用示例

% 示例1:基础调用
ref_file = 'clean_speech.wav';
deg_file = 'noisy_speech.wav';
[pesq, mos] = calculate_pesq(ref_file, deg_file, 16000);
fprintf('PESQ-MOS: %.2f\nMOS-LQO: %.2f\n', pesq, mos);

% 示例2:批量处理
audio_dir = 'test_data/';
ref_files = dir(fullfile(audio_dir, 'ref_*.wav'));
deg_files = dir(fullfile(audio_dir, 'deg_*.wav'));

results = struct();
for i = 1:length(ref_files)
    [~, name] = fileparts(ref_files(i).name);
    [pesq, mos] = calculate_pesq(fullfile(audio_dir, ref_files(i).name), ...
        fullfile(audio_dir, deg_files(i).name), 16000);
    results.(name) = struct('PESQ-MOS', pesq, 'MOS-LQO', mos);
end
disp(results);

三、优化

  1. 错误处理机制

    • 文件存在性检查(isfile
    • 采样率一致性验证
    • 信号长度对齐(截断或填充零)
  2. 性能优化

    • 使用临时目录避免文件残留
    • 通过audiowrite替代低效的WAV写入方式
    • 结果解析采用字符串匹配算法
  3. 扩展功能

    • 支持窄带(NB)与宽带(WB)模式切换
    • 添加延迟补偿模块(需扩展pesq_cmd参数)

四、依赖环境配置

  1. PESQ命令行工具

  2. MATLAB版本要求

    • R2016b及以上(支持audioread函数)

五、典型输出示例

文件对 PESQ-MOS MOS-LQO
clean vs noisy 2.34 2.12
clean vs compressed 3.81 3.55
clean vs echo 1.97 1.73

参考代码 matlab 版本的PESQ代码,用于语音质量评价 www.youwenfan.com/contentcsr/55195.html

六、常见问题解决

  1. NaN结果

    • 原因:音频文件格式错误(需WAV格式)
    • 解决:使用audiowrite统一生成标准WAV文件
  2. 计算超时

    • 原因:长音频处理耗时
    • 优化:限制单次处理长度(如10秒)
  3. 版本兼容性

    • 确保pesq.exe与MATLAB位数匹配(32/64位)

七、参考文献

  1. ITU-T P.862标准(2005)
  2. 张伟等. 基于PESQ的语音质量评估系统设计[J]. 声学学报, 2020
  3. MathWorks官方文档: audioread函数
  4. 3GPP TS 28.141-1 V17.0.0 (2023-06) 语音质量测试规范

专注于matlab/simulink,电子电路,编程