PlayHt与Next.js 14集成指导:解决'tls'模块缺失报错
Next.js 14 集成 play.ht Node 模块解决 'tls' 模块缺失问题
报错原因
你遇到的 Cannot find module 'tls' 问题,是因为 play.ht 的 Node 模块依赖 Node.js 核心的 tls 模块,但 Next.js 14 的 API 路由默认可能使用 Edge Runtime(或者你不小心在客户端组件里导入了该模块)—— 而 Edge Runtime/浏览器环境不支持 Node.js 专属的核心模块。
解决步骤
1. 强制API路由使用Node.js Runtime
在你的 API 路由文件(比如 app/api/text-to-speech/route.ts)顶部,添加以下代码,明确指定运行环境为 Node.js:
export const runtime = 'nodejs'; // 关键:让路由在Node环境运行,支持tls等核心模块
2. 正确安装并导入play.ht
确保你已经安装了依赖:
npm install play.ht # 或者用pnpm/yarn pnpm add play.ht yarn add play.ht
然后在API路由里导入,绝对不要在客户端组件(比如page.tsx、客户端组件文件)里导入play.ht,只能在Node环境的API路由中使用:
import PlayHT from 'play.ht'; // 初始化play.ht,用你的API密钥和用户ID PlayHT.init({ apiKey: process.env.PLAY_HT_API_KEY!, userId: process.env.PLAY_HT_USER_ID!, });
3. 编写文本转音频的API逻辑
以下是完整的API路由示例,处理POST请求、调用play.ht生成音频并返回给前端:
export const runtime = 'nodejs'; import PlayHT from 'play.ht'; import { NextResponse } from 'next/server'; PlayHT.init({ apiKey: process.env.PLAY_HT_API_KEY!, userId: process.env.PLAY_HT_USER_ID!, }); export async function POST(request: Request) { try { const { text } = await request.json(); // 调用play.ht生成音频,这里以获取音频URL为例(也可以获取二进制数据) const audioUrl = await PlayHT.convertTextToSpeech(text, { voice: 's3://voice-cloning-zero-shot/d9ff78ba-d016-47f6-b0ef-dd630f59414e/female-cs/manifest.json', // 替换成你想用的语音 format: 'mp3', }); // 返回音频URL,前端可以直接用audio标签播放 return NextResponse.json({ audioUrl }); // 如果需要直接返回二进制音频数据,可参考: // const audioBuffer = await fetch(audioUrl).then(res => res.arrayBuffer()); // return new NextResponse(audioBuffer, { // headers: { // 'Content-Type': 'audio/mpeg', // }, // }); } catch (error) { console.error('音频生成失败:', error); return NextResponse.json({ error: '音频生成失败' }, { status: 500 }); } }
4. 前端调用示例
在客户端组件里,发送POST请求到API路由,获取音频后播放:
'use client'; export default function TTSPlayer() { const handleConvert = async (text: string) => { const res = await fetch('/api/text-to-speech', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ text }), }); const data = await res.json(); const audio = new Audio(data.audioUrl); audio.play(); }; return ( <div> <button onClick={() => handleConvert('测试文本转音频')}>生成并播放音频</button> </div> ); }
注意事项
- 确保你的
PLAY_HT_API_KEY和PLAY_HT_USER_ID配置在.env.local文件中,不要硬编码在代码里。 - play.ht的API调用可能有频率限制,建议根据官方文档处理错误和重试逻辑。
内容的提问来源于stack exchange,提问作者Deep Shetye
相关产品推荐
相关产品推荐

