Mother Cup

C 题:音频文件的高质量读写与去噪优化

关键词:

  • 保证音频质量进行高效存储和传输
  • 不同音频文件不同编码算法:WAV、MP3、FLAC
  • 采样率、比特深度、压缩算法
  • 污染:空调声、电脑风扇、室外交通、设备电流(针对性的去噪算法)

问题 1:

image

  • 多元线性回归(多输入 Y=AX+BY+CZ)

因素量化:

  • 文件大小(S):直接以文件体积(单位:MB)衡量,数值越小越好。
  • 音质损失(Q):使用客观指标如信噪比(SNR)或主观评分(MOS),数值越大表示音质越好。
  • 编解码复杂度(C):以编码/解码时间(秒)或 CPU 占用率衡量,数值越小越好。
  • 适用场景(A):分类变量(如流媒体=1,专业录音=2),需转换为权重系数。

数据标准化

  • 文件大小(越小越好) :归一化到(0,1)区间

    Snorm = 1 - (S - Smin ) / ( Smax - Smin)

  • 音质损失:适用 SNR(信噪比)---> 正向指标,越大越好

    Qnorm = (SNR - SNRmin) / (SNRmax - SNRmin)

  • 复杂度(越小越好)

    Cnorm = 1 - (C - Cmin)/ ( Cmax - Cmin )

  • 适用场景(越大越好)

对归一化解释:

  • 正向指标:(数值越大越好)

    Qnorm = (SNR - SNRmin) / (SNRmax - SNRmin)

  • 逆向指标:(数值越小越好)

    Cnorm = 1 - (C - Cmin)/ ( Cmax - Cmin )

层次分析法(AHP):分析权重

image

image

image

第二行第一列:费用比景色明显重要-->5

判断矩阵

大小 音质损 编解码 适用场景 S Q C A 大小 S 1 1/3 1/2 2 音质 Q 3 1 3 3 编解 C 2 1/3 1 1 适用 A 1/2 1/3 1 1 列归一化后: S Q C A S 0.1538 0.0833 0.0769 0.2857 Q 0.4615 0.2500 0.4615 0.4286 C 0.3077 0.0833 0.1538 0.1429 A 0.0769 0.0833 0.1538 0.1429 行平均值(权重): S: (0.1538+0.0833+0.0769+0.2857)/40.15 Q: (0.4615+0.2500+0.4615+0.4286)/40.55 C: (0.3077+0.0833+0.1538+0.1429)/40.20 A: (0.0769+0.0833+0.1538+0.1429)/40.10

代码参考:

import numpy as np def audio_quality_score(file_size, quality, complexity, scenario_type, scenario_weights=None, verbose=False): """ 计算音频格式的综合评分(问题1的权重函数) 参数: - file_size: 文件大小(单位MB),数值越小越好 - quality: 音质评分(0-100或SNR等指标),数值越大越好 - complexity: 编解码复杂度(如时间秒数或CPU占用率),数值越小越好 - scenario_type: 场景类型,字符串如 "streaming" 或 "professional" - scenario_weights: 自定义场景权重字典(可选) - verbose: 是否打印中间结果 返回: - 综合评分(0~1,越高表示综合性能越好) """ # 默认权重(基于AHP的示例结果) weights = { 'file_size': 0.15, # 文件大小权重 'quality': 0.55, # 音质权重 'complexity': 0.20, # 复杂度权重 'scenario': 0.10 # 场景权重 } # 场景权重映射(可扩展) scenario_map = { # 专业录音场景更重视音质,流媒体更重视文件大小 'professional': {'quality': 0.6, 'file_size': 0.1}, 'streaming': {'quality': 0.4, 'file_size': 0.3}, 'default': {'quality': 0.55, 'file_size': 0.15} } # 自定义场景权重覆盖默认值 if scenario_weights: for k in ['quality', 'file_size']: if k in scenario_weights: weights[k] = scenario_weights[k] # 数据标准化(假设输入为多个样本的numpy数组) def normalize(x, is_reverse=False): """Min-Max标准化,is_reverse=True表示数值越小越好""" x = np.asarray(x) x_norm = (x - x.min()) / (x.max() - x.min() + 1e-8) return 1 - x_norm if is_reverse else x_norm # 参数标准化(假设输入为单个样本) S_norm = 1 - normalize([file_size], is_reverse=True)[0] # 文件大小越小越好 Q_norm = normalize([quality])[0] # 音质越大越好 C_norm = 1 - normalize([complexity], is_reverse=True)[0] # 复杂度越小越好 # 场景得分计算 if scenario_type in scenario_map: scenario_params = scenario_map[scenario_type] A_score = scenario_params['quality'] * Q_norm + scenario_params['file_size'] * S_norm else: A_score = weights['quality'] * Q_norm + weights['file_size'] * S_norm # 综合评分 score = (weights['file_size'] * S_norm + weights['quality'] * Q_norm + weights['complexity'] * C_norm + weights['scenario'] * A_score) if verbose: print(f"标准化结果: S={S_norm:.2f}, Q={Q_norm:.2f}, C={C_norm:.2f}, A={A_score:.2f}") print(f"权重分配: {weights}") return score # 示例用法 if __name__ == "__main__": # 示例数据(WAV格式) score_wav = audio_quality_score( file_size=50, # 50MB quality=95, # 音质评分95 complexity=10, # 编码时间10秒 scenario_type="professional", verbose=True ) print(f"WAV综合评分: {score_wav:.4f}") # 示例数据(MP3格式) score_mp3 = audio_quality_score( file_size=5, # 5MB quality=75, # 音质评分75 complexity=2, # 编码时间2秒 scenario_type="streaming", verbose=True ) print(f"MP3综合评分: {score_mp3:.4f}")

