Gemini销售增长营收AI 评分 · 待评分AI 辅助编辑·未发现明显提示词注入风险n8n.io

用 Google Gemini 将 PDF 转为 AI 播客

上传 PDF → Gemini 生成对话脚本 → TTS 合成语音 → 输出 WAV 音频

有一点经验步骤流程提示词贴士
给谁
内容创作者、教育工作者、研究者、营销人员,希望将书面内容转为音频
你会得到
将 PDF 文档自动转换为 5-7 分钟的自然对话式播客音频(WAV 格式)
你需要
n8n

硬约束

前置条件:n8n 实例;Google Gemini API 密钥(在 n8n 中配置为 googlePalmApi 凭证);HTTP 自定义认证(httpCustomAuth)。PDF 需为文本型且小于 10MB。TTS 调用 gemini-2.5-flash-preview-tts 预览版端点,可能受 Google 访问策略或额度限制。

他们做了什么

作者 iamthis 在 n8n 模板库发布了该工作流,展示如何将 PDF 文档通过 Gemini AI 自动转为播客音频。工作流包含 8 个功能节点:手动触发、PDF 文本提取、LLM 脚本生成、Gemini 2.0 Flash 模型、TTS 请求准备、HTTP TTS 调用、音频处理、二进制文件保存。

效果如何

来源(模板页面)未报告具体运行结果或性能数据;仅描述功能预期。

值得知道

TTS 端点为 gemini-2.5-flash-preview-tts 预览版,可能受 Google 访问限制或额度约束,非稳定生产 API。PDF 限制为文本型且小于 10MB。脚本长度目标为 750-1000 词(约 5-7 分钟朗读),实际时长受语速和 TTS 模型影响。WAV 封装使用 24000Hz/单声道/16bit PCM,来源代码含 base64 解码和 WAV 头生成逻辑。如需扩展,可在脚本生成前插入文本清洗节点,或将输出接入云存储/通知服务。

n8n 工作流模板

结构已检查 · 未实际运行

下载后在 n8n 选择“Import from File”,或复制 JSON 后粘贴到编辑器。先配置自己的账号,再用测试数据运行;模板默认未启用。

配置与测试清单

需要绑定的凭证

  • Google Gemini Flash 2.0 节点:绑定Google Gemini/PaLM API 凭证。
  • 🎙️ Convert Text to Speech With Gemini 节点:绑定Google Gemini/PaLM API 凭证。
  • 🎙️ Convert Text to Speech With Gemini 节点:绑定httpCustomAuth 凭证。

需要替换的配置

  • 源模板来自 n8n 公开库 #4883(约 10 个节点)。导入后先保持未启用,核对触发器、表达式与外部 API 端点。
  • Sticky Note 中的说明仅供参考;按自己的账号、表结构或频道 ID 替换占位配置。

测试输入与预期结果

  • 在测试环境手动执行一次主路径,确认每个需凭证的节点已连接且无鉴权错误。
  • 用一条合成/脱敏样例数据跑通,核对输出字段与下游写入目标,再考虑生产启用。

模板处理说明

  • 已移除原作者凭证绑定、webhookId 与执行数据,工作流设为未启用;节点、连线与原文提示词保持原样。未在 n8n 中实际运行。
  • 未改业务逻辑;运行前请自行核对密钥、配额与隐私合规。

模板获取日期: 2026-10-24

