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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:42:50