You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04(Jetson Orin Nano)下Librosa无法保存图像求助

解决Jetson Orin Nano上matplotlib无法保存图像的问题

针对你在Jetson Orin Nano(Ubuntu 22.04 LTS)上遇到的plt.savefig无法生成图像文件的问题,以下是排查和修复方案:

核心问题排查方向

1. 路径分隔符跨平台兼容问题

代码中使用split('\\')分割文件名,这是Windows系统的路径分隔符,在Linux下会失效。比如Linux下音频文件路径是./Record/xxx.wav,用split('\\')无法分割出文件名,最终生成的保存路径会包含整个原始路径,导致文件无法写入。

修复方法:使用Python内置的os.path模块处理路径,保证跨平台兼容:

filename = os.path.splitext(os.path.basename(wav_file[num]))[0]

2. 目标目录不存在

如果./Spectrogram/5s/目录未提前创建,plt.savefig不会自动递归创建目录,直接导致保存失败。

修复方法:在保存图像前检查并创建目录:

save_dir = './Spectrogram/5s/'
os.makedirs(save_dir, exist_ok=True)  # exist_ok=True避免目录已存在时报错

3. matplotlib后端适配问题

Jetson设备通常运行无桌面环境,matplotlib默认的交互式后端(如TkAgg)可能未安装或无法正常工作,导致图像无法渲染保存。

修复方法:在导入matplotlib后设置无界面后端Agg:

import matplotlib.pyplot as plt
plt.switch_backend('Agg')  # 切换到无界面后端

4. 目录写入权限问题

如果当前用户没有./Spectrogram/5s/目录的写入权限,plt.savefig会静默失败(无报错但无文件生成)。

修复方法:

  • 检查目录权限:ls -ld ./Spectrogram/5s/
  • 赋予写入权限:chmod 755 ./Spectrogram/5s/(或根据需求调整权限)

修改后的完整代码

import librosa
import glob
from PIL import Image
import os
import numpy as np
import matplotlib.pyplot as plt
import time

# 切换matplotlib后端为无界面的Agg,适配Jetson环境
plt.switch_backend('Agg')

hop_length = 1024
num = 0
num_10s = 1

# 提前创建保存目录
save_dir = './Spectrogram/5s/'
os.makedirs(save_dir, exist_ok=True)

while True:
    wav_file = glob.glob('./Record/*.wav')
    if not wav_file:
        print("Record目录下无wav文件")
        time.sleep(1)
        continue
    
    data_5s_y, data_5s_sr = librosa.load(wav_file[num]) 
     
    d_data_5s_y = librosa.amplitude_to_db(np.abs(librosa.stft(data_5s_y, hop_length=hop_length)), ref=np.max)

    librosa.display.specshow(d_data_5s_y, y_axis='log', x_axis='time', 
                             sr=data_5s_sr, hop_length=hop_length)
    plt.axis('off')

    # 跨平台方式获取文件名
    filename = os.path.splitext(os.path.basename(wav_file[num]))[0]
    save_path = os.path.join(save_dir, f"{filename}.png")
    
    plt.savefig(save_path, bbox_inches='tight', pad_inches=0)
    plt.close()  # 关闭图形释放内存,避免内存泄漏

    png_file = glob.glob(os.path.join(save_dir, '*.png'))
    if png_file:
        im = Image.open(png_file[0])
        # 这里可以添加对im的处理逻辑
    else:
        print("未生成png文件")
    
    num += 1
    # 可选:循环处理完所有文件后重置num
    if num >= len(wav_file):
        num = 0
    time.sleep(1)  # 避免循环过快占用资源

额外优化点

  • 添加plt.close():每次保存后关闭图形,避免Jetson设备内存泄漏
  • 增加文件存在性检查:避免因wav_file为空或png_file为空导致报错
  • 使用os.path.join拼接路径:进一步保证跨平台兼容性

内容的提问来源于stack exchange,提问作者TRUE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:06:13