Orux AI / 模型观察
Qwen3 TTS双语课程稿:分段不丢字,先检查再合成
双语课程稿不应为了凑字数而截断指令。本文按Qwen3 TTS与speech-2.8-hd当前表单准备输入,提供保留空格与标点的Python分段器、3段实际输出和超长拒绝检查;区分600字段上限、UTF-16代码单元与计费字符,附Credits对照,不把本地文本验证冒充发音实测。附拒绝样本。

文章目录
合成语音前,先把课程稿拆成能审阅的小段
一份双语户外课程稿,可能先用英文讲指令,再用中文安排观察任务,然后切回英文。把整个文档直接塞进语音表单,不一定是合适的起点。课程作者需要保留措辞、控制每段输入边界,并方便检查顺序;机械地每隔固定字数切一刀,可能把指令截断。
本文交付一个离线 Python 分段器,为当前 Orux 的 qwen3-tts-flash 表单准备文字,并以 speech-2.8-hd 作为另一目录选项。示例输出三段有序文字,保留全部原始字符,遇到超长片段就拒绝,不悄悄丢弃或截切。本文没有生成音频,也未验证发音或承诺模型能自然处理双语课程;这些需要后续审听。
边界必须说清:当日两个 Orux 表单的朗读文字字段均声明最大600字符。工具采用本地 UTF-16代码单元上限,演示时缩小为80。这是本例保守的文字准备规则,不是计费字符定义,也不是模型家族原生上下文上限。输入限制、文本表示和计费数量要分开理解。