步骤

  1. 配置凭证与语音

    在 n8n 的 Credentials 中添加 Google Gemini(PaLM) API 账户。获取 API 密钥地址:https://aistudio.google.com/。如需调整音色,在后续步骤的 voiceName 字段中选择 Kore(专业)、Aoede(对话)或 Laomedeia(活力)。

  2. 上传 PDF 并提取文本

    使用 Manual Trigger 节点启动工作流,上传 PDF 文件。Extract from File 节点以 operation=pdf、binaryPropertyName=data0 提取文本内容。

  3. 生成播客脚本

    将提取的文本传入 Basic LLM Chain 节点,由 Google Gemini Flash 2.0(models/gemini-2.0-flash-001)生成对话式播客脚本。

    运行提示词 · 来源原文。Basic LLM Chain 节点的 messages.messageValues[0].message 字段

    =Create an engaging podcast script based on the following content. The script should be exactly 5-7 minutes when read aloud (approximately 750-1000 words).  CONTENT TO DISCUSS: {content}  STYLE: {style}  PODCAST SCRIPT REQUIREMENTS: 1. Start with: "Welcome to our AI-generated podcast. Today we're diving into..." 2. Structure: Introduction, 2-3 main discussion points, conclusion 3. Use natural conversational language 4. Include smooth transitions between topics 5. Add brief pauses with periods and commas for natural speech 6. Avoid complex punctuation that might confuse TTS 7. End with: "Thanks for listening! This has been your AI podcast." 8. Write ONLY the spoken content (no stage directions) 9. Keep sentences moderate length for clear speech 10. Use engaging storytelling techniques
  4. 准备 TTS 请求体

    Code 节点将脚本文本封装为 Gemini TTS API 的请求体,指定 responseModalities 包含 AUDIO,并设置语音配置。

    运行提示词 · 来源原文。Code 节点 'Prepare TTS Request' 的 jsCode 字段

    const script = $input.first().json.text;
    const voiceName = $input.first().json.voiceName || "Kore";
    
    return {
      json: {
        requestBody: {
          contents: [{
            parts: [{
              text: script
            }]
          }],
          generationConfig: {
            responseModalities: ["AUDIO"],
            speechConfig: {
              voiceConfig: {
                prebuiltVoiceConfig: {
                  voiceName: voiceName
                }
              }
            }
          }
        }
      }
    };
  5. 调用 Gemini TTS 生成语音

    HTTP Request 节点向 https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent 发送 POST 请求,使用 googlePalmApi 凭证认证,请求体来自上一步的 requestBody。

  6. 处理音频响应并保存 WAV

    Code 节点解析返回的 base64 音频数据,解码为 PCM16 字节流,添加 WAV 头(采样率 24000Hz、单声道、16bit),最终由 Write Binary File 节点保存为 .wav 文件。

    运行提示词 · 来源原文。Code 节点 'Process Audio Response' 的 jsCode 字段

    const response = $input.all()[0].json;
    
    console.log('=== GEMINI TTS DEBUG ===');
    console.log('Response status:', response.candidates?.[0]?.finishReason);
    
    if (response.candidates?.[0]?.finishReason === 'STOP') {
      try {
        // Get the base64 audio data
        const base64AudioData = response.candidates[0].content.parts[0].inlineData.data;
        const mimeType = response.candidates[0].content.parts[0].inlineData.mimeType;
        
        console.log('Audio data length:', base64AudioData.length);
        console.log('Mime type:', mimeType);
        
        // CRITICAL FIX: Properly decode base64 to actual audio bytes
        const actualAudioBytes = Buffer.from(base64AudioData, 'base64');
        
        console.log('Decoded audio size:', actualAudioBytes.length);
        
        // Create WAV file with proper PCM16 format
        const sampleRate = 24000;
        const channels = 1;
        const bitsPerSample = 16;
        
        // Create WAV header
        const wavHeader = createWavHeader(actualAudioBytes.length, sampleRate, channels, bitsPerSample);
        const wavFile = Buffer.concat([wavHeader, actualAudioBytes]);
        
        const filename = `tts_fixed_${Date.now()}.wav`;
        
        return {
          json: {
            success: true,
            filename: filename,
            audioSize: wavFile.length,
            audioSizeMB: (wavFile.length / 1024 / 1024).toFixed(2),
            originalBase64Length: base64AudioData.length,
            decodedAudioLength: actualAudioBytes.length
          },
          binary: {
            audio: {
              data: wavFile,
              mimeType: 'audio/wav',
              fileName: filename
            }
          }
        };
        
      } catch (error) {
        return {
          json: {
            success: false,
            error: error.message,
            step: 'audio_processing'
          }
        };
      }
    } else {
      return {
        json: {
          success: false,
          error: 'TTS generation failed',
          finishReason: response.candidates?.[0]?.finishReason || 'unknown',
          response: response
        }
      };
    }
    
    // Helper function to create WAV header
    function createWavHeader(dataLength, sampleRate, channels, bitsPerSample) {
      const byteRate = sampleRate * channels * bitsPerSample / 8;
      const blockAlign = channels * bitsPerSample / 8;
      const header = Buffer.alloc(44);
      
      // "RIFF" chunk descriptor
      header.write('RIFF', 0);
      header.writeUInt32LE(36 + dataLength, 4);
      header.write('WAVE', 8);
      
      // "fmt " sub-chunk
      header.write('fmt ', 12);
      header.writeUInt32LE(16, 16); // Sub-chunk size
      header.writeUInt16LE(1, 20);  // Audio format (PCM)
      header.writeUInt16LE(channels, 22);
      header.writeUInt32LE(sampleRate, 24);
      header.writeUInt32LE(byteRate, 28);
      header.writeUInt16LE(blockAlign, 32);
      header.writeUInt16LE(bitsPerSample, 34);
      
      // "data" sub-chunk
      header.write('data', 36);
      header.writeUInt32LE(dataLength, 40);
      
      return header;
    }

可复制提示词

搭建指导 · 本站建议版本。交给搭建助手,用于确认输入、权限和节点配置

这一段是提示词,页面不会在这里插入广告。

你正在复现 n8n 模板 #4883:将 PDF 转为 AI 播客。请先确认已配置 Google Gemini(PaLM) API 凭证,并准备一份文本型 PDF(<10MB)。工作流核心链路为:提取 PDF 文本 → Gemini 2.0 Flash 生成 750-1000 字对话脚本 → 封装 TTS 请求 → 调用 gemini-2.5-flash-preview-tts → 解码 base64 音频并包装为 WAV → 保存文件。如需调整风格,修改 Generate Podcast Script 节点的 message 内容;如需换音色,修改 Prepare TTS Request 中的 voiceName 变量。

先测试单个 PDF,检查 n8n 执行日志中的 GEMINI TTS DEBUG 输出。若 finishReason 非 STOP,需排查 API 额度或模型访问权限。

来源

Convert PDF documents to AI podcasts with Google Gemini and text-to-speech · iamthis · n8n.io · 2025-06-11

留言与反馈

试过这个方法吗?分享效果、遇到的问题或改进建议。留言审核后公开,请勿填写敏感信息。

正在加载…

    相关用例