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

从Google Drive获取WAV文件生成AudioBuffer遇报错及字段缺失问题

问题解决:Google Drive WAV文件获取AudioBuffer报错及webContentLink缺失问题

一、解决TypeError: response.body.getReader is not a function报错

报错原因

  1. gapi.client.drive.files.get不支持responseType: "stream"配置,返回的response.body并非浏览器原生的ReadableStream对象,因此没有getReader()方法。
  2. 错误使用createMediaStreamSource:该API用于处理实时媒体流(如麦克风/摄像头输入),而decodeAudioData直接接收ArrayBuffer格式的音频数据即可,无需转成媒体流。

修正后的代码

const query = `parents='${folderId}' and mimeType = 'audio/wav'`;
const response = await gapi.client.drive.files.list({
  q: query,
  supportsAllDrives: true,
  includeItemsFromAllDrives: true,
});
const files = response.result.files;
console.log("AUDIO files: ", files);

// Web Audio API 初始化(需确保在用户交互后创建,如点击事件内)
const context = new AudioContext();
const channel0Buffers = [];
const channel1Buffers = [];

for (let i = 0; i < files.length; i++) {
  const file = files[i];
  const fileId = file.id;
  
  // 获取音频文件的ArrayBuffer数据
  const audioResponse = await gapi.client.drive.files.get({
    fileId: fileId,
    alt: "media",
    supportsAllDrives: true,
    includeItemsFromAllDrives: true,
  });
  
  // 确保数据是标准ArrayBuffer格式
  const arrayBuffer = audioResponse.body instanceof ArrayBuffer 
    ? audioResponse.body 
    : new Uint8Array(audioResponse.body).buffer;
  
  // 解码音频数据为AudioBuffer
  const audioBuffer = await context.decodeAudioData(arrayBuffer);
  
  // 按需求分类存储
  if (i < 2) {
    channel0Buffers.push(audioBuffer);
  } else {
    channel1Buffers.push(audioBuffer);
  }
}

二、解决无法获取webContentLink的问题

常见原因及解决方案

  1. 未指定返回字段
    在files.list或files.get请求中,必须显式指定fields参数包含webContentLink,否则默认不会返回该字段:

    // 示例:files.list时指定返回字段
    const response = await gapi.client.drive.files.list({
      q: query,
      supportsAllDrives: true,
      includeItemsFromAllDrives: true,
      fields: "files(id, name, webContentLink)" // 按需添加其他字段
    });
    
  2. 文件权限限制

    • 若文件仅设置了「查看」权限,而非「查看和下载」,则不会返回webContentLink,需调整文件共享权限。
    • 共享驱动器中的文件,需确保当前授权账号拥有下载权限。
  3. 替代下载方案
    如果无法获取webContentLink,可直接构造下载链接:

    https://www.googleapis.com/drive/v3/files/{fileId}?alt=media
    

    该链接配合gapi自动携带的授权头,可直接用于浏览器下载或请求音频数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:56:20