先核对两个表单的交接契约
qwen3-tts-flash 使用 input 字段,音色选项列有 Cherry;speech-2.8-hd 使用 text,音色列有 male-qn-qingse。2026年11月1日核对的两份公开表单,文字最大长度均为600。这些是具体表单的契约,不能因任务都生成语音,就互换字段名。
上述资料不证明表单支持其他地方宣传的所有音色、高级发音标记、逐句语言控制或精确时长。音色名称尤其不能证明特定英文单词或中文地名会读对。获准生成后,应使用一小段已批准文字审听;拟定朗读稿不能冒充已经通过检查的录音。
课程稿本身应保留为可审阅源文件。分段产物保存序号和准确文字,后续音频清单再关联已批准音色及结果文件。教师改动一句时,明确边界有助于找到需重生成的部分,但不能承诺新旧录音无缝衔接。
明确这个小工具怎样判断句界
分段器识别中文句号、问号、叹号,以及后接空白或字符串结束的英文句号、问号、叹号。因此不会把简单小数3.5内部的句点当边界。它不理解全部缩写、引号和语言惯例,仍需作者检查分段。
程序不裁掉空格、不统一标点,再把相邻片段合并到所选上限。单个片段超长时,不为了通过计数而硬切,而是报错要求人工改写。这里优先保留原文和使用简单边界,不是自动接受所有文档。
空白输入会被拒绝,本地上限必须是1至600的整数。演示选80,是为了让短小夹具确实走到多段路径,不是推荐音频时长,也不表示80代码单元会读出多少秒。语速、停顿和交付时长都需要从实际录音测量。
本地运行完整分段器
保存为 chunk_lesson.py,运行 python3 chunk_lesson.py。代码仅用标准库,无需 API Key,也不联网。输入是虚构的教学文字:观察叶片而不采摘植物;它是编辑夹具,不是模型回复、课堂试验或真实教师录音。
"""Local text preparation only. No TTS request or billed-character measurement."""
import json
import re
def units(text):
return len(text.encode("utf-16-le")) // 2
def chunks(text, limit=600):
if not isinstance(text, str) or not text.strip():
raise ValueError("A nonempty lesson is required")
if type(limit) is not int or not 1 <= limit <= 600:
raise ValueError("Choose a local cap from 1 to 600 UTF-16 units")
pieces = re.split(r"(?<=[。!?])|(?<=[.!?])(?=\s|$)", text)
result, current = [], ""
for piece in pieces:
if not piece:
continue
if units(piece) > limit:
raise ValueError("One segment exceeds cap; edit it manually")
if current and units(current + piece) > limit:
result.append(current)
current = ""
current += piece
if current:
result.append(current)
assert "".join(result) == text
assert all(0 < units(x) <= limit for x in result)
return result
if __name__ == "__main__":
lesson = ("Welcome to the field lesson. Observe the leaf before naming it. "
"先观察叶子的边缘,再记录它的形状。不要采摘植物。 "
"Write one observation in your notebook. Then compare it with your partner.")
output = chunks(lesson, limit=80)
assert len(chunks("Ready 🌿. Next step.", 12)) == 2
assert units("🌿") == 2 and len("🌿") == 1
for text, limit in [("x" * 81, 80), ("", 80), (lesson, 601)]:
try:
chunks(text, limit)
except ValueError:
pass
else:
raise AssertionError("Invalid lesson accepted")
print(json.dumps([{"part": i+1, "utf16_units": units(t), "text": t}
for i, t in enumerate(output)], ensure_ascii=False, indent=2))实际本地输出:
[
{
"part": 1,
"utf16_units": 63,
"text": "Welcome to the field lesson. Observe the leaf before naming it."
},
{
"part": 2,
"utf16_units": 65,
"text": " 先观察叶子的边缘,再记录它的形状。不要采摘植物。 Write one observation in your notebook."
},
{
"part": 3,
"utf16_units": 35,
"text": " Then compare it with your partner."
}
]三段分别为63、65、35个 UTF-16代码单元。开头空格是有意保留的,按顺序拼接会精确恢复原文,代码同时验证这个等式和每段上限。不要先去掉空格,又声称仍有完全相同的保留性质。若后续语音应用需要清理空白,应把它作为单独变换,检查并批准新的措辞。
emoji检查同样有目的:叶子符号在 Python 中是一个 Unicode码点,却占两个 UTF-16代码单元。它们都不是朗读量、音频时长或账单。可见符号也未必适合直接朗读;真实课程中是否把符号改为批准的文字,要另行决定。
用真实失败条件检查文档
例子拒绝80上限下的81单元片段、空课程和超过600的上限,也验证含emoji的短例在12上限下分成两段。这些检查覆盖本地契约和表示边界,没有测试远程 TTS、整种语言或所有文件格式。
一句超长时,应在有意义的位置改成两条清晰指令,不能静默截断安全说明或扔掉末尾条件。教师批准新版源稿后重跑、检查拼接结果和顺序。计数通过,只有在课程仍表达原意时才有价值。
标点规则可能在缩写处产生不理想的边界,也可能把尾引号留给下一片段。这些情况需要检查,不能宣称工具理解句意。引文或专业符号复杂时,应调整规则或人工整理片段,再交给生成流程。
比较计费单位,不虚构这份脚本的账单
| Orux alias | 核对单位 | 每1000计费字符Credits | 假设3000计费字符Credits |
|---|---|---|---|
| qwen3-tts-flash | per_kchar | 2.1669 | 6.5007 |
| speech-2.8-hd | per_kchar | 10.2084 | 30.6252 |
左右滑动查看完整表格。
这是2026年11月1日核对的 Orux 普通公开价格,1 Credit=$0.005。两行采用精确数量计费,当前配置没有额外最低收费。最后一列使用明确假设的3000计费字符,不是三段夹具的测量或报价;本次没有请求音频来获得实际计量数量。
不能直接拿 Python字符串长度、UTF-16长度或 UTF-8字节数乘费率,便称为结算费用。工具上限用于文字准备,实际语音用量另行计量。分段也会改变请求次数和审听工作量。授权合成前复核实时价格及具体估价,特别是服务条款变化之后。
价差本身不能证明音色偏好、发音准确性、时长或质量胜负。本文没有独立比较厂商官方价格,不宣称相对官方省钱。先按任务选候选项,再审听获授权的合适样本;便宜但不能使用的录音,也不算完成课程交付。
将后续审听与文字验证分开
真实课程应记录段号、准确源文、请求 alias 和已批准音色。生成后加入文件网址与审核状态,不要覆盖源文。审听漏词、名称读法、突兀停顿和段间表现变化;从真实媒体核对时长和顺序,不用字符数推测。
结构化提取教程(英文)强调保留缺失值而非编造数据,客服汇总输入教程(英文)控制哪些字段离开本地。本文的契约不同:保留整份已批准课程稿,同时让输入片段有限、可检查。因此,悄悄删除麻烦内容不能作为解决超长片段的方法。
价格核对日:2026-11-01。资料与当前模型页: 公开模型目录, 公开模型目录, Python文档, Python文档. qwen3-tts-flash, speech-2.8-hd.
FAQ
表单的600字符就是模型原生上限吗?
不是,它是两个已核对 Orux 表单文字字段的声明上限,不代表所有 API、部署或原生上下文。工具明确采用 UTF-16代码单元进行准备。通过其他路径发送更长文档之前,要核对当前表单和请求契约。
分段会丢空格或改标点吗?
在所定义的变换中不会。程序不裁空白,并断言拼接结果与源文一致,展示的开头空格因此是有意的。后续若统一文本格式,应作为单独变更审查,不能沿用已经不成立的完全保留承诺。
这证明两个音色能正确朗读双语吗?
没有。本次没有生成或评估音频,只检查表单、本地边界和定价行。双语录音仍需获授权的发音、漏词和衔接审听;音色名称和文字长度检查不能建立这些音频质量结论。
63、65、35就是计费字符数量吗?
不是,它们是本地夹具输出的 UTF-16代码单元长度,不是实际语音用量或账单。价格表采用明确假设的计费数量,以展示算式,而不把离线程序未核实的字符计量规则冒充真实请求结果。
单个片段太长时怎么办?
人工在有意义的位置编辑,批准新源文并重跑。工具会拒绝这种输入,不截断指令、不丢文字;缩写和引号也要检查,因为简单标点规则不是语言学句子解析器,不理解课程语义。
用一个 API 调用这些模型
一个 OpenAI 兼容 API,覆盖对话、图像、视频与音频模型,按积分计费。
相关文章
浏览全部文章 →
图像API价格比较:10款模型的1K、2K与4K费用
比较2026年10月29日所选10款Orux图像模型的每图与百图Credits费用,保留1K、2K、4K、参考图上限和历史耗时表。明确Google Standard与Batch差异、Alibaba地区价及Qwen Pro溢价,附统一Python示例,帮助按目标分辨率和可用成片成本选模型。

Qwen Image 3.0 API:价格、Pro区别与Python
Qwen Image 3.0在Orux AI每图6 Credits,Pro从10.42起。对照Alibaba新加坡公开价、参考图费用与本站规格,保留Python示例和真实剪纸海报的逐项提示拆解,说明何时选标准版、Pro或Wan2.7 Image,并列出文字校对、成品尺寸与交付检查。

Nano Banana 2.1 API:每图价格、编辑与Python
Nano Banana 2.1在Orux AI的1K图片为3.6 Credits。核对1K、2K、4K与Google Standard和Batch费用,保留参考图编辑、全部公开比例、2528×1696案例、历史耗时样本和Python异步脚本,并计算200张草稿加20张终稿预算与费用差异。