Halcom 发表于 2024-1-5 21:11:56

sndfile.h读取音频

当你使用sf_open函数打开音频文件后,你可以使用sf_read_float函数来读取音频数据。这个函数将返回一个指向浮点数数组的指针,其中包含了音频样本值。

下面是一个示例代码片段,演示如何使用sf_read_float函数读取音频数据:

cpp
复制
#include <sndfile.h>#include <iostream>int main() {
    SF_INFO info;
    SNDFILE* file = sf_open("audio_file.wav", SFM_READ, &info);
    if (!file) {
      std::cerr << "Failed to open file" << std::endl;
      return 1;
    }
    // 读取音频数据
    float* buffer = new float;
    sf_read_float(file, buffer, info.frames);
    // 处理音频数据(例如,输出样本值)
    for (int i = 0; i < info.frames; ++i) {
      std::cout << buffer << std::endl; // 输出每个样本的浮点值
    }
    delete[] buffer; // 释放内存
    // 关闭音频文件句柄
    sf_close(file);
    return 0;
}


在上述代码中,我们首先打开音频文件并检查是否成功打开。然后,我们创建一个浮点数数组buffer来存储音频数据,并使用sf_read_float函数读取音频数据到缓冲区中。最后,我们遍历缓冲区中的每个样本值,并将其输出到控制台。最后,我们释放内存并关闭音频文件句柄。

请注意,上述代码中的浮点数数组buffer的大小是根据音频文件的帧数确定的。你需要确保分配足够的内存来存储音频数据。

Halcom 发表于 2024-1-5 21:12:26

要将使用sf_read_float函数获取的音频数据转换为Tensor,你可以使用PyTorch库。下面是一个示例代码片段,演示了如何完成这个过程:

cpp
复制
#include <soundfile.h>#include <torch/script.h>#include <vector>torch::Tensor LoadAudioFile(const std::string& filename) {
    SF_INFO info;
    SNDFILE* file = sf_open(filename.c_str(), SFM_READ, &info);
    if (!file) {
      std::cerr << "Failed to open file" << std::endl;
      return torch::Tensor();
    }
    // 读取音频数据
    std::vector<float> data(info.frames);
    sf_read_float(file, data.data(), info.frames);
    sf_close(file);
    // 将数据转换为Tensor
    torch::Tensor tensor_data = torch::from_blob(data.data(), {1, info.channels, info.frames});
    tensor_data = tensor_data.permute({2, 0, 1});// 调整维度顺序为 [时间, 通道, 批次]
    tensor_data = tensor_data.to(torch::kFloat32);// 将数据类型转换为float32
    return tensor_data;
}


在这个示例中,我们首先使用soundfile库的sf_open函数打开音频文件,并获取音频文件的元数据。然后,我们使用sf_read_float函数读取音频数据到一个std::vector中。接下来,我们将原始数据转换为PyTorch的Tensor对象,并调整维度顺序。最后,我们将数据类型转换为float32。

请注意,这个示例中的Tensor形状是[时间, 通道, 批次],其中时间表示音频信号的时间长度,通道表示音频的通道数(例如,立体声为2),批次表示批次大小(在这里设置为1)。根据你的具体需求,你可能需要调整Tensor的形状和维度顺序。
页: [1]
查看完整版本: sndfile.h读取音频