中文、英语和泰语的 AI 陪伴与角色扮演
可以试试的想法
คืนนี้เป็นยังไงบ้าง เล่าให้ฟังหน่อยสิ เราอยากรู้จริง ๆ นะ
เมื่อวานที่เล่าเรื่องงานให้ฟัง วันนี้ดีขึ้นบ้างไหม
อย่าเพิ่งเดินออกไปสิ ฉันยังพูดไม่จบเลยนะ กลับมานั่งลงก่อน
หลับให้สบายนะ พรุ่งนี้ตื่นมาค่อยเล่าให้ฟังต่อก็ได้
每张卡片播放的都是 Nom Yen 按卡片脚本原文生成的真实音频。在语音页面打开后,可以让它说任何内容。
AI 陪伴如何学会说话
AI 陪伴是一场没有任务终点的对话,这改变了语音层要做的事。客服机器人说的是几种写好脚本的结果。AI 陪伴则要把模型写出的任何内容说出来,整晚不停,用的还是用户认定属于某个人的声音。问一个人为什么不再打开它,答案很少与文字有关。往往是某天声音有点不对劲,或者对方想说话时它还在说个不停。这份分量落在两件事上。第一是声音从不漂移,固定的音色库 ID 天然就能做到。第二是打断。人和 AI 陪伴聊天时会插话,一个对着没人在听的段落继续朗读的 AI 陪伴,会立刻失去像人的感觉。泰国是以聊天为先的市场,LINE 的月活跃用户达 5,600 万,占人口的 78.2%。泰语的 AI 陪伴通常是一款学会了说话的聊天产品。
对话开始时打开连接
一个 WebSocket 承载整个会话。开始时发送一次模型、音色和格式,之后每一轮都是已预热连接上的一个文本帧。
一次发送一句
模型写完一句就发送一句。回复的其余部分还在生成时,音频就开始返回。中途被打断的一轮,要付费的也只有那一句。
对方一开口就取消
cancel 帧会停止正在朗读的这一段,并丢弃缓冲中剩余的内容。会话保持打开,下一个文本帧开始下一轮。
一个连接,多轮对话,一次打断
-> {"type":"start","model":"paxa-tts-flash-v2","voice":"sanaechan"}
<- {"type":"started","connection":"c_8f21","voice":"sanaechan"}
-> {"type":"text","text":"คืนนี้เป็นยังไงบ้าง"}
<- {"type":"charged","seq":1,"chars":19,"credits":0.19}
<- [二进制音频帧]
<- {"type":"flushed","seq":1}
-> {"type":"text","text":"เล่าให้ฟังหน่อยสิ เราอยากรู้จริง ๆ นะ"}
<- {"type":"charged","seq":2,"chars":37,"credits":0.37}
<- [二进制音频帧]
# 用户开始说话
-> {"type":"cancel"}
<- {"type":"cancelled","seq":2}
-> {"type":"text","text":"ได้ ๆ ฟังอยู่"}第 2 段保留回执中报告的 0.37 积分,也就是相对连接累计总额的差额。它后面没有排队的内容,同一个连接无需重连就能承接下一轮。
AI 陪伴的语音费用
| 对话 | 回复数 | 字符 | 费用 |
|---|---|---|---|
| 一个晚上 | 20 | 2,400 | $0.02 |
| 一位活跃用户,一个月 | 1,200 | 144,000 | $1.44 |
| 1,000 位活跃用户,一个月 | 约 $1,440 | ||
按每 1,000 个字符 10 积分计算,每条回复 120 个字符,每天 40 条回复。计费以实际说出的字符为准。
一个角色的一生
选定音色
您试听整个音色库,选中一个。这个选择是配置里的一个 slug,之后再没有人需要考虑它。
语气定型
您看过真实对话后,把角色从客气调成亲近。这只是改了提示词:它写作时用的人称代词和语气词变了,读它们的音色没变。
有人对它产生了感情
声音还是对方初次遇见的那个,因为稳定音色的 slug 永远返回同一个声音。这里没有任何东西会退化或过期,也不会因为服务商改了什么而需要重录。
加入第二个角色
另一个 slug,另一份提示词。第一个角色完全不受影响,只和它聊天的用户察觉不到任何变化。
这条时间线上的每一步都用不到情感标签。随时间改变角色的,是文字和选角。
面向开发者
TypeScript 和 Python 示例打开实时连接,文字一到就发送,并读回回执和音频帧。选项请求展示 voice、model 和 format,一个角色设定一次,就能用上它的整个生命周期。
完整 API 参考// Runs on Bun as-is; on Node, `import WebSocket from "ws"` accepts // the same constructor options. Browsers cannot send this header, and // API keys never ship to browsers anyway. const socket = new WebSocket("wss://api.paxalabs.com/v1/tts/live", { headers: { Authorization: `Bearer ${process.env.PAXA_API_KEY}` }, }); socket.binaryType = "arraybuffer"; socket.onopen = () => { socket.send(JSON.stringify({ type: "start", model: "paxa-tts-flash-v2", voice: "khanomkrok", timestamps: "word", })); // Send text whenever it becomes available, token by token if you like. socket.send(JSON.stringify({ type: "text", text: "สวัสดีครับ ยินดีต้อนรับสู่ Paxa Labs" })); socket.send(JSON.stringify({ type: "flush" })); socket.send(JSON.stringify({ type: "end" })); }; socket.onmessage = (event) => { if (typeof event.data === "string") { const message = JSON.parse(event.data); if (message.type === "done") socket.close(); return; } player.feed(new Uint8Array(event.data)); // binary frames are audio };
import json import os from websockets.sync.client import connect # pip install websockets with connect( "wss://api.paxalabs.com/v1/tts/live", additional_headers={"Authorization": f"Bearer {os.environ['PAXA_API_KEY']}"}, ) as socket: socket.send(json.dumps({"type": "start", "model": "paxa-tts-flash-v2", "voice": "khanomkrok"})) socket.send(json.dumps({"type": "text", "text": "สวัสดีครับ ยินดีต้อนรับสู่ Paxa Labs"})) socket.send(json.dumps({"type": "flush"})) socket.send(json.dumps({"type": "end"})) with open("speech.mp3", "wb") as f: for frame in socket: if isinstance(frame, bytes): f.write(frame) # binary frames are audio continue event = json.loads(frame) if event["type"] == "done": break
curl -X POST https://api.paxalabs.com/v1/tts \ -H "Authorization: Bearer $PAXA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "text": "สวัสดีครับ ยินดีต้อนรับสู่ Paxa Labs", "voice": "khanomkrok", "model": "paxa-tts-flash-v2", "format": "mp3", "stream": false }' \ --output speech.mp3
试听音色
50 个正式音色中的几个,均通过 API 使用公开的音色 ID 生成。全部音色可在文本转语音页面试听。
- Mochav1 + v2在语音页面打开
- Tom Yumv1 + v2闺蜜
- Tao Huayv1 + v2剧情女主
- Khanom Krokv1 + v2男声主音色
泰语承载关系的方式不同
泰语在词语本身中标明关系。说话人如何称呼自己和对方,以及句末用哪个语气词,在任何语调介入之前就确定了两个人的相对位置。Paxa TTS Flash v2 从拼写中读出这一切,所以角色有多亲近由提示词决定,再由声音演绎出来。
常见问题
六个月后,角色的声音还会一样吗?
会。音色是音色库里固定的 ID,同一个 ID 每次请求都返回同一个声音。角色的声音不依赖任何需要您自己保存的样本。
用户打断时,它怎么停下来?
在实时连接上发送 cancel 帧。正在朗读的句子停止,排队的剩余内容被丢弃且不计费,同一个连接继续承接下一轮。
AI 陪伴能听起来开心或难过吗?
可以。Paxa TTS Flash v2 的每个音色都接受写在回复里方括号中的指示,例如 [happy] 或 [sad]。一句泰语的亲疏仍取决于书写时用的人称代词和语气词,以及您选用的音色。
能给每个角色扮演角色配一个独立的音色吗?
可以。每个角色可以用音色库中的 50 个音色之一,也可以用文字描述为它设计一个音色;按套餐不同,每个账户可保存 1 到 50 个设计音色。我们不提供声音克隆。
一个活跃的 AI 陪伴要花多少钱?
一位每天收到 40 条语音回复的用户,每月约 $1.44。语音按字符计费。聊得少的月份花得少,完全沉默的月份不产生费用。
从免费积分开始
使用 Google、GitHub 或 Hugging Face 登录,即可用 100 一次性免费积分处理您自己的文本。
相关阅读
- 2026 年泰语配音多少钱:录音棚、自由配音员与 AI
- 泰语 AI 配音怎么选:按用途挑选全部 34 个音色
- 如何为泰语 AI 配音撰写脚本
- 泰语没有句号:流式语音合成该在哪里断句
- 用十个句子评测一个泰语 AI 音色
- Paxa TTS Flash 开始说中文,并新增六个音色
- Paxa TTS Flash 新增两个能读情感标签的音色
- Paxa TTS Flash 在 104 毫秒内开始发声
- 文本转语音(TTS)是什么?AI 配音的原理与用途
- 如何为 TikTok、Reels 和 Shorts 添加 AI 配音
- 泰语文本转语音怎么选:应用、视频和电话线路
- YouTube AI 配音工具怎么选:解说旁白、无人出镜频道和 Shorts
- 免费文本转语音怎么选:个人项目与付费前试听音色
- 有声书和长篇朗读适合用哪款文本转语音工具
- 如何制作 AI 配音:从写稿到下载
- 用 AI 朗读小说:旁白音色与角色配音
- AI 音色设计怎么写描述:如何描述一个声音,附示例
- 音色设计与声音克隆:两种打造专属 AI 音色的方式
- 适合泰语音色、已保存音色和语音智能体的 AI 音色设计工具
- Paxa TTS Flash v2 文本转语音模型正式上线
- AI 音色设计现已上线
- Paxa TTS Flash v2 文本转语音新增 Temperature 与停顿标签