Skip to main content
Orux AIOruxAI

Orux AI / モデルノート

Qwen3 TTS:授業原稿を一文字も失わず分割する

Qwen3 TTS向けに二言語授業原稿をローカルで分割。3部分の実出力、全文再結合、長すぎる部分の拒否、フォーム上限とCredits料金を示します。UTF-16単位と課金文字を区別し、発音評価をしたとは主張しません。空白と句読点を保ち、後の試聴を別に扱います。有料の音声呼び出しはありません。

Orux AI公開 7 分で読めます
Qwen3 TTS:授業原稿を一文字も失わず分割する — Qwen3 TTS向けに二言語授業原稿をローカルで分割。
目次

音声合成の前に、授業原稿を確認できる単位へ分ける

英語の指示から中国語の観察課題へ移る野外授業では、全文を音声フォームへ入れる前に準備が必要です。原文を保ち、各入力を決めた境界内に収め、順序を確認できるようにします。一定文字数で機械的に切ると、指示の途中を分断するおそれがあります。

本稿はOruxの現行qwen3-tts-flash向けのローカルPython分割器を提供し、speech-2.8-hdも掲載選択肢として確認します。例では順序付きの3部分を出力し、全文字を保存し、長すぎる部分は黙って切らず拒否します。音声は生成しておらず、発音や自然な二言語朗読は検証していません。そこは後の試聴事項です。

確認した両フォームの読み上げ欄は最大600文字と宣言されています。ツールではローカルのUTF-16コード単位上限を使い、デモを80に縮めます。これは本例の保守的な準備規則で、課金文字の定義やモデル固有の文脈上限ではありません。入力制限、文字表現、課金数量を分けて考えます。

ローカル分割器の3部分は63・65・35 UTF-16単位。音声生成ではありません
ローカル分割器の3部分は63・65・35 UTF-16単位。音声生成ではありません

授業原稿を渡す前にフォームを確認する

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も通信も不要です。原稿は植物を採らず葉を観察する架空の教材で、モデル回答、授業実験、実際の教師の録音ではありません。

Python
"""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))

実際のローカル出力:

JSON
[
  {
    "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コード単位です。先頭空白は意図的で、順番につなぐと原文を完全再現します。コードは再結合の一致と上限を確認します。空白を削ってから同じ完全保存を主張しないでください。後工程で必要なら別変換として検証・承認します。

葉の絵文字はPythonでは1 Unicodeコードポイント、UTF-16では2単位です。どちらも読み上げ量、音声時間、請求額を測りません。記号そのものが読み上げ指示に適さない場合もあり、実教材で承認済みの語に置き換えるかは別途判断します。

実原稿の前に、意味のある失敗を確認する

上限80の81単位部分、空の原稿、600超の上限を拒否し、絵文字を含む短例が上限12で2部分になることも確認します。ローカル契約と表現の境界の試験であり、遠隔TTS、言語全体、全ファイル形式の検証ではありません。

一文が長すぎるなら意味のある箇所で二つの明確な指示へ編集します。安全上の指示や末尾の条件を黙って捨てず、新しい承認稿に対して再実行し、再結合と順序を教師が確認します。文字数が通るだけでは原意の保持を確認できません。

略語で不便な境界になったり、閉じ引用符が次の部分に残ったりする場合があります。文意理解の証拠ではなく、人が確認すべき理由です。複雑な引用や専門表記は規則を調整するか、手作業で整えてから生成に渡します。

課金単位を比較し、原稿の請求を捏造しない

Orux alias単位課金1000文字Credits仮の課金3000文字Credits
qwen3-tts-flashper_kchar2.16696.5007
speech-2.8-hdper_kchar10.208430.6252

横にスワイプすると表全体を確認できます。

2026年11月1日のOrux通常公開料金です。1 Credit=$0.005。両行は数量を正確に計算し、この時点では追加の最低料金はありません。最後の列は仮の課金3000文字を掛けた値で、3部分の実測・見積もりではありません。音声を呼んで実課金量を得たわけではありません。

Python文字列長、UTF-16長、UTF-8バイト数を掛けて確定料金と呼ばないでください。入力準備の上限と実音声の計量は別です。分割はリクエスト数と確認作業も変えます。合成承認前に現行料金と正確な見積もり、変更後の条件を確認してください。

単価差は音声の好み、発音精度、時間、品質順位を示しません。公式料金との独立比較も行っておらず、節約は主張しません。タスクに合う候補を選び、承認されたサンプルを聞きます。安くても使えない録音は教材の完成品ではありません。

文字検証と後の試聴を分ける

実教材は番号、正確な原稿、要求alias、承認音声を台帳に残します。生成後にURLと審査状態を追加し、原稿を上書きしません。欠語、固有名、不要な間、部分間の話し方を聞き、時間と順序は実メディアで確認します。

構造化抽出(英語)は欠損値を捏造せず保ち、サポート集計入力(英語)はローカル外へ出す項目を制御します。本稿は全承認文言を保持したまま、入力を有限で確認可能にする別の契約です。困った文字を黙って削るのは解決になりません。

料金確認日:2026-11-01。出典と現在のモデルページ: 公開カタログ, 公開カタログ, Python資料, Python資料. qwen3-tts-flash, speech-2.8-hd.

FAQ

600文字はモデル固有の上限ですか?

いいえ。確認したOruxフォームの宣言上限で、すべてのAPI、配置、モデル文脈の上限ではありません。本ツールは明示したUTF-16単位を使います。別経路で長い原稿を送る前に現行契約を確認してください。

空白や句読点は変わりますか?

定義した変換では変わりません。トリムせず、再結合が原文と一致することを検証します。先頭空白は意図的です。後で正規化する場合は別の変更として確認し、成立しなくなった完全保存を主張しないでください。

二つの音声の二言語朗読を実証しましたか?

いいえ。音声生成も評価もしていません。フォーム、文字境界、料金のみを確認しました。発音、欠語、つながりは別途承認された試聴が必要で、音声名や文字数チェックでは証明できません。

63、65、35は課金文字数ですか?

いいえ。ローカル例のUTF-16単位で、音声実用量や請求ではありません。表は仮の課金量で算術を示し、オフライン処理では未確認の実計量規則を断定しません。

一部分が長すぎるときは?

意味のある地点で手編集し、新稿を承認して再検証します。ツールは指示を途中で切ったり文字を捨てたりせず拒否します。略語や引用も確認してください。単純な句読点規則は教材の意味を理解する解析器ではありません。

Orux AI で qwen3-tts-flash を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開くOrux AI で speech-2.8-hd を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開く

1 つの API でこれらのモデルを利用

チャット・画像・動画・音声モデルに対応した OpenAI 互換 API。Credits で従量課金です。