问题 2:

image

题目要分析:

  • 采样率
  • 比特深度
  • 压缩算法

咱们分析

  1. 场景(语音 or 音乐)

  2. 音质

  3. 效率

#伪代码形式 if 语音 score = 0.6 * 效率 + 0.4 * 音质 elif 音乐 score = 0.4 * 音质 + 0.6 * 效率

实际代码:

# 基于场景的动态权重 WEIGHT_PROFESSIONAL = { #音乐更注重音质 'quality': 0.60, # 音质总权重 'efficiency': 0.40 # 效率总权重 } WEIGHT_STREAMING = { #语音更注重效率 'quality': 0.40, 'efficiency': 0.60 } # 场景权重选择 if scenario_type == "professional": weights = WEIGHT_PROFESSIONAL else: weights = WEIGHT_STREAMING # 最终评分 final_score = (weights['quality'] * quality_score + weights['efficiency'] * efficiency_score)
  • 如何评价:

    • 如何提取文件大小

      # 获取文件大小(单位MB) file_path = os.path.join(folder_path, file) file_size = os.path.getsize(file_path) / (1024 * 1024)
    • 如何评价音质

      • 采样率
      • 比特深度
      • 编码质量
      #音质维度评分 #包括采样率、比特深度和编码质量三个子项。 S_rate = _normalize(sampling_rate, 8000, 48000) # 采样率标准化 S_depth = _normalize(bit_depth, 8, 24) # 比特深度标准化 S_codec = CODEC_SCORES[codec]["quality"] # 编码质量 #子权重分配: SUB_WEIGHTS = { 'sampling_rate': 0.4, #采样率 'bit_depth': 0.4, #比特深度 'codec_quality': 0.2 #编码质量 } #计算音质评分 quality_score = ( SUB_WEIGHTS['sampling_rate'] * S_rate + SUB_WEIGHTS['bit_depth'] * S_depth + SUB_WEIGHTS['codec_quality'] * S_codec )
    • 需要注意的是

      01b23e8445d1e41e84402e9e983072b

      f78fcf7124cbab17a194fd7ff728e45

      .wav 文件: 没有码率 kbps

      .aac 文件:没有比特深度

      .mp3 文件:没有比特深度

      • 如何处理呢?

        .wav 文件比特深度为 0

        .acc、.mp3 文件比特深度为 0

        # 判断是否为未压缩格式(WAV) if "bit" in parts[2]: params.update({ "codec": "WAV", "bit_depth": int(parts[2].replace("bit", "").strip()), "bitrate": None # WAV无码率 }) else: # 处理压缩格式(AAC/MP3) if len(parts) < 4: raise ValueError(f"压缩文件缺少码率字段:{filename}") # 提取码率并容错(兼容"kbp3"等错误拼写) bitrate_str = parts[3].lower().replace("kbps", "").replace("kbp", "") params.update({ "codec": parts[2], "bitrate": int(''.join(filter(str.isdigit, bitrate_str))), "bit_depth": None # 压缩格式无比特深度 })
    • 如何评价效率维度评分(文件大小 and 文件名)

      #效率维度评分 #包含文件大小and解码复杂度 #子权重分配 0.7 0.3 efficiency_score = 0.7 * S_size + 0.3 * S_complexity CODEC_SCORES = { "WAV": {"quality": 1.0, "complexity": 0.1}, "AAC": {"quality": 0.7, "complexity": 0.4}, "MP3": {"quality": 0.5, "complexity": 0.6} } # 效率维度 S_size = _normalize(file_size, 0.1, 100, reverse=True) # 文件大小标准化 S_complexity = 1 - CODEC_SCORES[codec]["complexity"] # 复杂度标准化

最终评分

final_score = (weights['quality'] * quality_score + weights['efficiency'] * efficiency_score)

问题 3:

问题 4:

image

1 操作
XuGong 在 2025-04-19 11:18:21 更新了该帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...