TTML2 的配音和音频描述配置文件

W3C 候选推荐草案

关于本文档的更多详情
此版本:
https://www.w3.org/TR/2026/CRD-dapt-20260626/
最新发布版本:
https://www.w3.org/TR/dapt/
最新编辑草案:
https://w3c.github.io/dapt/
历史:
https://www.w3.org/standards/history/dapt/
提交历史
实现报告:
https://www.w3.org/wiki/TimedText/DAPT_Implementation_Report
编辑:
(Netflix)
(英国广播公司)
反馈:
GitHub w3c/dapt (拉取请求新建议题未解决议题)
public-tt@w3.org,并使用 主题行 [dapt] … 消息主题 …存档

摘要

本规范定义 DAPT, 这是一种基于 TTML 的文件格式,用于交换定时文本内容, 这些内容用于制作配音脚本、音频描述、翻译字幕和听障字幕 (也称为隐藏字幕)的转录和翻译工作流。

本文档状态

本节描述本文档在发布时的状态。 当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。

本文档包含一个 注册表节 并定义 注册表, 如 [w3c-process] 中针对 w3c 注册表的要求所定义。 仅更改 注册表的文档更新,可以在不满足推荐标准轨道更新的其他要求的情况下进行, 如 更新注册表中所述; 更新这些注册表的要求在 H. 注册表节中以规范方式指定。

请参阅工作组的 实现报告

为了使本规范退出 CR 阶段, 本规范定义但尚未出现在 [TTML2] 中的每项特性, 都需要在实现报告中记录至少 2 个独立实现。 工作组不要求实现必须公开可用,但鼓励其公开。

最初工作草案以来应用的实质性变更列表见 substantive-changes-summary.txt

工作组已识别以下 有风险 特性:

Issue 218: 有风险:支持 `<audio>` 中用于外部资源的 `src` 属性 CR-exit-must-haveAt risk feature

#113 的可能解决方案。

Issue 219: 有风险:支持作为 `<audio>` 子元素且用于外部资源的 `<source>` 元素 CR-exit-must-haveAt risk feature

#113 的可能解决方案。

Issue 220: 有风险:支持指向嵌入式资源的 `<audio>` 元素的 `src` 属性 CR-exit-must-haveAt risk feature

#114#115 的可能解决方案。

#115 的关联在于,这意味着还存在某种 可引用的嵌入式音频资源,这也是 #115 中描述的选项之一。

Issue 221: 有风险:支持作为 `<audio>` 元素子元素且指向嵌入式资源的 `<source>` CR-exit-must-haveAt risk feature

#114#115 的可能解决方案。

#115 的关联在于,这意味着还存在某种 可引用的嵌入式音频资源,这也是 #115 中描述的选项之一。

Issue 222: 有风险:支持内联 音频资源 CR-exit-must-haveAt risk feature

#115 的可能解决方案。

Issue 223: 有风险:`<data>` 中 `encoding` 的每个潜在值 CR-exit-must-haveAt risk feature

#117 的可能解决方案。

Issue 224: 有风险:支持 `<data>` 上的 `length` 属性 CR-exit-must-haveAt risk feature

#117 的可能解决方案。

Issue 239: 有风险:嵌套 Div(原为 Script Event Grouping)和 Script Event Mapping CR-exit-must-haveAt risk feature

#nested-div(原为 #scriptEventGrouping)和 #scriptEventMapping 功能的支持,合起来,在等待实现者反馈期间存在风险。

有风险功能可能会在推进到拟议推荐标准之前被移除。

本文档由 Timed Text 工作组作为 候选推荐草案发布,使用 推荐标准 轨道

作为 候选推荐标准发布并不表示 W3C 及其成员的认可。候选推荐草案 集成了 工作组打算纳入 后续候选推荐标准快照中的、相对于上一份候选推荐标准的变更。

这是一份草案文档,可能随时被更新、替换或废弃。 除作为正在进行中的工作之外,不应引用本文档。 对此即将发布的推荐标准的未来更新可能会纳入 新功能

本文档由一个在 W3C 专利 政策下运作的小组制作。 W3C 维护一份 与该小组交付成果相关的任何专利披露的公开列表; 该页面还包括 披露专利的说明。实际知悉某项专利且认为该专利包含 必要权利要求的个人, 必须按照 W3C 专利政策第 6 节披露该信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档管辖。

1. 范围

本规范定义了 Timed Text Markup Language version 2.0 [TTML2] 的一种基于文本的配置文件,旨在支持全球范围内的配音音频描述工作流, 满足 [DAPT-REQS] 中定义的要求,并允许使用 [TTML2] 及其配置文件中的可视呈现 功能,例如 [ttml-imsc1.3] 中的那些功能。

2. 引言

本节为非规范性内容。

2.1 转录文本和脚本

在一般用法中,script 一词的含义之一是 电影、电视节目、戏剧等的书面文本。 脚本既可以是已完成作品的记录, 也称为转录文本, 也可以是尚待创作作品的计划。 在本文档中,我们使用领域专用术语,并更具体地定义如下:

术语 DAPT 脚本泛指 转录文本脚本, 并且是符合本规范形式要求的合规点。 DAPT 脚本由定时文本和关联元数据组成, 例如正在说话的角色。

在配音工作流中,会生成 转录文本并将其翻译,以创建脚本。 在音频描述工作流中,转录文本描述视频图像, 然后被直接用作录制音频等效内容的脚本

DAPT 是一种基于 TTML 的格式,用于在本地化和音频描述 流程中的创作、提词和播放工具之间交换转录文本脚本 (即 DAPT 脚本)。 DAPT 文档DAPT 脚本的一种可序列化形式,设计用于承载 与配音或音频描述相关的信息, 例如 DAPT 脚本的类型、对白、 描述、定时、元数据、原始语言转录文本、翻译文本、语言信息和音频混音指令, 并且可扩展,以允许用户定义注释或未来的附加特性。

本规范定义 DAPT 脚本的数据模型, 以及它作为 [TTML2] 文档的表示(见 4. DAPT 数据模型和 对应的 TTML 语法), 并带有一些约束和限制(见 5. 约束)。

DAPT 脚本预期用于使视听媒体对 无法以其原始形式理解该媒体的用户可访问或本地化, 并且用作满足涉及转录文本的用户需求的解决方案的一部分, 包括 [media-accessibility-reqs] 中描述的无障碍需求, 以及支持需要通过配音将对白翻译成不同语言的用户。

DAPT 脚本内容的每一部分都要求 通过 表示对象属性, 标记出它在相关媒体中表示什么;同样,DAPT 脚本作为一个整体, 要求列出它所表示的所有内容类型, 例如它是否表示音频内容或视觉内容, 如果是视觉内容,则表示文本还是非文本等。 本规范提供了一个分层内容描述符注册表。

配音和音频描述的创作工作流都涉及相似阶段, 这些阶段共享 [DAPT-REQS] 中描述的共同要求。 在这两种情况下,作者都会审阅内容,并写下正在发生的内容, 无论是对白还是视频图像中的内容, 以及它发生的时间。 后续转换过程可以将文本改为不同语言, 并调整措辞以适应精确的定时约束。 然后进入一个阶段,在该阶段生成脚本的音频呈现, 以最终混入节目音频。 该混音可以在分发之前进行, 也可以直接在播放器中进行。

2.1.1 配音脚本

配音过程,即创建配音脚本的过程, 是一个复杂的多步骤过程,涉及:

  • 从已完成节目中转录其原始语言的对白并为其计时,以创建 转录文本
  • 使用角色信息和其他注释标注对白;
  • 生成本地化说明,以指导进一步改编;
  • 将对白翻译为目标语言脚本
  • 为配音调整译文; 例如在配音的情况下匹配演员的唇部动作。

配音脚本是用于 录制翻译对白的转录文本脚本 (取决于工作流阶段),这些对白将与节目的非对白音频混合, 以生成该节目另一种语言的本地化版本, 称为配音版本,简称配音。

配音脚本可作为 创建替代语言字幕或隐藏式字幕的起点。 本规范旨在促进在 TTML 的其他配置文件中添加字幕和说明字幕文档, 以及转换为这些文档,例如 [ttml-imsc1.3], 例如通过允许字幕样式语法携带在DAPT 文档中。 或者,可以应用样式,以在配音演员录制脚本对白时提供辅助。

2.1.2 音频描述脚本

创建音频描述内容也是一个多阶段过程。 音频描述, 也称为视频描述, 或在 [media-accessibility-reqs] 中称为描述型视频, 是一种音频服务, 用于帮助无法完整看见视觉呈现的观众理解内容。 它是将主节目音频与每个 描述的音频呈现混合后的结果, 这些描述被编写为在不与对白冲突的时间点出现, 以交付混合了音频描述的音轨。 主节目音频是指在任何进一步混合之前与节目相关联的音频。 描述是一组词语,用于描述节目呈现的某个方面, 适合通过发声和录制呈现为音频, 或用作文本到语音转换的文本替代源,如 [WCAG22] 中所定义。 关于音频描述是什么以及它如何 工作的更多信息,可见 [BBC-WHP051]。

编写音频描述脚本通常涉及:

  • 观看节目的视频内容, 或一系列节目的内容,
  • 确定有机会说出描述的关键时刻,
  • 编写描述文本,以解释节目在该时刻的重要可见部分,
  • 通过录制真人演员或使用文本到语音,创建描述的音频版本,
  • 定义用于将音频与节目音频组合的混合说明(使用 [TTML2] 音频 样式来应用)。

音频混合可以在媒体分发之前发生, 也可以在客户端中发生。 如果音频描述脚本被交付给 播放器, 则文本可用于提供替代呈现, 例如在盲文显示器上, 或使用用户配置的屏幕阅读器。

2.1.3 其他用途

DAPT 脚本在其他工作流和场景中也可能有用。 例如,原始语言转录文本可用作:

  • 语音转文本系统的输出格式,即使其并非用于翻译, 或用于制作字幕或说明字幕;
  • 广播行业中称为“后期制作脚本”的文档, 主要用于预览、编辑审阅和销售目的;

原始语言转录文本翻译转录文本都可用作:

  • 在网页或应用中与音频或视频一起呈现的无障碍转录文本; 在这种用法中,定时可以保留并用于与媒体同步, 或在媒体内导航, 也可以舍弃,以呈现整个时间线的纯文本版本。

2.2 示例文档

2.2.1 基本文档结构

文档的顶层结构如下:

  • 命名空间 http://www.w3.org/ns/ttml 中的 <tt> 根元素 表明这是一个 TTML 文档, 而 ttp:contentProfiles 属性表明它遵循本规范定义的 DAPT 内容配置文件
  • daptm:scriptRepresents 属性表明文档内容 在原始节目中替代什么。
  • daptm:scriptType 属性表明转录文本脚本的类型, 但在这个空示例中,它并不相关,因为这里只展示文档结构。
  • daptm:langSrc 属性 表明默认文本语言来源, 例如内容的原始语言, 而 xml:lang 属性表明此脚本中的默认语言, 在本例中二者相同。 这两个属性都会被继承,并可在文档内容内被覆盖。

该结构适用于所有类型的 DAPT 脚本,无论是配音还是 音频描述

<tt xmlns="http://www.w3.org/ns/ttml" 
    xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
    xmlns:daptm="http://www.w3.org/ns/ttml/profile/dapt#metadata"
    ttp:contentProfiles="http://www.w3.org/ns/ttml/profile/dapt1.0/content"
    xml:lang="en"
    daptm:langSrc="en"
    daptm:scriptRepresents="audio"
    daptm:scriptType="originalTranscript">
  <head>
    <metadata>
      <!-- Additional metadata may be placed here -->
      <!-- Any characters must be defined here as a set of ttm:agent elements -->
    </metadata>
    <styling>
      <!-- Styling is optional and consists of a set of style elements -->
    </styling>
    <layout>
      <!-- Layout is optional and consists of a set of region elements -->
    </layout>
  </head>
  <body>
    <!-- Content goes here and consists of a div for each Script Event -->
    <div xml:id="d1" begin="..." end="..." daptm:represents="audio.dialogue">
      <p>
        <!-- Text blocks are contained in p elements -->
      </p>
      <p xml:lang="fr" daptm:langSrc="en">
        <!-- Translation text is related to the source language for the translation -->
      </p>
    </div>
  </body>
</tt>

以下示例对应于 [DAPT-REQS] 中描述的工作流各阶段产生的定时文本 转录文本脚本

第一个示例展示了早期阶段的转录文本, 其中已经识别出用于描述或转录的定时机会, 但尚未写入任何文本; 这里存在于 <body> 元素上的 daptm:represents 属性会被 <div> 元素继承,因为 它们未指定不同的值:

...
  <body daptm:represents="...">
    <div xml:id="id1" begin="10s" end="13s">
    </div>
    <div xml:id="id2" begin="18s" end="20s">
    </div>
  </body>
...

以下示例将演示配音和音频描述工作流中的不同用法。

2.2.2 音频描述示例

添加描述后,这会成为录制前脚本。 请注意,在这种情况下,为了反映大多数音频描述内容 转录的是没有固有语言的视频图像, 文本语言来源,由 daptm:langSrc 属性表示, 在文档顶层设为 zxx, 它是 [bcp47] 定义的语言代码, 用于标识不适用语言分类的内容:

<tt xmlns="http://www.w3.org/ns/ttml"
  xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
  xmlns:daptm="http://www.w3.org/ns/ttml/profile/dapt#metadata"
  xmlns:xml="http://www.w3.org/XML/1998/namespace"
  ttp:contentProfiles="http://www.w3.org/ns/ttml/profile/dapt1.0/content"
  xml:lang="en"
  daptm:langSrc="zxx"
  daptm:scriptRepresents="visual.nonText"
  daptm:scriptType="preRecording">
  <body>
    <div begin="10s" end="13s" xml:id="a1" daptm:represents="visual.nonText">
      <p>
        A woman climbs into a small sailing boat.
      </p>
    </div>
    <div begin="18s" end="20s" xml:id="a2" daptm:represents="visual.nonText">
      <p>
        The woman pulls the tiller and the boat turns.
      </p>
    </div>
  </body>
</tt>

音频描述内容通常包括视觉图像中存在的文本, 例如图像中包含书面标牌、地点等。 以下示例演示了这种情况: 脚本表示对象被扩展, 以显示脚本内容除非文本视觉信息外, 还表示文本视觉信息。 这里在脚本事件上指定了更精确的 表示对象值, 以反映该文本实际上是一个地点, 这是允许的,因为该更精确的值是 脚本表示对象中新值的一个 子类型。 最后,由于该文本具有固有语言,文本语言 来源被设置为反映该语言。

<tt xmlns="http://www.w3.org/ns/ttml"
  xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
  xmlns:daptm="http://www.w3.org/ns/ttml/profile/dapt#metadata"
  xmlns:xml="http://www.w3.org/XML/1998/namespace"
  ttp:contentProfiles="http://www.w3.org/ns/ttml/profile/dapt1.0/content"
  xml:lang="en"
  daptm:langSrc="zxx"
  daptm:scriptRepresents="visual.nonText visual.text"
  daptm:scriptType="preRecording">
  <body>
    <div begin="7s" end="8.5s" xml:id="at1"
         daptm:represents="visual.text.location" daptm:langSrc="en">
      <p>
        The Lake District, England
      </p>
    </div>
    <div begin="10s" end="13s" xml:id="a1"
         daptm:represents="visual.nonText">
      <p>
        A woman climbs into a small sailing boat.
      </p>
    </div>
    <div begin="18s" end="20s" xml:id="a2"
         daptm:represents="visual.nonText">
      <p>
        The woman pulls the tiller and the boat turns.
      </p>
    </div>
  </body>
</tt>

创建音频录制后,如果未使用文本到语音, 可以插入用于播放混音的指令。例如,可以在混入 从 <span> 元素内部播放的音频之前,更改“接收”音频的增益, 使其在进入时平滑地动画化该值,并在退出时恢复该值:

<tt ...
  daptm:scriptRepresents="visual.nonText"
  daptm:scriptType="asRecorded"
  xml:lang="en"
  daptm:langSrc="zxx">
  ...
    <div begin="25s" end="28s" xml:id="a3" daptm:represents="visual.nonText">
      <p>
        <animate begin="0.0s" end="0.3s" tta:gain="1;0.39" fill="freeze"/>
        <animate begin="2.7s" end="3s" tta:gain="0.39;1"/>
        <span begin="0.3s" end="2.7s">
          <audio src="clip3.wav"/>
          The sails billow in the wind.</span>
      </p>
    </div>
...

在文档级别,daptm:scriptRepresents 属性表明 文档表示相关媒体中的视觉文本内容和视觉非文本内容。 可能实际上没有任何脚本事件表示视觉文本, 例如因为视频图像中没有文本。

在上面的示例中,<div> 元素的 begin 属性定义了其子元素的“syncbase”时间, 因此这里 <animate><span> 元素上的时间相对于 25s。 第一个 <animate> 元素在 0.3s 内将增益从 1 降到 0.39,并在结束后冻结该值, 第二个元素在该描述的 最后 0.3s 内将其升回。然后 <span> 元素被 定时为仅在第一次音频衰减完成后开始。

如果音频录制很长而只需要播放一个片段, 可以使用 clipBeginclipEnd 来实现。 如果我们只想播放文件中从 5s 到 8s 的音频部分,它将如下所示:

...
  <span><audio src="long_audio.wav" clipBegin="5s" clipEnd="8s"/>
  A woman climbs into a small sailing boat.</span>
...

或者,可以添加音频属性以触发文本被朗读:

...
    <div begin="18s" end="20s" xml:id="a2">
      <p>
        <span tta:speak="normal">
          The woman pulls the tiller and the boat turns.</span>
      </p>
    </div>
...

也可以直接嵌入音频, 使单个文档同时包含脚本和 录制音频:

...
    <div begin="25s" end="28s" xml:id="a3">
      <p>
        <animate begin="0.0s" end="0.3s" tta:gain="1;0.39" fill="freeze"/>
        <animate begin="2.7s" end="3s" tta:gain="0.39;1"/>
        <span begin="0.3s" end="2.7s">
          <audio><source><data type="audio/wave">
            [base64-encoded audio data]
          </data></source></audio>
          The sails billow in the wind.</span>
      </p>
    </div>
...

2.2.3 配音示例

示例 1的基本结构出发, 转录音频会产生一个原始语言配音转录文本, 其可能如下所示。 未定义特定样式或布局,这里重点在于对白的转录。 角色在 <metadata> 元素中标识。 请注意,语言和文本语言来源 分别使用 xml:langdaptm:langSrc 属性定义, 它们具有相同的值, 因为该转录文本未被翻译。

<tt xmlns="http://www.w3.org/ns/ttml" 
    xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
    xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
    xmlns:daptm="http://www.w3.org/ns/ttml/profile/dapt#metadata"
    ttp:contentProfiles="http://www.w3.org/ns/ttml/profile/dapt1.0/content"
    xml:lang="fr"
    daptm:langSrc="fr"
    daptm:scriptRepresents="audio.dialogue"
    daptm:scriptType="originalTranscript">
  <head>
    <metadata>
      <ttm:agent type="character" xml:id="character_1">
        <ttm:name type="alias">ASSANE</ttm:name>
      </ttm:agent>
    </metadata>
  </head>
  <body>
    <div begin="10s" end="13s" xml:id="d1" daptm:represents="audio.dialogue">
      <p ttm:agent="character_1">
        <span>Et c'est grâce à ça qu'on va devenir riches.</span>
      </p>
    </div>
  </body>
</tt>

翻译文本之后,文档会被修改。它包含译文文本, 在这种情况下原文被保留。主文档的默认 语言被更改,以表明重点在翻译后的语言。 xml:langdaptm:langSrc 属性的组合 用于将文本标记为原文或译文。 在这种情况下,它们同时出现在 <tt><p> 元素上,以使示例更易阅读,但在某些情况下也可以省略 它们,转而使用继承模型:

<tt xmlns="http://www.w3.org/ns/ttml"
    xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
    xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
    xmlns:daptm="http://www.w3.org/ns/ttml/profile/dapt#metadata"
    ttp:contentProfiles="http://www.w3.org/ns/ttml/profile/dapt1.0/content"
    xml:lang="en"
    daptm:langSrc="fr"
    daptm:scriptRepresents="audio.dialogue"
    daptm:scriptType="translatedTranscript">
  <head>
    <metadata>
      <ttm:agent type="character" xml:id="character_1">
        <ttm:name type="alias">ASSANE</ttm:name>
      </ttm:agent>
    </metadata>
  </head>
  <body>
    <div begin="10s" end="13s" xml:id="d1" ttm:agent="character_1" daptm:represents="audio.dialogue">
      <p xml:lang="fr" daptm:langSrc="fr"> <!-- original -->
        <span>Et c'est grâce à ça qu'on va devenir riches.</span>
      </p>
      <p xml:lang="en" daptm:langSrc="fr"> <!-- translated -->
        <span>And thanks to that, we're gonna get rich.</span>
      </p>
    </div>
  </body>
</tt>

录制前的改编过程可以调整措辞并/或添加进一步的定时, 以协助录制。 daptm:scriptType 属性也会被修改,如以下示例所示:

<tt xmlns="http://www.w3.org/ns/ttml"
    xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
    xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
    xmlns:daptm="http://www.w3.org/ns/ttml/profile/dapt#metadata"
    ttp:contentProfiles="http://www.w3.org/ns/ttml/profile/dapt1.0/content"
    xml:lang="en"
    daptm:langSrc="fr"
    daptm:scriptRepresents="audio.dialogue"
    daptm:scriptType="preRecording">
  <head>
    <metadata>
      <ttm:agent type="character" xml:id="character_1">
        <ttm:name type="alias">ASSANE</ttm:name>
      </ttm:agent>
    </metadata>
  </head>
  <body>
    <div begin="10s" end="13s" xml:id="d1" ttm:agent="character_1" daptm:onScreen="ON_OFF" daptm:represents="audio.dialogue">
      <p xml:lang="fr" daptm:langSrc="fr">
        <span>Et c'est grâce à ça qu'on va devenir riches.</span>
      </p>
      <p xml:lang="en" daptm:langSrc="fr">
        <span begin="0s">And thanks to that,</span><span begin="1.5s"> we're gonna get rich.</span>
      </p>
    </div>
  </body>
</tt>

3. 文档约定

本文档使用以下约定:

4. DAPT 数据模型和对应的 TTML 语法

本节指定 DAPT 的数据模型及其对应的 TTML 语法。 在该模型中,存在一些对象,它们可以具有属性并与其他对象关联。 在 TTML 语法中,这些对象和属性被表示为元素和属性, 尽管并不总是对象表示为元素、属性表示为属性。

1 展示了 DAPT 数据模型,并将每个对象和属性 超链接到本文档中对应的章节。 共享属性以斜体显示。 图中的所有其他约定均遵循 [uml]。

DAPT 脚本 脚本表示对象 脚本类型 默认语言 (可选)文本语言来源 角色 角色标识符 名称 (可选)配音演员名称 脚本 事件 脚本事件标识符 表示对象 (可选) 开始 (可选) 结束 (可选) 持续时间 (可选)屏幕上 脚本事件 描述 描述 (可选)描述类型 (可选)语言 文本 文本内容 (可选)文本语言来源 (可选)语言 (可选)表示对象 音频 合成 音频 速率 (可选)音高 音频 录制 源 [ ] 类型 [ ] (可选) 开始 (可选) 结束 (可选) 持续时间 (可选)入点时间 (可选)出点时间 混音 指令 (可选)增益 (可选)声像 (可选) 开始 (可选) 结束 (可选) 持续时间 (可选)填充 包含   0..* 包含 0..* 包含   0..* 包含   0..* 包含   0..* 0..* 0..* 包含   0..* 包含   0..* 包含 0..*    
1 (资料性)显示 DAPT 数据模型中主要实体的类图。
Issue 116: 将非内联的嵌入式 音频资源添加到数据模型? questionCR-exit-must-have

另见 #115 - 如果我们要支持非内联的 嵌入式音频资源,是否应该为它们创建一个对象并将其添加到数据模型中?

4.1 DAPT 脚本

DAPT 脚本是一个转录文本脚本, 对应于在创作工作流中处理或由客户端处理的文档, 并符合本规范的约束。 它具有以下章节中定义的属性和对象: 脚本表示对象脚本类型默认语言文本语言 来源脚本事件, 以及对于配音脚本,还包括角色

DAPT 文档是一个 [TTML2] 定时文本内容文档 实例,表示一个DAPT 脚本DAPT 文档具有 本节和以下各节中定义的结构和约束。

[TTML2] 定时文本内容文档 实例具有 一个位于 TT 命名空间中的根 <tt> 元素。

4.1.1 脚本表示对象

脚本 表示对象属性是 DAPT 脚本的强制属性, 它指示文档内容表示相关媒体对象的哪些组成部分。 文档内容可以作为一种机制的一部分使用, 为这些组成部分提供可访问的替代内容。

脚本事件具有一个相关属性:表示对象, 并且对该属性允许值存在一些约束, 这些约束取决于脚本表示对象的值。

为表示此属性,daptm:scriptRepresents 属性 必须出现在 <tt> 元素上, 其值符合以下语法:

daptm:scriptRepresents
: <content-descriptor> ( <lwsp>+ <content-descriptor>)*

<lwsp>                # as TTML2

4.1.2 默认语言

默认 语言DAPT 脚本的强制属性, 它表示脚本事件文本内容的默认语言。 该语言可以是原始语言之一,或是翻译 语言。 当它表示翻译语言时,它可以是正在准备的配音或音频描述 脚本所面向的最终语言, 称为目标录制语言;也可以是工作流中使用的中间语言或枢轴 语言。

默认语言DAPT 文档中由以下结构和约束表示:

  • xml:lang 属性必须出现在 <tt> 元素上,且其值不得为空。

DAPT 脚本中的所有文本内容都有 指定语言。 当使用多种语言时,默认语言可以对应于 大多数脚本事件的语言, 或持续说话时间最长的语言,或作者任意选择的语言。

4.1.3 脚本类型

脚本类型属性是 DAPT 脚本的强制属性, 它描述配音和音频描述工作流中使用的文档类型, 包括以下类型: 原始语言转录文本翻译转录文本录制前脚本已录制脚本

为表示此属性,daptm:scriptType 属性必须 出现在 <tt> 元素上:

daptm:scriptType
  : "originalTranscript"
  | "translatedTranscript"
  | "preRecording"
  | "asRecorded"

文档类型及对应的 daptm:scriptType 属性值定义如下:

编辑 注

以下示例是孤立的——是否移至本节顶部、列举脚本类型之前?

<tt daptm:scriptType="originalTranscript">
...
</tt>

4.1.4 脚本事件

DAPT 脚本可以包含零个或多个脚本事件对象, 每个对象对应给定时间间隔内的对白、屏幕文本或描述。

如果存在任何脚本事件,则 DAPT 文档必须具有 一个作为 <tt> 元素子元素的 <body> 元素。

4.1.5 角色

DAPT 脚本可以包含零个或多个角色对象,每个对象描述一个 可被脚本事件引用的角色。

如果存在任何角色对象,则 DAPT 文档必须具有 一个作为 <tt> 元素子元素的 <head> 元素, 并且该 <head> 元素必须具有 至少一个 <metadata> 子元素。

4.2 角色 建议 所有角色对象都位于 单个 <metadata> 父元素中, 并且当 <head> 元素具有多个 <metadata> 子元素时, 角色对象位于第一个这样的子元素中。

4.1.6 共享属性 和值集

DAPT 数据模型中的某些属性在 多种对象类型中通用, 并且在它们出现的任何地方都承载相同语义。 这些共享 属性列于本节。

DAPT 中的某些值集 在多个属性之间复用, 并且在它们出现的任何地方都具有相同约束。 这些共享值集也列于本节。

编辑 注

是否最好创建一个“定时对象”类,并让脚本事件、 混音指令和音频录制从它派生?

4.1.6.1 定时属性

以下定时属性 定义包含它们的实体何时处于活动状态:

  • 开始 属性定义对象何时变为活动状态, 并且相对于父对象的活动开始时间。 DAPT 脚本 在媒体时间轴的时间零处开始。
  • 结束 属性定义对象何时停止活动, 并且相对于父对象的活动开始时间。
  • 持续时间属性定义对象的最大持续时间。

    如果同时存在结束持续时间属性, 则结束时间是结束开始 + 持续时间二者中较早的一个, 如 [TTML2] 所定义。

如果省略任何定时属性, 则适用以下规则, 这些规则转述了 [TTML2] 中定义的定时语义:
  • 开始的默认值为零,即与 父对象的开始时间相同。
  • 结束的默认值为不定, 即如果存在父定时对象,则解析为与该父定时对象的结束时间相同。
  • 持续时间的默认值为不定, 即结束时间解析为与父对象的结束时间相同。

DAPT 脚本的结束时间 在实践上是相关媒体对象的结束时间。

4.1.6.2 <content-descriptor>

脚本表示对象表示对象属性中允许的值取决于 <content-descriptor> 语法定义 及其关联的注册表。

<content-descriptor> 的值符合以下语法:

<content-descriptor>  # see registry table below
: <descriptor-token> ( <descriptor-delimiter> <descriptor-token> )*

<descriptor-token>
: (descriptorTokenChar)+

descriptorTokenChar  # xsd:NMtoken without the "."
: NameStartChar | "-" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

<descriptor-delimiter>
: "."  # FULL STOP U+002E

<content-descriptor> 的值是以定界符分隔的有序令牌列表。

如果另一个 <content-descriptor>A 的有序descriptor-tokens列表 出现在 B 的有序descriptor-tokens列表的开头, 则 <content-descriptor>BA内容描述符子类型子类型)。

<content-descriptor> 的允许值要么是以下注册表中列出的值,要么可以是用户定义的值。

有效的用户定义值必须x- 开头,或是 content-descriptor 注册表中值的子类型, 其中第一个附加 <descriptor-token> 组成部分以 x- 开头。

注册表表格,用于 <content-descriptor> 组件, 其注册表定义位于 H.2.2 <content-descriptor> 注册表表格定义
<content-descriptor> 状态 描述 示例用法
audio 临时 表示 DAPT 内容 表示音频节目中的任何部分。 配音、翻译以及听障字幕和说明字幕、前期和后期 制作脚本
audio.dialogue 临时 表示 DAPT 内容 表示音频节目中的言语交流,例如一段口头 对话。 配音、翻译以及听障字幕和说明字幕、前期和后期 制作脚本
audio.nonDialogueSounds 临时 表示 DAPT 内容 表示音频节目中对应于非 言语交流声音的部分,例如重要声音,如一扇门被 愤怒地摔上。 翻译以及听障字幕和说明字幕、前期和后期 制作脚本
visual 临时 表示 DAPT 内容 表示节目视觉图像中的任何部分。 音频描述
visual.dialogue 临时 表示 DAPT 内容 表示节目视觉图像中的言语交流, 例如一段手语对话。 配音或音频描述、翻译以及听障字幕和 说明字幕、前期和后期制作脚本
visual.nonText 临时 表示 DAPT 内容 表示节目视觉图像中的非文本部分,例如 场景中的一个重要物体。 音频描述
visual.text 临时 表示 DAPT 内容 表示节目视觉图像中的文本内容,例如一个 路标、一个时钟、一条报纸标题、一条即时消息等。 音频描述
visual.text.title 临时 visual.text 的一个子类型, 其中该文本是相关媒体的标题。 音频描述
visual.text.credit 临时 visual.text 的一个子类型, 其中该文本是演职员表项,例如演员姓名。 音频描述
visual.text.location 临时 visual.text 的一个子类型, 其中该文本指示内容发生的位置。 音频描述

注册表条目在 版本控制系统中以 JSON 形式提供,位于 /registries/content-descriptor.json

4.1.6.3 唯一标识符

数据模型中的一些实体包含唯一标识符。 唯一 标识符具有以下要求:

  • 它在 DAPT 脚本中是唯一的, 即唯一标识符的值在文档中只能 使用一次, 无论它是哪种具体类型的标识符。

    如果一个角色 标识符的值为 "abc", 并且同一文档中的一个脚本事件标识符具有相同的值, 那就是一个错误。

  • 其值必须符合 Name 的要求,如 [XML] 所定义。

    它不能以 数字、 组合附加符号(重音符号), 或以下任何字符开头:

        .
        -
        ·  // #xB7// #x203F// #x2040

    但这些字符可以在其他位置使用。

实体的唯一标识符DAPT 文档中 通过相应元素上的 xml:id 属性来表示。

xml:id 的语义和处理的正式要求 在 [xml-id] 中定义。

4.2 角色

本节主要与配音工作流相关。

节目中的角色可以使用一个角色对象来描述,该对象具有 以下属性:

角色DAPT 文档中由 以下结构和约束表示:

Issue 44:定义 DAPT 专用的合规实现类型 CR must-have

我们应定义自己的合规实现类型类别,以避免使用 通用的“呈现处理器”或“转换处理器”类别。我们可以链接到它们。
目前,我能想到以下类别:

  • DAPT 创作工具:生成合规 DAPT 文档或消费 DAPT 合规 文档的工具。我不认为它们映射到 TTML2 处理器。
  • DAPT 音频录制器/渲染器:接收 DAPT 音频描述脚本的工具,例如带有混音 指令,并生成音频输出,例如 WAVE 文件。我认为它是“呈现 处理器”
  • DAPT 验证器:验证 DAPT 文档是否符合规范的工具。我不 确定它在 TTML2 术语中映射到什么。

4.3 脚本事件

脚本事件对象表示要说出的对白、屏幕文本或音频 描述,并具有以下属性:

脚本事件DAPT 文档中表示于路径 /tt/head/body//div, 并具有以下结构和约束:

Issue 233:考虑改进与脚本事件对应的 div 的识别 CR must-have

基于 #216(评论)中的讨论,我认为 我们应该有一个显式信号来指示 div 何时表示脚本事件。

4.4 文本

文本对象包含 通常使用单一语言的文本内容。 该语言可以是原文语言或译文语言。

文本在符合 以下任一情况时被定义为原文

文本在它是 另一种语言中原文文本对象的表示时,被定义为 译文

文本可以通过 同时检查其语言及其文本语言来源, 根据文本语言来源中定义的语义, 被识别原文译文

译文文本对象以及在适用情况下 原文文本对象的源语言, 使用文本语言来源属性来指示。

如果文本 对象或其一部分,相对于其父脚本事件,表示的是更具体或不同的内容, 则它可以具有不同的表示属性。

文本 对象及其每一个部分,必须具有有效的表示属性。 该属性本身的存在被视为可选, 因为如果文本对象省略了该 属性,则该属性从父脚本事件继承。

文本对象 可以被样式化。

文本期间用于修改节目音频的零个或多个 混合指令对象可以存在。

文本对象 在DAPT 文档中由路径 /tt/head/body//div/p 上的 <p> 元素表示,并具有以下约束:

4.5 文本语言来源

文本 语言来源属性是一种注释,用于指示 文本对象的源语言, 如果适用,或指示源内容没有固有语言:

文本语言来源是一个可继承属性。

文本语言来源属性在DAPT 文档中由一个 daptm:langSrc 属性表示, 具有以下语法、约束和语义:

daptm:langSrc
: <empty-string> | <language-identifier>

<empty-string>
: ""                    # default

<language-identifier>   # well-formed BCP-47 language tag

在文档中使用文本语言来源的示例 可见文本一节。

4.6 屏幕上

屏幕上 属性是一个注释,指示 与脚本事件主体相关的场景中位置, 例如正在说话的角色的位置:

如果省略,则默认值为 "ON"。

屏幕上 属性在 DAPT 文档中由 <div> 元素上的 daptm:onScreen 属性表示,并具有以下约束:

4.7 表示对象

表示对象 属性指示 脚本事件文本(或其一部分)表示 相关媒体对象 的哪个组成部分。

表示对象属性在 DAPT 文档中由 daptm:represents 属性表示, 其值必须是单个 <content-descriptor>

daptm:represents 属性可以出现在 以下任一元素上: <tt><body><div><p><span>

表示对象属性是可继承的。 如果某个元素上不存在该属性,则其计算值为 其父元素上表示对象属性的计算值; 或者,如果它没有父元素,则为空字符串。 如果某个元素上存在该属性,则其计算值为指定值。

由于不存在空的 <content-descriptor>, 这意味着空的计算表示对象 属性永远不可能有效;构造有效 DAPT 文档的一种方式是 在DAPT 脚本上 指定表示对象 属性,使其由所有没有表示对象 属性的后代继承。

如果表示对象属性值不是 脚本表示对象属性中的至少一个值的 内容 描述符子类型, 则这是错误。

4.8 脚本事件描述

脚本事件描述对象是 一个注释,提供对脚本事件内容某个方面的人类可读描述。 脚本事件描述本身可以使用 描述类型进行分类。

脚本事件描述对象在 DAPT 文档中由 <div> 元素级别的 <ttm:desc> 元素表示。

可以存在零个或多个 <ttm:desc> 元素。

脚本事件描述不应 为空。

脚本事件描述不需要是 唯一的, 即它不需要对每个脚本事件 都具有不同值。 例如,可以复用某个特定值,以人类可读的方式标识 一个或多个预期一起处理的脚本事件, 例如在批量录制中。

<ttm:desc> 元素 可以使用 xml:lang 属性 指定其语言。

...
  <body daptm:langSrc="zxx">
    <div begin="10s" end="13s" xml:id="a1">
      <ttm:desc>Scene 1</ttm:desc>
      <p xml:lang="en">
        <span>A woman climbs into a small sailing boat.</span>
      </p>
      <p xml:lang="fr" daptm:langSrc="en">
        <span>Une femme monte à bord d'un petit bateau à voile.</span>
      </p>
    </div>
    <div begin="18s" end="20s" xml:id="a2">
      <ttm:desc>Scene 1</ttm:desc>
      <p xml:lang="en">
        <span>The woman pulls the tiller and the boat turns.</span>
      </p>
      <p xml:lang="fr" daptm:langSrc="en">
        <span>La femme tire sur la barre et le bateau tourne.</span>
      </p>
    </div>
  </body>
...

每个脚本事件描述都可以使用 一个或多个描述 类型进行注释, 以进一步分类脚本事件描述的目的。

每个描述类型DAPT 文档中由 <ttm:desc> 元素上的 daptm:descType 属性表示。

<ttm:desc> 元素可以具有零个或一个 daptm:descType 属性。 daptm:descType 属性定义如下。

daptm:descType : string

daptm:descType 的允许值要么是 以下注册表中列出的值, 要么可以是用户定义的值:

注册表表格,用于 daptm:descType 属性, 其注册表定义位于 H.2.1 daptm:descType 注册表表格定义
daptm:descType 状态 描述 备注
pronunciationNote 临时 关于如何发音内容的注释。
scene 临时 包含场景标识符
plotSignificance 临时 定义内容对情节重要程度的度量。 内容未定义,可以是低、中或高,也可以是数值尺度。

注册表条目在 版本控制系统中以 JSON 形式提供,位于 /registries/descType.json

有效的用户定义值必须x- 开头。

...
  <body>
    <div begin="10s" end="13s" xml:id="a123">
      <ttm:desc daptm:descType="pronunciationNote">[oːnʲ]</ttm:desc>
      <p>Eóin looks around at the other assembly members.</p>
    </div>
  </body>
...

在同级的一组 <ttm:desc> 元素中, 对 daptm:descType 属性的唯一性没有约束, 但它可用作区分项,如以下示例所示。

...
  <body daptm:langSrc="zxx">
    <div begin="10s" end="13s" xml:id="a1">
      <ttm:desc daptm:descType="scene">Scene 1</ttm:desc>
      <ttm:desc daptm:descType="plotSignificance">High</ttm:desc>
      <p xml:lang="en">
        <span>A woman climbs into a small sailing boat.</span>
      </p>
      <p xml:lang="fr" daptm:langSrc="en">
        <span>Une femme monte à bord d'un petit bateau à voile.</span>
      </p>
    </div>
    <div begin="18s" end="20s" xml:id="a2">
      <ttm:desc daptm:descType="scene">Scene 1</ttm:desc>
      <ttm:desc daptm:descType="plotSignificance">Low</ttm:desc>
      <p xml:lang="en">
        <span>The woman pulls the tiller and the boat turns.</span>
      </p>
      <p xml:lang="fr" daptm:langSrc="en">
        <span>La femme tire sur la barre et le bateau tourne.</span>
      </p>
    </div>
  </body>
...

4.9 音频

音频对象用于 指定文本的音频呈现。 音频呈现可以是已录制的音频资源, 作为音频录制对象, 或是通过文本转语音引擎合成文本呈现的指令, 即合成音频对象。 二者都是音频对象的类型。

如果音频与其文本不使用相同语言, 则这是错误。

支持音频的呈现处理器相关媒体对象的时间轴上,在指定时间播放或插入音频

音频对象是“抽象”的:它只能作为 其子类型之一存在,即音频录制合成 音频

4.9.1 音频录制

音频录制是引用音频 资源的音频对象。 它具有以下属性:

  • 一个或多个替代来源,其中每个来源 要么是 1) 指向外部音频资源的链接, 要么是 2) 嵌入式音频录制;
  • 对于每个来源,一个强制性的类型, 用于指定音频资源的类型([MIME-TYPES]), 例如 audio/basic
  • 一个可选的开始属性、一个可选的结束属性和一个可选的持续时间属性, 它们共同定义音频录制在节目 时间轴中的时间间隔, 该时间间隔相对于父元素的时间间隔;
  • 一个可选的入点时间和一个可选的出点时间 属性, 它们共同定义音频资源的一个时间子段;

    默认入点时间是音频资源的开头。

    默认出点时间是音频资源的结尾。

    如果音频资源的时间子段长于 音频录制时间间隔的持续时间, 则播放必须截断,在 音频录制的时间间隔结束时结束。

    如果音频资源的时间子段短于 音频录制时间间隔的持续时间, 则音频资源播放一次。

  • 零个或多个混音指令,用于修改 音频录制的播放 特性。

当提供来源列表时, 呈现处理器必须对每个 音频录制播放不超过一个 来源

此特性可能有助于浏览器指纹识别。 实现可以使用类型,以及在存在时 任何相关的附加格式信息, 来决定播放哪个来源。 例如,给定两个来源,一个是 WAV 文件,另一个是 MP3, 只能播放这些格式之一的实现, 或配置为偏好其中之一的实现, 将选择可播放或偏好的版本。

音频录制DAPT 文档中由 一个<audio> 元素表示,该元素是与其适用的文本相对应的 <p><span> 元素的子元素。 以下约束适用于 <audio> 元素:

  • beginenddur 属性 分别表示开始结束持续时间 属性;
  • clipBeginclipEnd 属性 分别表示入点时间出点时间属性, 如示例 5所示;
  • 对于每个来源,如果它是指向外部音频资源的链接, 则来源类型属性正好由以下之一表示:
    1. 一个不是片段标识符的 src 属性, 以及一个 type 属性,分别表示二者;

      如果存在多个来源, 则不能使用此机制。

      <audio src="https://example.com/audio.wav" type="audio/wave"/>
    2. 一个<source>子元素, 该子元素带有一个 不是片段标识符的 src 属性 和一个 type 属性,分别表示二者;
      <audio>
        <source src="https://example.com/audio.wav" type="audio/wave"/>
        <source src="https://example.com/audio.aac" type="audio/aac"/>
      </audio>

    不是片段标识符的 src 属性是一个引用 外部音频资源的 URL,即一个未嵌入在DAPT 脚本内的音频资源。 DAPT 中未指定对该资源是否可定位的验证。

    编辑注

    这里是否需要两种机制? 目前不清楚在这种情况下,子 <source> 元素 承载了什么语义优势。 是否考虑将该子 <source> 元素的使用标记为“有风险”?

    Issue 113:支持 `@src` 和 `<audio>` 的 `<source>` 子元素(外部资源)?questionCR-exit-must-have
              While working on the specification for adding audio recordings I reminded myself of the various ways in which an audio recording can be embedded and referenced, of which there are at least 5 in total. Requirement R15 of [DAPT](https://www.w3.org/TR/dapt-reqs/#requirements) is clear that both referenced and embedded options need to be available, but should we be syntactically restricting the options for each? Will raise as separate issues.
    

    最初由 @nigelmegitt 发布于 #105 (评论)

    TTML2 中存在以下两种用于引用 外部音频资源的选项:

    1. <audio> 元素中的 src 属性。
    <audio src="https://example.com/audio_recording.wav" type="audio/wave"/>
    1. <audio> 元素的 <source> 子元素。
    <audio>
        <source src="https://example.com/audio_recording.wav" type="audio/wave"/>
    </audio>

    第二个选项还有一种额外可能性:在 type 不足以表达时指定 format 属性。它还允许 多个<source> 子元素,并且我们规定 在这种情况下实现必须选择不超过一个。

    [2023-03-29 编辑,以反映问题提出后增加的“播放不超过一个”约束]

    Issue 218:有风险:支持 `<audio>` 中用于外部资源的 `src` 属性 CR-exit-must-haveAt risk feature

    #113 的可能解决方案。

    Issue 219:有风险:支持 `<audio>` 的 `<source>` 子元素用于外部资源 CR-exit-must-haveAt risk feature

    #113 的可能解决方案。

  • 对于每个来源,如果它是嵌入式音频资源, 则来源类型属性共同由 以下之一准确表示:
    1. 一个作为片段标识符的 src 属性, 该片段标识符引用 一个<audio> 元素, 其中被引用的元素是 /tt/head/resources 的子元素, 并指定一个 type 属性 和用于引用它的 xml:id 属性;

      如果存在多个来源, 则不能使用此机制。

      <tt>
        <head>
          <resources>
            <audio type="audio/wave" xml:id="audio1">
              <source><data>[base64-encoded WAV audio resource]</data></source>
            </audio>
          </resources>
        </head>
        <body>
          ..
          <audio src="#audio1"/>
          ..
        </body>
      </tt>
    2. 一个<source>子元素, 该子元素带有一个 作为片段标识符的 src 属性, 该片段标识符引用 一个<data> 元素, 其中被引用的元素是 /tt/head/resources 的子元素, 并指定一个 type 属性 和用于引用它的 xml:id 属性;
      <tt>
        <head>
          <resources>
            <data type="audio/wave" xml:id="audio1wav">
              [base64-encoded WAV audio resource]
            </data>
            <data type="audio/mpeg" xml:id="audio1mp3">
              [base64-encoded MP3 audio resource]
            </data>
          </resources>
        </head>
        <body>
          ..
          <audio>
            <source src="#audio1wav"/>
            <source src="#audio1mp3"/>
          </audio>
          ..
        </body>
      </tt>
    3. 一个<source>子元素, 它带有一个 <data> 子元素, 该子元素指定一个 type 属性并包含音频录制数据。
      <audio>
        <source>
          <data type="audio/wave">
              [base64-encoded WAV audio resource]
          </data>
        </source>
      </audio>

    在上述每种情况下,type 属性表示类型属性。

    作为片段标识符的 src 属性是一个指针, 指向嵌入在DAPT 脚本内的音频资源。

    如果定义了 <data> 元素,则每个元素必须 包含 #PCDATA<chunk> 子元素, 并且不得包含任何 <source> 子 元素。

    <data><source> 元素可以包含 format 属性, 在选择适当的音频资源时,实现可以将其值与 type 属性值 一起使用。

    编辑注

    这里是否需要全部 3 种机制? 是否需要其中任何一种? 嵌入音频数据可能存在用例, 因为它使单个文档成为可移植的(尽管很大的) 实体,可以进行交换和传输,而不必担心资源缺失, 也不需要例如清单文件。 如果我们不需要支持引用式嵌入音频,则只需要最后一个选项, 并且它可能是实现起来最简单的。 引用式嵌入音频的一种理由是,它更容易允许在 不同文档位置重用相同音频,尽管在此用例中这似乎是不太可能的 需求。另一种理由是,这意味着所有嵌入音频都位于 文档中易于定位的部分 tt/head/resources 中,这 可能会带来实现方面的好处? 是否考虑将嵌入式数据特性标记为“有风险”?

    Issue 114:支持 `@src` 和 `<audio>` 的 `<source>` 子元素(嵌入式资源)?questionCR-exit-must-have
              While working on the specification for adding audio recordings I reminded myself of the various ways in which an audio recording can be embedded and referenced, of which there are at least 5 in total. Requirement R15 of [DAPT](https://www.w3.org/TR/dapt-reqs/#requirements) is clear that both referenced and embedded options need to be available, but should we be syntactically restricting the options for each? Will raise as separate issues.
    

    最初由 @nigelmegitt 发布于 #105 (评论)

    给定一些嵌入式音频资源:

    <head>
      <resources>
        <audio xml:id="audioRecording1" type="audio/wave">
          <source>
            <data>[base64 encoded audio data]</data>
          </source>
        </audio>
        <data xml:id="audioRecording2" type="audio/wave">
          [base64 encoded audio data]
        </data>
      </resources>
    </head>

    TTML2 中存在以下两种用于引用 嵌入式音频资源的选项:

    1. <audio> 元素中的 src 属性,引用嵌入的 <audio><data>
    <audio src="#audioRecording1"/>
    ...
    <audio src="#audioRecording2"/>
    1. <audio> 元素的 <source> 子元素。
    <audio>
        <source src="#audioRecording1"/>
    </audio>

    第二个选项还有一种额外可能性:在 type 不足以表达时指定 format 属性。它还允许 多个<source> 子元素,不过如果指定多个资源, 其预期语义尚不清楚——大概是实现以某种方式选择其中一个。

    Issue 115:支持引用式和内联式 嵌入音频录制?questionCR-exit-must-have
              While working on the specification for adding audio recordings I reminded myself of the various ways in which an audio recording can be embedded and referenced, of which there are at least 5 in total. Requirement R15 of [DAPT](https://www.w3.org/TR/dapt-reqs/#requirements) is clear that both referenced and embedded options need to be available, but should we be syntactically restricting the options for each? Will raise as separate issues.
    

    最初由 @nigelmegitt 发布于 #105 (评论)

    如果我们要支持嵌入式音频资源,它们可以定义在 /tt/head/resources 中然后被引用,或者 数据可以以内联方式包含。

    这两个选项都需要吗?

    嵌入式示例:

    <head>
      <resources>
        <audio xml:id="audioRecording1" type="audio/wave">
          <source>
            <data>[base64 encoded audio data]</data>
          </source>
        </audio>
        <data xml:id="audioRecording2" type="audio/wave">
          [base64 encoded audio data]
        </data>
      </resources>
    </head>

    然后可使用类似以下内容在正文内容中引用它(另见 #114):

    <audio src="#audioRecording2"/>

    内联示例:

    <audio type="audio/wave">
      <source type="audio/wave">
        <data>[base64 encoded audio data]</data>
      </source>
    </audio>
    Issue 220: 有风险:支持指向嵌入式资源的 `<audio>` 元素的 `src` 属性 CR-exit-must-haveAt risk feature

    #114#115 的可能解决方案。

    #115 的关联在于,这意味着还 存在某种可引用的嵌入式音频资源,这也是 #115 中描述的选项之一。

    Issue 221: 有风险:支持作为 `<audio>` 元素子元素且指向嵌入式资源的 `<source>` CR-exit-must-haveAt risk feature

    #114#115 的可能解决方案。

    #115 的关联在于,这意味着还 存在某种可引用的嵌入式音频资源,这也是 #115 中描述的选项之一。

    Issue 222: 有风险:支持内联音频 资源 CR-exit-must-haveAt risk feature

    #115 的可能解决方案。

    Issue 116: 将非内联的嵌入式音频 资源添加到数据模型? questionCR-exit-must-have

    另见 #115 - 如果我们要支持 非内联的嵌入式音频资源,是否应该为它们创建一个对象并将其添加到 数据模型中?

    Issue 117: 嵌入式数据:我们是否需要支持 所有允许的编码?length 呢? questionCR-exit-must-have

    在 TTML2 的 <data> 元素中,可以指定一个 encoding,它可以是 以下之一:

    • base16
    • base32
    • base32hex
    • base64
    • base64url

    我们是否需要要求处理器支持所有这些编码,还是默认的 base64 就足够?

    此外,还可以指定一个 length 属性,它为错误检查提供了一定可行性,因为解码后的数据必须 具有指定的字节长度。要求支持此属性是否总体有益?它会被使用吗?

    Issue 223: 有风险:`<data>` 中 `encoding` 的每个潜在值 CR-exit-must-haveAt risk feature

    #117 的可能解决方案。

    Issue 224: 有风险:支持 `<data>` 上的 `length` 属性 CR-exit-must-haveAt risk feature

    #117 的可能解决方案。

  • 混音指令可以 按其 TTML 表示中的指定方式应用;
  • xml:lang 属性的计算值必须与 父元素以及任何子 <source> 元素 和任何被引用的嵌入式 <data> 元素的 xml:lang 属性的计算值 相同。

4.9.2 合成音频

合成 音频是一个音频对象,它表示 父文本内容的机器生成音频呈现。 它具有以下属性:

  • 一个强制性的速率,用于指定语速,其值为 normalfastslow
  • 一个可选的音高,允许调整 语音的音高。

合成音频DAPT 文档中通过 在表示要说出的文本对象的元素上应用 tta:speak 样式属性来表示, 其中该属性的计算值为 normalfastslow。 该属性也表示速率属性。

tta:pitch 样式属性表示音高属性。

合成音频TTML 表示 如示例 7所示。

如果某个元素的 tta:rate 属性计算值为 none, 则该元素上的 tta:pitch 属性 没有效果。 该元素不被视为具有关联的合成 音频

DAPT合成音频词汇的语义 派生自 [SSML] 中的 等效特性,如 [TTML2] 中所示。 本规范的此版本 未指定 [SSML] 的其他特性如何 从 DAPT 生成,或嵌入到DAPT 文档中。未来版本 本规范扩展 [SSML] 支持的选项 被有意保留开放。

4.10 混音指令

混音指令对象是对与包含对象相关的音频进行的静态或动画调整。 它具有以下属性:

混音指令通过将音频样式 属性应用到与相关对象对应的元素来表示,可以是内联方式、 通过引用 <style> 元素,或在子(内联) <animate> 元素中:

如果混音指令是动画的,也就是说, 如果调整属性在包含对象的活动时间间隔期间发生变化, 则它由一个或多个子<animate>元素表示。 如果需要多个增益声像属性, 或者需要任何定时属性,则需要这种表示。

<animate> 元素必须是 与包含对象对应的元素的子元素, 并具有以下约束:

动画混音指令TTML 表示 如示例 4所示。

另见E. 音频混音

5. 约束

5.1 文档编码

DAPT 文档必须序列化为一个格式良好的 XML 1.0 [xml] 文档, 并按 [UNICODE] 中规定使用 UTF-8 字符编码进行编码。

所得的 [xml] 文档不得包含以下任何物理结构:

所得的 [xml] 文档 可以包含 字符引用, 以及指向 预定义实体实体引用

预定义实体如下(包括前导与号和尾随分号):

  • &amp; 表示与号 &(Unicode 码点 U+0026)
  • &apos; 表示撇号 '(Unicode 码点 U+0027)
  • &gt; 表示大于号 >(Unicode 码点 U+003E)
  • &lt; 表示小于号 <(Unicode 码点 U+003C)
  • &quot; 表示引号符号 "(Unicode 码点 U+0022)

DAPT 文档也可以 用作处理的内存中模型, 在这种情况下,序列化要求不适用。

5.2 无法识别或外来元素和属性的处理

本节中的要求旨在促进向前和向后兼容性, 具体允许:

符合 规范多个版本的DAPT 文档可以指定对多个 DAPT 内容配置文件的符合性。

5.2.1 无法识别的词汇

无法识别的词汇是指 不与处理器所支持的特性关联的元素和属性集合。

转换处理器必须剪除 既不是属性、也不是 <metadata> 元素后代的无法识别的词汇

转换处理器应当保留 是属性或 <metadata> 元素后代的无法识别的词汇

另见5.6.2 ttp:contentProfiles,它禁止发出对 转换处理器不支持的配置文件的 配置文件符合性信号。

属性值计算之后, 呈现处理器应当忽略无法识别的词汇

之所以将上述约束指定为在属性值计算之后, 是因为实现可能识别并支持仅出现在特定元素上的属性, 例如那些与 DAPT 数据模型对应的属性。 如6.4 使用计算属性值中所述, 处理器实现 在这些属性出现在其他元素上时,不忽略它们非常重要。

5.2.2 外来词汇的特殊考虑

外来 词汇无法识别的词汇的子集, 它由 命名空间不是5.3 命名空间中列出的命名空间之一的元素和属性, 以及其命名空间没有值且未在 DAPT 或 [TTML2] 中另行定义的属性组成。

DAPT 文档可以包含 既未被ttp:contentProfiles 中发出信号的配置文件 明确允许、也未被禁止的外来词汇

出于验证目的,良好实践是为DAPT 文档中使用的所有 外来词汇 定义并使用一个规范, 例如一个内容配置文件

5.2.3 专有元数据和外来词汇

许多配音和音频描述工作流允许使用专有元数据 注释脚本事件或文档。 可以包含本规范或 [TTML2] 中定义的元数据词汇。 也可以包含外来词汇, 可以作为 <metadata> 元素的属性, 或作为 <metadata> 元素的后代元素。

可以使用 [TTML2] 构造添加节目标题等信息。

...
  <head>
    <metadata>
      <ttm:title>A example document title</ttm:title>
    </metadata>
  </head>
...

可以使用外来命名空间添加工作流特定的信息。 在以下示例中,使用来自“示例供应商”的虚构命名空间 vendorm 来提供 DAPT 未定义的文档级信息。

...
  <metadata xmlns:vendorm="http://www.example-vendor.com/ns/ttml#metadata">
    <vendorm:programType>Episode</vendorm:programType>
    <vendorm:episodeSeason>5</vendorm:episodeSeason>
    <vendorm:episodeNumber>8</vendorm:episodeNumber>
    <vendorm:internalId>15734</vendorm:internalId>
    <vendorm:information>Some proprietary information</vendorm:information>
  </metadata>
...
强烈建议不要将其语义依赖于文档内容的数据 放置在 <metadata> 元素中。

此类数据可能会被 修改文档内容但保留元数据、同时不了解其语义的转换处理器置为无效。

5.2.3.1 定义和使用非元数据的外来词汇

本节是非规范性的。

如果外来词汇包含在 <metadata> 元素以外的位置, 则不支持与该词汇关联的特性的转换处理器将按 5.2.1 无法识别的词汇中的要求 将其剪除。

提供了一种机制,用于防止这种剪除,并为此类外来词汇定义语义, 允许其位于 <metadata> 元素之外而不被剪除, 并指示内容和处理器符合性:

  1. 定义一个配置文件,其中包括该语义和词汇的特性定义, 并带有配置文件指示符。
  2. 使用5.6.2 ttp:contentProfiles发出文档符合该配置文件的信号

这允许支持该特性的处理器以任何适当方式处理该词汇, 以避免剪除它, 并允许不支持该特性的处理器采取 适当操作,例如警告用户某些功能可能会丢失。

5.3 命名空间

本规范中使用以下命名空间(见 [xml-names]):

名称 前缀 定义规范
XML xml http://www.w3.org/XML/1998/namespace [xml-names]
TT tt http://www.w3.org/ns/ttml [TTML2]
TT 参数 ttp http://www.w3.org/ns/ttml#parameter [TTML2]
TT 音频样式 tta http://www.w3.org/ns/ttml#audio [TTML2]
TT 元数据 ttm http://www.w3.org/ns/ttml#metadata [TTML2]
TT 特性 http://www.w3.org/ns/ttml/feature/ [TTML2]
DAPT 元数据 daptm http://www.w3.org/ns/ttml/profile/dapt#metadata 本规范
DAPT 扩展 http://www.w3.org/ns/ttml/profile/dapt/extension/ 本规范
EBU-TT 元数据 ebuttm urn:ebu:tt:metadata [EBU-TT-3390]

上面定义的命名空间前缀值是为方便而提供,DAPT 文档可以使用任何符合 [xml-names] 的前缀值。

本规范定义的命名空间是可变的,如 [namespaceState] 中所述; 这些命名空间中的所有未定义名称都保留给 W3C 将来标准化。

5.5 同步

如果DAPT 文档旨在 用作生成 [ttml-imsc1.3] 文档的基础, 则 [ttml-imsc1.3] 的同步规定适用于 与视频相关的情况。

DAPT 文档中的定时内容旨在 从特定音频采样开始和结束来呈现。

在本规范的上下文中,呈现可以是文本的视觉呈现, 例如向演员显示要说出的词语,也可以是音频资源的可听播放, 或者可以是物理或触觉呈现,例如盲文显示器。

在受限应用中,例如实时音频混合和播放, 如果在呈现输出中无法实现与音频采样的精确同步, 则在呈现的定时变化中,创作和播放不准确性的综合影响应该满足 [EBU-R37] 的同步要求, 即音频变化不得早于图像变化 超过 40ms,也不得晚于图像变化超过 60ms。

同样,创作应用程序应该允许作者满足 [EBU-R37] 的要求, 通过以一定精度定义时间, 使音频变化晚于视频图像中任何相关变化的时间少于 15ms, 并早于视频图像中任何相关变化的时间少于 5ms。

综合来看,上述关于整体呈现以及 关于旨在用于实时播放的DAPT 文档的两个约束意味着, 内容处理器应该 完成音频呈现变化的时间 不早于DAPT 文档中指定时间 超过 35ms, 且不晚于指定时间超过 45ms。

5.6 配置文件信号

本节定义 TTML 文档实例 如何发出它是DAPT 文档的信号, 以及如何发出适用的任何处理要求信号。 另见7.1 DAPT 文档的符合性, 该节定义如何 确定DAPT 文档符合本 规范。

5.6.1 配置文件指示符

此配置文件与以下配置文件指示符关联:

配置文件名称 配置文件类型 配置文件指示符
DAPT 1.0 内容 配置文件 内容配置文件 http://www.w3.org/ns/ttml/profile/dapt1.0/content
DAPT 1.0 处理器配置文件 处理器配置文件 http://www.w3.org/ns/ttml/profile/dapt1.0/processor

5.6.2 ttp:contentProfiles

ttp:contentProfiles 属性 用于声明文档所符合的 [TTML2] 配置文件。

DAPT 文档必须<tt> 元素上指定 ttp:contentProfiles 属性, 其中至少包括一个等于5.6.1 配置文件 指示符中指定的 内容配置文件指示符的值。 可以存在其他值,用于声明符合 [TTML2] 的其他配置文件, 并且可以包括专有命名空间中的配置文件指示符。

如果DAPT 文档发出 符合某个其并不符合的 内容配置文件的信号, 则这是错误。

转换处理器不得ttp:contentProfiles 属性中包含与其(处理器)不支持的配置文件关联的值; 按定义,它们无法验证内容对这些配置文件的符合性。

5.6.3 ttp:profile

ttp:profile 属性 是 [TTML1] 中用于声明 文档实例处理要求的一种机制。 它实际上已在 [TTML2] 中由 ttp:processorProfiles 取代。

DAPT 文档不得<tt> 元素上指定 ttp:profile 属性。

5.6.4 ttp:processorProfiles

ttp:processorProfiles 属性 用于声明文档实例的处理要求。

DAPT 文档可以<tt> 元素上指定 ttp:processorProfiles 属性。 如果存在,则 ttp:processorProfiles 属性必须至少包括一个值,该值等于 5.6.1 配置文件 指示符中指定的 处理器配置文件指示符。 可以存在其他值,用于声明附加处理约束, 并且可以包括专有命名空间中的配置文件指示符。

ttp:processorProfiles 属性可用于发出信号,表明需要支持附加配置文件中的特性和扩展, 才能成功处理文档实例。 例如,本地工作流可能引入特定的元数据要求, 并通过使用附加处理器配置文件指示符来发出处理器需要支持这些要求的信号。

如果内容作者不需要发出信号表明处理 DAPT 文档 需要超出 DAPT 定义之外的 附加处理器要求, 则 ttp:processorProfiles 属性预期不会存在。

5.6.5 其他 TTML2 配置文件 词汇

[TTML2] 指定了一种 可用于定义文档实例可使用的、或处理器需要支持的 特性集合的词汇和语义, 这称为配置文件

除非另有规定,DAPT 不要求处理器支持此配置文件词汇; 但仍允许这种支持。

此配置文件词汇的大部分用于指示处理器如何计算 为成功处理文档实例而需要支持的特性集合。 该词汇本身是根据 TTML2 特性定义的。 这些与配置文件相关的特性在F. 配置文件中列为可选。 处理器可以实现它们, 并且其关联词汇 可以出现在DAPT 文档中。

除非已经安排(使用带外协议)处理器支持这些特性和词汇, 否则不预期出现该词汇。

DAPT 中不要求(但允许)处理器支持的 附加配置文件相关词汇包括:

5.7 定时约束

DAPT 脚本中,以下 约束适用于时间属性和时间表达式:

5.7.1 ttp:timeBase

唯一允许的 ttp:timeBase 属性值是 media, 因为F. 配置文件禁止 除#timeBase-media 之外的所有 timeBase 特性。

这意味着文档时间轴的开头, 即时间“零”, 是相关媒体对象的开头。

5.7.2 timeContainer

timeContainer 属性唯一允许的值是默认值 par

文档应当在所有元素上省略 timeContainer 属性。

文档不得在任何元素上将 timeContainer 属性设置为 par 以外的任何值。

这意味着每个定时元素的 begin 属性值 相对于其父元素的计算开始时间, 或者对于 <body> 元素,相对于时间零。

5.7.3 ttp:frameRate

如果文档包含任何使用 f 度量的时间表达式, 或任何包含帧组成部分的时间表达式, 则 ttp:frameRate 属性必须出现在 <tt> 元素上。

5.7.4 ttp:tickRate

如果文档包含任何使用 t 度量的时间表达式, 则 ttp:tickRate 属性必须出现在 <tt> 元素上。

5.7.5 时间表达式

文档中的所有时间表达式应当使用相同语法, 即 [TTML2] 中定义的 clock-timeoffset-time, 并应用DAPT 约束

DAPT clock-time 具有以下形式之一:

  • hh:mm:ss.sss
  • hh:mm:ss

其中 hh 为小时, mm 为分钟, ss 为秒,且 ss.sss 为带秒的小数部分的秒(任意精度)。

使用帧组成部分的时钟时间表达式 看起来类似“时间码”, 但由于在其他地方观察到使用它们时会造成语义混淆, 尤其是在非整数帧率、“丢帧模式”和子帧率下, 因此被禁止。

offset-time 具有以下形式之一:

  • nn metric
  • nn.nn metric

其中 nn 是整数, nn.nn 是带小数部分的数字(任意精度),且 metric 是以下之一:

  • h 表示小时,
  • m 表示分钟,
  • s 表示秒,
  • ms 表示毫秒,
  • f 表示帧,以及
  • t 表示滴答。

当将媒体时间表达式 M 映射到视频的帧 F 时, 例如用于精确定时唇同步, 内容处理器应当将 M 映射到呈现时间 最接近但不小于 M 的帧 F。

媒体时间表达式 00:00:05.1 对应于帧率为 1000 / 1001 × 30 ≈ 29.97 的视频的第 ceiling( 5.1 × ( 1000 / 1001 × 30) ) = 153 帧。

5.8 布局和样式

本规范不对 [ttml-imsc1.3] 中定义的布局和呈现特性施加额外约束。

段落的布局可以依赖默认的 TTML 区域(即如果 <head> 元素中没有使用 <layout> 元素),也可以通过使用 region 属性显式指定,以引用位于 /tt/head/layout/region<region> 元素。

可以使用样式引用或内联样式,使用 style 属性、 <style> 元素以及 [TTML2] 或 [ttml-imsc1.3] 中定义的内联样式属性的任意组合。

5.9 双向文本

以下元数据元素在 DAPT 中是允许的,并且在 [TTML2] 中被指定为包含 #PCDATA, 即仅包含文本数据而没有元素内容。 在此类元素内的字符内容中需要双向文本时, 可以使用 Unicode 控制字符在任意文本范围内定义基方向。

关于此机制用法的更多指导可见于HTML 中的内联标记和 双向文本

<p><span> 内容元素允许使用 tts:directiontts:unicodeBidi 属性指定文本方向。 文档作者应使用这种更健壮的机制,而不是使用 Unicode 控制字符。

以下取自 [TTML2] 的示例 演示了 <p><span> 元素内 双向文本标记的语法。

<p>
The title of the book is
"<span tts:unicodeBidi="embed" tts:direction="rtl">نشاط التدويل، W3C</span>"
</p>

上述片段的示例渲染如下所示。

方向示例的示例呈现,显示从左到右的 The title of the book is W3C,然后从右到左显示相应的阿拉伯语文本

6. TTMLDAPT 数据模型的映射

4. DAPT 数据模型及相应的 TTML 语法定义了 DAPT 数据模型的对象和属性如何在 [TTML2] 中表示,即在DAPT 文档中表示。 然而,一个 DAPT 数据模型实例可以 由多个 [TTML2] 文档实例表示。

例如,4. DAPT 数据模型及相应的 TTML 语法并未强制要求表示 脚本事件<div> 元素必须是 <body> 元素的直接子元素。 该 <div> 元素可以嵌套在另一个 <div> 元素中。 因此,可以将DAPT 脚本的对象和属性序列化为各种DAPT 文档。 本节定义如何从一个DAPT 文档中可互操作且无歧义地重建一个 DAPT 模型实例。

DAPT 出于可扩展性原因, 没有定义 DAPT 数据模型的完整序列化, 以便在需要时允许未来版本这样做。 此外,DAPT 文档可以包含 未在 DAPT 对象或属性的表示中提及的元素或属性。 这可能是因为它由符合 DAPT 未来某个版本的处理器生成, 或是通过通用 [TTML2] 流程生成, 或者因为它使用了可选特性,例如添加样式或布局。 本节定义如何处理这些元素或属性。

也可以使用通用 [TTML2] 处理器处理DAPT 文档, 这些处理器不一定会将文档映射到 DAPT 数据模型。 例如,通用 TTML2 呈现处理器可以基于 DAPT 文档渲染音频混音, 而不需要对脚本事件本身建模。 在这种情况下,可以忽略本节。

6.1 早期 识别不符合的文档

本节是非规范性的。

与本节相关的规范性规定定义于 [TTML2] 中。

由于 DAPT 要求 DAPT 文档在根元素上包含 ttp:contentProfiles 属性, 并且该属性包含一个 DAPT 内容配置文件指示符, 如5.6.2 ttp:contentProfiles中所规定, 因此任何未包含此类属性、 或未包含此类配置文件指示符的 TTML 文档, 都可以被视为不是DAPT 文档; 因此,需要严格遵循 DAPT 的处理器可以停止处理 这样的文档。

6.2 不 支持内容配置文件排除的特性

如果处理器以一个DAPT 文档作为输入, 该文档包含与其确实支持的特性相关的词汇, 但该文档声称符合的内容配置文件排除了对这些特性的支持, 则在该文档的上下文中,处理器不应实现 这些特性。

6.3 处理 <div><p> 元素

[TTML2] 允许 <div> 元素包含任意组合的 <div> 元素和 <p> 元素。 DAPT 数据模型描述了 每个脚本事件如何由 一个包含零个或多个 <p> 元素的 <div> 元素表示。 它还允许在 <body> 元素和这些脚本事件 <div> 元素之间的路径中存在其他中间 <div> 元素。 此外,也允许使用不对应于 DAPT 数据模型中属性的属性。

这会产生如下可能性:

以下处理规则解决这些情况。

用于识别脚本事件的规则:

  1. 没有 <div> 元素子项、 并包含脚本事件所有 非元数据强制属性的 TTML 表示的 <div> 元素, 必须映射到脚本事件, 例如具有表示脚本事件标识符的有效 xml:id, 即使它还包含额外的无法识别的词汇

  2. 包含任何 <div> 元素子项的 <div> 元素 不得映射到脚本事件; 处理器反而必须遍历这些 <div> 元素子项 (递归地,以深度优先遍历),并考虑其中每个子项是否满足脚本事件的要求;
  3. 任何剩余的未映射 <div> 元素不得映射 到脚本事件

用于识别文本对象的规则:

  1. 作为映射到脚本事件<div> 元素的子元素的 <p> 元素,必须映射到 文本 对象。
  2. 不是映射到脚本事件<div> 元素的子元素的 <p> 元素,不得映射到 文本 对象。

DAPT 的未来版本 可能包含以不同方式使用这些 结构可能性的特性, 因而定义与这里定义的规则 相互排斥的其他处理规则。

6.4 使用计算属性 值

某些属性具有用于计算其值的语义,该语义取决于 其他某个元素上该属性的计算值。 例如,如果某个元素上未指定 xml:lang 属性,则其计算 值为该元素父元素上同一属性的计算值。

可以在除其定义所在的 DAPT 数据模型实体所对应元素之外 的元素上指定的属性表。 请注意,其他允许的属性, 例如样式属性 (包括 filltta:gaintta:pan), 未在此列出。
属性 DAPT 数据模型实体 可以指定于 对子元素或后代元素的影响
xml:lang 默认语言、语言 任意元素 继承,如 [XML] 中定义
xml:id 唯一标识符 任意元素
begin 开始 <body><div><p><span><audio><animate> 为其子元素上的定时属性设置纪元,如 [TTML2] 中定义
end 结束 <body><div><p><span><audio><animate> 约束其后代的计算结束时间,如 [TTML2] 中定义
dur 持续时间 <body><div><p><span><audio><animate> 约束其后代的计算结束时间,如 [TTML2] 中定义
daptm:langSrc 文本语言来源 <tt><body><div><p><span> 继承,如本节中定义
daptm:represents 表示对象 <tt><body><div><p><span> 继承,如本节中定义

daptm:scriptRepresentsdaptm:onScreendaptm:descType 属性 仅在指定于特定元素上时才有定义。

或者,再举一个例子,DAPT 文档中某个元素的计算时间 相对于该元素父元素的开始时间。 如果 <div> 元素指定了 begin 属性, 则其子 <div> 元素的计算时间 相对于该父 <div> 元素的开始时间, 并沿层级依次类推。 即使处理目标是 DAPT 数据模型的 一个实例,且这些“中间”<div> 元素在其中没有直接等价物, 也必须在计算中包含这些元素的时间; 否则脚本事件开始结束时间将会错误。

更一般地考虑这种情况, 在 DAPT 文档中,可能存在一些 TTML 元素, 它们不直接对应于 DAPT 数据模型中的对象, 并且这些元素可以指定一些属性, 这些属性会影响适用于那些确实对应于 DAPT 数据模型对象的元素的属性值计算。

在这种情形中,由 [TTML2] 定义的语义,或者对于 本文定义的词汇,由本规范定义的语义,具有优先权。 实现必须基于文档实例的内容计算属性值,然后 再将这些计算值应用于 DAPT 数据模型对象。 例如,支持 TTML2 样式特性的处理器需要 实现 TTML2 关于继承和计算相对值的语义, 例如 tts:fontSize 等属性的语义。

如果实现内部创建 DAPT 数据模型对象, 例如上例所示的脚本事件, 为实现互操作性,重要的是它们使用计算值。

6.5 转换和验证处理器的考虑事项

本节是非规范性的。

6.5.1 保留 无法识别的词汇

按照5.2.1 无法识别的词汇, 鼓励 DAPT 处理器的实现者 在DAPT 文档<metadata> 元素内保留无法识别的词汇。 在实践中,一个既输入 DAPT 文档 又输出 DAPT 文档的实现 可能会修改输入 文档结构和内容,并在此过程中 实际上从输出文档中剪除了那些具有无法识别的词汇的实体。

6.5.2 验证警告 和错误

与本节相关的规范性规定定义于 [TTML2] 中。

[TTML2] 定义了验证处理器, 这是一类实现,其目的是 评估文档实例并决定其是否有效。 通常,这会在处理工作流中使用, 用于检查文档是否可被后续使用所接受。 真实世界的示例很可能不会仅返回“好”或“坏”, 而还会输出信息性、警告和错误消息, 描述输入文档中异常、意外或有问题的内容。

在为DAPT 文档实现验证处理器时, 可以应用严格的 [TTML2] 验证 处理规则。 这样做涉及检查配置文件中定义的必需或可选特性所关联的 语法和内容是否存在且语义有效, 以及检查是否不存在与被禁止特性关联的语法。

[TTML2] 用于 处理无法识别命名空间中的词汇的机制是 在验证之前剪除它。 可以使用这种方法;此外,对于 已被剪除的那些属性和元素, 实现将其作为信息报告也是合理的。

此处的术语“词汇”指 XML 元素和属性。

当在剪除之后遇到已识别命名空间中的不支持或已弃用 词汇时, 或者当受支持词汇包含意外但并非无效的内容时, 可以发出验证警告, 但在这些情形中不预期出现错误。

当存在被禁止的词汇, 或者在允许的词汇中遇到语义无效的内容时, 预期会出现验证错误。

7. 符合性

除标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注都是非规范性的。 本规范中的其他所有内容都是规范性的。

本文档中的关键词 MAYMUSTMUST NOTSHOULDSHOULD NOT 在且仅在它们全部以大写形式出现时, 应按 BCP 14 [RFC2119] [RFC8174] 中描述的方式解释, 如这里所示。

[TTML2] 在 配置子系统中指定了一种用于表达文档和处理器要求的形式语言。 本规范的规范性要求使用上述符合性术语定义, 并且也使用此 TTML2 配置文件机制定义。 凡引用 TTML2 词汇时,适用 [TTML2] 中定义的与该词汇相关的语法和语义要求。

虽然并不要求 DAPT 处理器一般性地实现 TTML2 配置文件处理语义, 但实现者可以使用F. 配置文件中定义的 TTML2 配置文件, 作为验证其实现满足 DAPT 规范性要求的一种手段, 例如作为检查清单。

反之,支持 TTML2 配置文件处理语义的通用 [TTML2] 处理器,可以直接使用 F. 配置文件中定义的 TTML2 配置文件, 来确定其是否能够处理DAPT 文档

7.1 DAPT 文档的符合性

符合的DAPT 文档是 符合本规范规范性规定的 [TTML2] 定时文本内容文档 实例。 这些规定使用 [TTML2] 的 配置文件词汇,在 F. 配置文件中定义的 内容配置文件中表达。

DAPT 文档仍然 受 [TTML2] 第 3.1 节中规定的内容符合性要求约束。 特别是,DAPT 文档可以包含 外来词汇, 因为在评估内容符合性之前,此类元素和属性会由 [TTML2] 第 4 节的算法剪除。

7.2 DAPT 处理器的符合性

符合的 DAPT 处理器是 符合本规范规范性规定的 [TTML2] 内容处理器。 这些规定使用 [TTML2] 的 配置文件词汇,在 F. 配置文件中定义的 处理器配置文件中表达。

A. 索引

A.1 本规范定义的术语

A.2 通过引用定义的术语

B. 隐私考虑事项

本节是非规范性的。

除以下内容外,[ttml2] 的隐私考虑事项适用:

B.1 个人信息

DAPT 文档通常包含 相关媒体中出现的角色或人物的名称, 这些人物可以是虚构的,也可以是真实的。 一般而言,此信息会存在于媒体本身中,或通过其他途径公开。 如果其身份包含于其中的 DAPT 文档被可访问这些文档的人知晓 会带来敏感性, 则应通过适当的保密措施管理此类访问。 例如,这些文档可以在封闭的创作环境中可用, 并在分发给更广泛受众之前进行编辑以移除敏感信息。 如果出现这种情形,应在封闭环境中应用良好的信息安全实践, 例如对“静态”文档以及移动过程中的文档进行加密、 通过认证平台控制访问等。

B.2 音频格式偏好

此特性可能有助于浏览器指纹识别。 DAPT 文档可以为同一段音频引用一组 替代的外部音频资源, 其中预期处理器会基于格式支持等特性选择其中一个替代项。 如果使用这种模式,处理器对音频资源的选择 若暴露给源, 就可能泄露有关该处理器的信息,例如其偏好的音频格式。

C. 安全考虑事项

本节是非规范性的。

[ttml2] 的安全考虑事项适用, 因为 DAPT 是 [ttml2] 的配置文件; 每个符合要求的 DAPT 文档都是 TTML 文档实例

尽管有 [ttml2] 中与 XML 相关的考虑事项, 但强制性的 #serialization 扩展特性要求 DAPT 文档 避免声明或引用文档类型声明,并避免使用 [xml] 实体扩展机制。 因此,实现可以通过在解析 DAPT 文档时不支持这些 XML 特性, 防范与这些特性相关的潜在拒绝服务攻击或外部内容注入。

DAPT 文档允许引用 外部音频资源, 也称为“子资源”。 与此类引用相关的一个潜在威胁是, 源可能返回与创作时预期不同的音频资源。 目前未提供用于验证此类子资源完整性的方案。 如果内容提供者无法确保提供适当的音频资源, 例如链条中的某些部分不受其控制, 可以考虑添加子资源完整性元数据, 例如包含预期子资源哈希值的属性, 并实现客户端检查,使用该元数据验证接收到的子资源 是否为预期资源。

E. 音频混音

本节是非规范性的。

本节包含有关音频混音的附加信息, 面向实现者。

E.1 Web Audio

可以使用 [webaudio] 实现混音指令的应用。 2展示了节目音频的流向, 以及当生成音频的元素处于活动状态时, 脚本事件上的声像和增益(如果已设置) 如何被应用, 然后输出被传递给文本, 该文本混入来自任何活动音频录制的音频, 而该音频录制本身也受其自身混音指令约束, 随后在输出被混合到主总线之前, 应用该文本混音指令

(活动) 脚本事件声像增益 (活动) 音频录制声像增益 (活动) 文本声像增益 节目音频 当音频混音处于活动状态 当没有音频混音处于活动状态
2 对象之间简单音频路由的示例

此示例在3中显示为 [webaudio] 节点。

GainNode(脚本事件) PanNode(脚本事件) GainNode(文本) PanNode(文本) GainNode(音频录制) PanNode(音频录制) 隐式混音器 主总线 节目音频 音频录制源音频 输出音频
3 表示所需音频处理的 Web Audio 节点。

上述示例至少在两个方面进行了简化:

E.2 爆音预防

如果音频录制以可听声音开始或结束, 即入点时间处的第一个采样或 出点 时间处的最后一个采样非零, 则音频换能器可能会在播放开始或结束时 被诱发产生不希望的“爆音”噪声。

存在多种可避免这种爆音效应的潜在策略, 例如:

如果使用上述最后一种方法, 并且没有其他外部控制可以控制 呈现处理器在这方面的行为, 则建议 音频录制在开始或结束处也不要包含 一旦被渲染为不可听就会改变含义的采样。 例如,省略像单词 “cat” 开头的 “c” 这样的爆破性 语音声音,会导致该词听起来像 “at”。

F. 配置文件

本节通过针对一组特性扩展表达处置, 定义一个 [TTML2] 内容配置文件 和一个处理器配置文件DAPT 扩展定义于G. 扩展

[TTML2] 中指定的配置文件语义适用。

TTML 配置文件规范是一个文档, 它列出在“文档实例”(文件)和“处理器”(处理这些文件的事物)中 必需 / 可选 / 禁止的所有 TTML 特性, 以及任何扩展或约束。

符合本文所定义内容配置文件定时文本内容文档 实例

根据定义,定时文本内容文档 实例满足 [TTML2] 第 3.1 节的要求, 因而符合本文所定义配置文件的定时文本内容文档 实例也是符合要求的 TTML2 文档实例

符合本规范所定义处理器配置文件呈现处理器

符合本规范所定义处理器配置文件转换处理器

本规范中使用的必需、允许、可选和禁止处置 按如下方式映射到 [TTML2] <ttp:feature><ttp:extension> 元素的 value 属性值:

DAPT 处置 <ttp:feature><ttp:extension> 元素 value 属性值,位于
内容配置文件 处理器配置文件
必需 required required
允许 optional required
可选 optional optional
禁止 prohibited optional

本文档中使用术语呈现处理器转换处理器, 并不意味着本身符合 [TTML2] 中定义的任何标准配置文件。 换句话说, 呈现处理器转换处理器 符合本文档中定义的配置文件, 但并不同时符合 TTML2 呈现配置文件或 TTML2 转换配置文件, 不被认为是错误。

本规范使用 [TTML2] 配置 子系统来描述 DAPT 符合性, 并不意味着要求 DAPT 处理器支持该系统中除 DAPT 明确要求支持的特性之外的任何特性。

本文档未指定呈现处理器转换处理器 在处理或转换不符合要求的定时文本内容文档 实例时的行为。

允许和禁止处置并不是指将 <ttp:feature><ttp:extension> 元素 指定为在 <ttp:profile> 元素内允许或禁止。

F.1 特性和扩展的处置

本节列出的特性扩展表达了对DAPT 文档呈现处理器转换处理器的最低要求。 DAPT 文档可以另外符合其他配置文件, 并包含未被 DAPT 内容配置文件禁止的语法。 呈现处理器转换处理器 可以支持与其他配置文件相关的附加语法和语义。

例如,DAPT 脚本可以包含 [TTML2] 的 IMSC([ttml-imsc1.3])文本配置文件所允许的语法, 以增强向录制音频的演员呈现 脚本的效果, 或添加对后续创建字幕或说明字幕很重要的样式。

编者注

编辑任务:逐一检查此特性列表,并检查每一项的处置情况。 不应存在 IMSC 中允许但在此被禁止的特性。

特性或扩展 处置 附加规定
相对于 TT 特性命名空间
#animate-fill 允许
#animate-minimal 允许
#animation-out-of-line 禁止 4.10 混音 指令
#audio 允许
#audio-description 允许
#audio-speech 允许
#bidi 允许
#bidi-version-2 允许
#chunk 允许
#clockMode 禁止
#clockMode-gps 禁止
#clockMode-local 禁止
#clockMode-utc 禁止
#content 允许
#contentProfiles 允许 5.6.2 ttp:contentProfilesG.3 #contentProfiles-root
#contentProfiles-combined 可选 5.6.5 其他 TTML2 配置文件词汇
#core 允许
#data 允许
#direction 允许
#dropMode 禁止
#dropMode-dropNTSC 禁止
#dropMode-dropPAL 禁止
#dropMode-nonDrop 禁止
#embedded-audio 允许
#embedded-data 允许
#frameRate 允许 5.7.3 ttp:frameRate
#frameRateMultiplier 允许
#gain 允许
#markerMode 禁止
#markerMode-continuous 禁止
#markerMode-discontinuous 禁止
#metadata 允许
#metadata-item 允许
#metadata-version-2 允许
#pan 允许
#permitFeatureNarrowing 可选 5.6.5 其他 TTML2 配置文件词汇
#nested-div 允许 这是4.3 脚本事件中所述允许嵌套 <div> 元素的配置文件表达。
#permitFeatureWidening 可选 5.6.5 其他 TTML2 配置文件词汇
#pitch 允许
#presentation-audio 允许
#processorProfiles 可选 5.6.4 ttp:processorProfiles
#processorProfiles-combined 可选 5.6.5 其他 TTML2 配置文件词汇
#profile 部分允许 5.6.3 ttp:profile
#profile-full-version-2 部分允许 5.6.5 其他 TTML2 配置文件词汇
#profile-version-2 部分允许 5.6.5 其他 TTML2 配置文件词汇
#resources 允许
#set 允许
#set-fill 允许
#set-multiple-styles 允许
#source 允许
#speak 允许
#speech 允许
#structure 必需
#styling 允许
#styling-chained 允许
#styling-inheritance-content 允许
#styling-inline 允许
#styling-referential 允许
#subFrameRate 禁止
#tickRate 允许 5.7.4 ttp:tickRate
#time-clock 允许
#time-clock-with-frames 禁止
#time-offset-with-frames 允许 5.7.3 ttp:frameRate
#time-offset-with-ticks 允许 5.7.4 ttp:tickRate
#time-offset 允许
#time-wall-clock 禁止
#timeBase-clock 禁止
#timeBase-media 必需

5.7.1 ttp:timeBase

注:[TTML1] 指定,如果未在 <tt> 元素上指定 ttp:timeBase 属性,则默认时间基准为 "media"

#timeBase-smpte 禁止
#timeContainer 禁止 5.7.2 timeContainer
#timing 允许 5.7.5 时间表达式
#transformation 允许 #profile 处的约束。
#unicodeBidi 允许
#unicodeBidi-isolate 允许
#unicodeBidi-version-2 允许
#xlink 允许
相对于DAPT 扩展 命名空间
#agent 允许 这是4.2 角色的配置文件表达。
#contentProfiles-root 必需 这是5.6.2 ttp:contentProfiles的配置文件表达。
#daptOriginTimecode 允许 这是D.1 DAPT 原点 时间码的配置文件表达。
#descType 允许 这是daptm:descType的配置文件表达。
#onScreen 允许 这是4.6 屏幕上的配置文件表达。
#profile-root 禁止 这是对 <tt> 元素上的 ttp:profile 属性的禁止的配置文件表达, 如5.6.3 ttp:profile中所规定。
#represents 必需 这是应用于脚本事件表示对象 的配置文件表达。
#scriptEventMapping 可选 这是6.3 处理 <div><p> 元素的配置文件表达。
#scriptRepresents-root 必需 这是脚本表示对象的配置文件表达。
#scriptType-root 必需 这是4.1.3 脚本类型的配置文件表达。
#serialization 必需 这是5.1 文档编码的配置文件表达。
#source-data 禁止 这是对 <data> 元素的 <source> 子元素的禁止的配置文件表达,如 4.9.1 音频 录制中所规定。
#textLanguageSource 允许 这是4.5 文本语言来源的配置文件表达, 如4.4 文本中所要求。
#xmlLang-audio-nonMatching 禁止 这是对 <audio> 元素上的 xml:lang 属性 具有不同于父元素以及后代或引用的 <source><data> 元素的计算值的禁止的配置文件表达, 如4.9.1 音频 录制中所规定。
#xmlLang-root 必需 这是4.1.2 默认语言的配置文件表达。

F.2 DAPT 内容配置文件

DAPT 内容配置文件使用 [TTML2] 的配置文件机制, 表达DAPT 脚本的符合性要求。 支持 DAPT 处理器配置文件的验证处理器 可以使用它来验证DAPT 文档

不要求在DAPT 文档中包含 DAPT 内容配置文件。

<?xml version="1.0" encoding="utf-8"?>
<!-- This file is the TTML Profile Document representing
  the DAPT 1.0 Content Profile defined 
  by DAPT at https://www.w3.org/TR/dapt/ -->
<profile xmlns="http://www.w3.org/ns/ttml#parameter"
  designator="http://www.w3.org/ns/ttml/profile/dapt1.0/content"
  combine="mostRestrictive"
  type="content">
  <features xml:base="http://www.w3.org/ns/ttml/feature/">
    <!-- required (mandatory) feature support -->
    <feature value="required">#structure</feature>
    <feature value="required">#timeBase-media</feature>
    <!-- optional (voluntary) feature support -->
    <feature value="optional">#animate-fill</feature>
    <feature value="optional">#animate-minimal</feature>
    <feature value="optional">#audio</feature>
    <feature value="optional">#audio-description</feature>
    <feature value="optional">#audio-speech</feature>
    <feature value="optional">#bidi</feature>
    <feature value="optional" extends="#bidi">#bidi-version-2</feature>
    <feature value="optional">#chunk</feature>
    <feature value="optional">#content</feature>
    <feature value="optional">#contentProfiles</feature>
    <feature value="optional">#contentProfiles-combined</feature>
    <feature value="optional">#core</feature>
    <feature value="optional">#data</feature>
    <feature value="optional">#direction</feature>
    <feature value="optional">#embedded-audio</feature>
    <feature value="optional">#embedded-data</feature>
    <feature value="optional">#frameRate</feature>
    <feature value="optional">#frameRateMultiplier</feature>
    <feature value="optional">#gain</feature>
    <feature value="optional">#metadata</feature>
    <feature value="optional">#metadata-item</feature>
    <feature value="optional">#nested-div</feature>
    <feature value="optional" extends="#metadata">#metadata-version-2</feature>
    <feature value="optional">#pan</feature>
    <feature value="optional">#permitFeatureNarrowing</feature>
    <feature value="optional">#permitFeatureWidening</feature>
    <feature value="optional">#pitch</feature>
    <feature value="optional">#presentation-audio</feature>
    <feature value="optional">#processorProfiles</feature>
    <feature value="optional">#processorProfiles-combined</feature>
    <feature value="optional">#resources</feature>
    <feature value="optional" extends="#animation">#set</feature>
    <feature value="optional">#set-fill</feature>
    <feature value="optional">#set-multiple-styles</feature>
    <feature value="optional">#source</feature>
    <feature value="optional">#speak</feature>
    <feature value="optional">#speech</feature>
    <feature value="optional">#styling</feature>
    <feature value="optional">#styling-chained</feature>
    <feature value="optional">#styling-inheritance-content</feature>
    <feature value="optional">#styling-inline</feature>
    <feature value="optional">#styling-referential</feature>
    <feature value="optional">#tickRate</feature>
    <feature value="optional">#time-clock</feature>
    <feature value="optional">#time-offset</feature>
    <feature value="optional">#time-offset-with-frames</feature>
    <feature value="optional">#time-offset-with-ticks</feature>
    <feature value="optional">#timing</feature>
    <feature value="optional">#transformation</feature>
    <feature value="optional">#unicodeBidi</feature>
    <feature value="optional">#unicodeBidi-isolate</feature>
    <feature value="optional" extends="#unicodeBidi">#unicodeBidi-version-2</feature>
    <feature value="optional">#xlink</feature>
    <!-- prohibited feature support -->
    <feature value="prohibited">#animation-out-of-line</feature>
    <feature value="prohibited">#clockMode</feature>
    <feature value="prohibited">#clockMode-gps</feature>
    <feature value="prohibited">#clockMode-local</feature>
    <feature value="prohibited">#clockMode-utc</feature>
    <feature value="prohibited">#dropMode</feature>
    <feature value="prohibited">#dropMode-dropNTSC</feature>
    <feature value="prohibited">#dropMode-dropPAL</feature>
    <feature value="prohibited">#dropMode-nonDrop</feature>
    <feature value="prohibited">#markerMode</feature>
    <feature value="prohibited">#markerMode-continuous</feature>
    <feature value="prohibited">#markerMode-discontinuous</feature>
    <feature value="prohibited">#subFrameRate</feature>
    <feature value="prohibited">#time-clock-with-frames</feature>
    <feature value="prohibited">#time-wall-clock</feature>
    <feature value="prohibited">#timeBase-clock</feature>
    <feature value="prohibited">#timeBase-smpte</feature>
    <feature value="prohibited">#timeContainer</feature>
  </features>
  <extensions xml:base="http://www.w3.org/ns/ttml/profile/dapt/extension/">
    <!-- required (mandatory) extension support -->
    <extension value="required">#contentProfiles-root</extension>
    <extension value="required">#represents</extension>
    <extension value="required">#scriptRepresents-root</extension>
    <extension value="required">#scriptType-root</extension>
    <extension value="required">#serialization</extension>
    <extension value="required">#xmlLang-root</extension>
    <!-- optional (voluntary) extension support -->
    <extension value="optional">#agent</extension>
    <extension value="optional">#daptOriginTimecode</extension>
    <extension value="optional">#descType</extension>
    <extension value="optional">#onScreen</extension>
    <extension value="optional">#scriptEventMapping</extension>
    <extension value="optional">#textLanguageSource</extension>
    <!-- prohibited extension support -->
    <extension value="prohibited">#profile-root</extension>
    <extension value="prohibited">#source-data</extension>
    <extension value="prohibited">#xmlLang-audio-nonMatching</extension>
</extensions>
</profile>

F.3 DAPT 处理器配置文件

DAPT 处理器配置文件使用 [TTML2] 的配置文件机制, 表达DAPT 脚本的处理要求。 支持 DAPT 处理器配置文件的必需特性和扩展的处理器, 最低限度可以处理DAPT 文档内所有允许的特性。

不要求在DAPT 文档中包含 DAPT 处理器配置文件。

<?xml version="1.0" encoding="utf-8"?>
<!-- This file is the TTML Profile Document representing
  the DAPT 1.0 Processor Profile defined 
  by DAPT at https://www.w3.org/TR/dapt/ -->
<profile xmlns="http://www.w3.org/ns/ttml#parameter"
  designator="http://www.w3.org/ns/ttml/profile/dapt1.0/processor"
  combine="mostRestrictive"
  type="processor">
  <features xml:base="http://www.w3.org/ns/ttml/feature/">
    <!-- required (mandatory) feature support -->
    <feature value="required">#animate-fill</feature>
    <feature value="required">#animate-minimal</feature>
    <feature value="required">#audio</feature>
    <feature value="required">#audio-description</feature>
    <feature value="required">#audio-speech</feature>
    <feature value="required">#bidi</feature>
    <feature value="required" extends="#bidi">#bidi-version-2</feature>
    <feature value="required">#chunk</feature>
    <feature value="required">#content</feature>
    <feature value="required">#contentProfiles</feature>
    <feature value="required">#core</feature>
    <feature value="required">#data</feature>
    <feature value="required">#direction</feature>
    <feature value="required">#embedded-audio</feature>
    <feature value="required">#embedded-data</feature>
    <feature value="required">#frameRate</feature>
    <feature value="required">#frameRateMultiplier</feature>
    <feature value="required">#gain</feature>
    <feature value="required">#metadata</feature>
    <feature value="required">#metadata-item</feature>
    <feature value="required">#nested-div</feature>
    <feature value="required" extends="#metadata">#metadata-version-2</feature>
    <feature value="required">#pan</feature>
    <feature value="required">#pitch</feature>
    <feature value="required">#presentation-audio</feature>
    <feature value="required">#resources</feature>
    <feature value="required" extends="#animation">#set</feature>
    <feature value="required">#set-fill</feature>
    <feature value="required">#set-multiple-styles</feature>
    <feature value="required">#source</feature>
    <feature value="required">#speak</feature>
    <feature value="required">#speech</feature>
    <feature value="required">#structure</feature>
    <feature value="required">#styling</feature>
    <feature value="required">#styling-chained</feature>
    <feature value="required">#styling-inheritance-content</feature>
    <feature value="required">#styling-inline</feature>
    <feature value="required">#styling-referential</feature>
    <feature value="required">#tickRate</feature>
    <feature value="required">#time-clock</feature>
    <feature value="required">#time-offset</feature>
    <feature value="required">#time-offset-with-frames</feature>
    <feature value="required">#time-offset-with-ticks</feature>
    <feature value="required">#timeBase-media</feature>
    <feature value="required">#timing</feature>
    <feature value="required">#transformation</feature>
    <feature value="required">#unicodeBidi</feature>
    <feature value="required">#unicodeBidi-isolate</feature>
    <feature value="required" extends="#unicodeBidi">#unicodeBidi-version-2</feature>
    <feature value="required">#xlink</feature>
    <!-- optional (voluntary) feature support -->
    <feature value="optional">#animation-out-of-line</feature>
    <feature value="optional">#clockMode</feature>
    <feature value="optional">#clockMode-gps</feature>
    <feature value="optional">#clockMode-local</feature>
    <feature value="optional">#clockMode-utc</feature>
    <feature value="optional">#contentProfiles-combined</feature>
    <feature value="optional">#dropMode</feature>
    <feature value="optional">#dropMode-dropNTSC</feature>
    <feature value="optional">#dropMode-dropPAL</feature>
    <feature value="optional">#dropMode-nonDrop</feature>
    <feature value="optional">#markerMode</feature>
    <feature value="optional">#markerMode-continuous</feature>
    <feature value="optional">#markerMode-discontinuous</feature>
    <feature value="optional">#permitFeatureNarrowing</feature>
    <feature value="optional">#permitFeatureWidening</feature>
    <feature value="optional">#processorProfiles</feature>
    <feature value="optional">#processorProfiles-combined</feature>
    <feature value="optional">#subFrameRate</feature>
    <feature value="optional">#time-clock-with-frames</feature>
    <feature value="optional">#time-wall-clock</feature>
    <feature value="optional">#timeBase-clock</feature>
    <feature value="optional">#timeBase-smpte</feature>
    <feature value="optional">#timeContainer</feature>
  </features>
  <extensions xml:base="http://www.w3.org/ns/ttml/profile/dapt/extension/">
    <!-- required (mandatory) extension support -->
    <extension value="required">#agent</extension>
    <extension value="required">#contentProfiles-root</extension>
    <extension value="required">#daptOriginTimecode</extension>
    <extension value="required">#descType</extension>
    <extension value="required">#onScreen</extension>
    <extension value="required">#represents</extension>
    <extension value="required">#scriptRepresents-root</extension>
    <extension value="required">#scriptType-root</extension>
    <extension value="required">#serialization</extension>
    <extension value="required">#textLanguageSource</extension>
    <extension value="required">#xmlLang-root</extension>
    <!-- optional (voluntary) extension support -->
    <extension value="optional">#profile-root</extension>
    <extension value="optional">#scriptEventMapping</extension>
    <extension value="optional">#source-data</extension>
    <extension value="optional">#xmlLang-audio-nonMatching</extension>
</extensions>
</profile>

G. 扩展

G.1 通用

以下各节定义扩展标识, 表达为相对于 DAPT 扩展命名空间基 URI 的相对 URI(片段标识符)。 这些扩展标识用于F. 配置文件 中,以描述 DAPT 中未由 [TTML2] 配置文件特性表达的规范性规定。

G.2 #agent

如果转换处理器能够识别并转换 <ttm:agent> 元素上以下 元素和属性的值, 则它支持 #agent 扩展:

并且如果它能够识别并转换以下每种值组合:

没有为 #agent 扩展定义任何呈现处理器行为。

G.3 #contentProfiles-root

如果转换处理器能够识别并转换 <tt> 元素上的 ttp:contentProfiles 属性的值,则它支持 #contentProfiles-root 扩展。

如果呈现处理器实现了 <tt> 元素上的 ttp:contentProfiles 属性的呈现语义支持, 则它支持 #contentProfiles-root 扩展。

#contentProfiles-root 扩展是 #contentProfiles 特性的语法和语义子集。

G.4 #daptOriginTimecode

如果转换处理器能够识别并转换 <daptm:daptOriginTimecode> 元素的值, 则它支持 #daptOriginTimecode 扩展。

没有为 #daptOriginTimecode 扩展定义任何呈现处理器行为。

G.5 #descType

如果转换处理器能够识别并转换 <ttm:desc> 元素上的 daptm:descType 属性 的值, 则它支持 #descType 扩展。

没有为 #descType 扩展定义任何呈现处理器行为。

G.6 #onScreen

如果转换处理器能够识别并转换 <div> 元素上的 daptm:onScreen 属性的值, 则它支持 #onScreen 扩展。

没有为 #onScreen 扩展定义任何呈现处理器行为。

G.7 #profile-root

如果转换处理器能够识别并转换 <tt> 元素上的 ttp:profile 属性的值, 则它支持 #profile-root 扩展。

如果呈现处理器实现了 <tt> 元素上的 ttp:profile 属性的 呈现语义支持, 则它支持 #profile-root 扩展。

#profile-root 扩展是 #profile 特性的语法和语义子集。

G.8 #represents

如果转换处理器能够识别并转换 daptm:represents 属性的值, 则它支持 #represents 扩展。

没有为 #represents 扩展定义任何呈现处理器行为。

G.9 #scriptEventMapping

如果转换处理器在将DAPT 文档映射到 DAPT 数据模型的内部表示时, 实现了6.3 处理 <div><p> 元素中指定的处理要求, 则它支持 #scriptEventMapping 扩展。

没有为 #scriptEventMapping 扩展定义任何呈现处理器行为。

对于呈现处理器, 不要求支持 #scriptEventMapping 扩展, 因为不存在要求或依赖于将DAPT 文档映射到 DAPT 数据模型内部表示的呈现语义。执行此类映射的 呈现处理器也可以被视为就此扩展而言的转换处理器

G.10 #scriptRepresents-root

如果转换处理器能够识别并转换 <tt> 元素上的 daptm:scriptRepresents 属性的值, 则它支持 #scriptRepresents-root 扩展。

没有为 #scriptRepresents-root 扩展定义任何呈现处理器行为。

没有为 #scriptRepresents-root 扩展定义任何呈现处理器行为。

G.11 #scriptType-root

如果转换处理器能够识别并转换 <tt> 元素上的 daptm:scriptType 属性的值, 则它支持 #scriptType-root 扩展。

没有为 #scriptType-root 扩展定义任何呈现处理器行为。

G.12 #serialization

相对于 #serialization 扩展有效的序列化文档, 是一个使用 [UNICODE] 中指定的 UTF-8 字符编码进行编码的 XML 1.0 [xml] 文档, 其中不包含字节顺序标记(BOM)、 不包含文档类型声明、 不包含实体 声明,并且 除预定义实体之外, 不包含任何实体 引用

如果转换处理器呈现处理器 能够读取如上定义的序列化文档, 则它支持 #serialization 扩展。

如果写入文档的转换处理器 能够写入如上定义的序列化文档, 则它支持 #serialization 扩展。

G.13 #source-data

如果转换处理器能够识别并转换 作为 <data> 元素子元素的 <source> 元素的值, 则它支持 #source-data 扩展。

如果呈现处理器实现了 作为 <data> 元素子元素的 <source> 元素的 呈现语义支持, 则它支持 #source-data 扩展。

G.14 #textLanguageSource

如果转换处理器能够识别并转换 daptm:langSrc 属性的值, 则它支持 #textLanguageSource 扩展。

没有为 #textLanguageSource 扩展定义任何呈现处理器行为。

G.15 #xmlLang-audio-nonMatching

如果转换处理器能够识别并转换 <audio> 元素上的 xml:lang 属性值, 该值不同于其父元素或任何后代元素或引用的 <source><data> 元素上同一属性的计算值, 这种值称为不匹配值, 则它支持 #xmlLang-audio-nonMatching 扩展。

如果呈现处理器实现了此类不匹配 xml:lang 属性值的呈现语义支持, 则它支持 #xmlLang-audio-nonMatching 扩展。

G.16 #xmlLang-root

如果转换处理器能够识别并转换 <tt> 元素上的 xml:lang 属性值 以及4.1.2 默认语言中指定的附加语义, 则它支持 #xmlLang-root 扩展。

如果呈现处理器实现了 <tt> 元素上的 xml:lang 属性 以及4.1.2 默认语言中指定的附加语义的呈现语义支持, 则它支持 #xmlLang-root 扩展。

H. 注册表章节

H.1 注册表定义

本节指定注册表定义,它由 本文档中定义的注册表表的托管、变更流程和 核心要求组成。

H.1.1 托管

W3C 注册表托管者定时文本工作组TTWG)。 如果 TTWG 无法履行托管者角色, 例如它已关闭, 则替代托管者W3C 团队

H.1.2 变更流程

H.1.2.1 请求变更

对此 W3C 注册表的变更必须使用以下任一选项提出请求(即变更请求):

变更请求必须包含 足够信息,使托管者 能够识别以下全部内容:

变更提议者可以版本控制系统上 开启一个包含拟议变更的拉取请求(或等价请求)。 如果开启了拉取请求,则也必须开启对应的 issue, 并且该拉取请求必须链接到该 issue。

H.1.2.2 变更 请求评估流程

评估变更请求的流程取决于托管者

H.1.2.2.1 托管者是 TTWG

如果托管者TTWG

  • 如果变更提议者没有在版本控制系统上 开启拉取请求, 则评估会暂停,直到一名 TTWG 成员 开启此类拉取请求, 该拉取请求必须表示所请求的变更, 并且必须链接到相关 issue。
  • TTWG 按照其决策政策审查 拉取请求中的提案。
  • 在决策审查期结束时, 如果一名 TTWG 主席宣布存在 批准共识, 则变更请求获得批准。
  • 如果没有批准共识,预期将 进行讨论,并包含 变更请求者。 此讨论的结果可以是以下任一项:
    1. 变更请求被放弃;
    2. 变更请求被修改以进行另一次 审查;
    3. 如果讨论解决了反对意见, 且一名 TTWG 主席宣布 存在批准共识, 则变更请求可以获得批准。

已批准的变更请求通过将其 相关拉取请求合并到版本 控制系统 并发布本文档的更新版本来执行。

H.1.2.2.2 托管者是 W3C 团队

如果托管者W3C 团队, 则团队在根据收到的回复评估 受访者之间是否存在共识之前, 必须就该变更请求征求广泛审查, 并提供至少 4 周的审查期。

团队可以要求在版本控制系统上开启一个拉取请求, 作为审查基础。

如果存在此类共识, 团队必须作出拟议变更。

H.1.3 注册表表约束

本节定义对本文档中定义的注册表表的约束。 每个注册表表由一组 注册表条目组成。 每个注册表表都有一个关联的注册表表定义,位于H.2 注册表表定义中, 其中列出了每个注册表条目中存在的字段

H.1.3.1 注册表条目

每个注册表条目都有一个状态、一个唯一的,并且 在适当情况下还有其他字段,例如任何备注、 描述,或对其他 定义实体的引用。

注册表表定义必须定义 每个注册表条目中要使用的字段

H.1.3.1.1 状态

注册表条目状态字段反映该条目的 成熟度。 允许的值为:

Provisional
Final
Deprecated

不允许其他值。

H.1.3.1.1.1 Provisional

注册表条目如果状态Provisional,则可以被变更或删除。 其状态可以变更为 FinalDeprecated

后来被删除的 Provisional 条目中的注册表条目 可以被重用。

新创建的注册表条目应当具有状态 Provisional

H.1.3.1.1.2 Final

注册表条目如果状态Final,则不得被删除或变更。 其状态可以变更为 Deprecated

Final 条目中的注册表条目不得被重用。

新创建的注册表条目可以具有状态 Final

H.1.3.1.1.3 Deprecated

注册表条目如果状态Deprecated,则不得被删除或变更。 其状态可以变更为 Final, 除非这会导致状态ProvisionalFinal 的条目集合内出现重复

之前为 Provisional 且从未为FinalDeprecated 条目中的注册表条目 可以被重用。

之前为FinalDeprecated 条目中的注册表条目不得被重用。

新创建的注册表条目不得具有状态 Deprecated

H.2 注册表表定义

本节定义注册表表,并定位其注册表条目

H.2.1 daptm:descType 注册表表定义

daptm:descType注册表表 定义了一组可在 daptm:descType 属性中使用的值。

是 “daptm:descType”字段。 “description”字段描述每个值的预期用途。

注册表表注册表条目位于4.8 脚本事件 描述中。

注册表表不得x- 开头,该前缀保留给用户扩展使用。

H.2.2 <content-descriptor> 注册表表定义

<content-descriptor>注册表表 定义了一组可在 daptm:represents 属性中使用的值。

是 “<content-descriptor>”字段。 “Description”字段描述每个值所表示的媒体内容类型。 “Example usage”字段描述通常可找到所描述内容类型的脚本类型。

注册表表注册表条目位于4.1.6.2 <content-descriptor>中。

注册表表不得x- 开头,该前缀保留给用户扩展使用。

I. 与其他基于 TTML 的规范的兼容性

本节是非规范性的。

I.1 概述

本规范旨在与 [ttml-imsc1.3] 以及 [ttml2] 的其他配置文件兼容。 具体而言,通过选择本规范中定义的特性和 扩展的一个子集, 可以创建一个符合 [ttml-imsc1.3], 并且也是DAPT 文档的文档。

I.2 IMSC 文本配置文件

一个DAPT 文档也可以是 IMSC 文本配置文件 文档,方法是同时满足二者的符合性要求。

DAPT #serialization 特性 实际上是 IMSC 文档编码 约束的超集,因此符合要求的DAPT 文档满足 IMSC 的 编码约束。

IMSC 文本配置文件和 DAPT 都允许 其他配置文件定义的词汇 (例如元数据)出现在文档实例中, 因此 IMSC 中定义的词汇可以用于 DAPT 文档中,尽管并非旨在 同时处理两个配置文件的处理器可能会剪除出现在 metadata 元素之外的 无法识别的词汇

IMSC 对 #resources 施加约束, 禁止在文档实例中嵌入音频。 因此,使用此特性的DAPT 文档 不能成为符合要求的 IMSC 文本配置文件文档。

I.2.1 标示对 IMSC 的符合性

同时符合本规范和 [ttml-imsc1.3] 的文档通过在 ttp:contentProfiles 属性中 同时包含DAPT 1.0 内容配置文件IMSC 文本配置文件的指示符, 以及该文档符合的任何其他配置文件的指示符, 来标示其对二者的符合性。

I.2.2 在字幕和说明字幕工作流中使用 DAPT 元数据

DAPT 转录阶段 以及可选翻译阶段开始的字幕和说明字幕创作工作流, 可以使用 DAPT 元数据来指导 IMSC 文本配置文件文档的制作或呈现。 例如:

  • 说话者(角色)数据可用于应用样式或插入 表示说话者变化的内容, 例如在文本前加上常用的说话者变化符号, 或说话者的名称。
  • 表示数据(即 描述 相关视频对象中 文本内容表示什么内容的元数据)可用于 过滤或选择文本内容的子集,例如 包含或排除非对话声音说明字幕。
  • 语言和文本语言来源元数据可用于 生成翻译字幕文档,方法是选择已翻译为所需语言的文本
  • 语言和文本语言来源元数据可用于 识别属于翻译的字幕,既可将其标记为 强制内容,也可在适当时 触发对已翻译字幕进行文本转语音, 以满足用户偏好,这种做法称为 “口述字幕”。

J. 致谢

编辑感谢定时文本工作组的现任和前任成员、 其他 W3C 工作组的成员、 音频描述社区组的成员, 以及其他论坛中直接或间接为本文档的流程或内容作出贡献的行业专家。

编辑特别感谢以下成员的贡献: Glenn Adams,Skynav; Pierre-Anthony Lemieux,MovieLabs; Hewson Maxwell,Ericsson; Chris Needham,British Broadcasting Corporation; Atsushi Shimono,W3C; Matt Simpson,受邀专家; Andreas Tai,受邀专家。

K. 参考文献

K.1 规范性引用

[BCP47]
用于标识语言的标签。 A. Phillips,编;M. Davis,编。IETF。2009 年 9 月。最佳当前实践。URL:https://www.rfc-editor.org/info/rfc5646/
[EBU-R37]
EBU Recommendation R37-2007。电视信号中声音和视觉分量的相对 定时。EBU/UER。 2007 年 2 月。URL:https://tech.ebu.ch/publications/r037
[EBU-TT-3390]
EBU-TT Part M,元数据 定义。EBU/UER。2017 年 5 月。URL:https://tech.ebu.ch/publications/tech3390
[MIME-TYPES]
多用途互联网邮件扩展 (MIME)第二部分:媒体类型。N. Freed;N. Borenstein。IETF。1996 年 11 月。草案 标准。URL:https://www.rfc-editor.org/info/rfc2046/
[namespaceState]
XML 命名空间中名称的处置。Norman Walsh。W3C。2006 年 3 月 29 日。W3C 工作草案。URL:https://www.w3.org/TR/namespaceState/
[RFC2119]
RFC 中用于指示 要求级别的关键词。S. Bradner。IETF。1997 年 3 月。最佳当前实践。URL:https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119 关键词中大写与小写的歧义。B. Leiba。IETF。2017 年 5 月。最佳当前实践。URL:https://www.rfc-editor.org/info/rfc8174/
[ttml-imsc1.3]
IMSC Text Profile 1.3。Pierre-Anthony Lemieux。W3C。2026 年 5 月 21 日。W3C 推荐标准。URL:https://www.w3.org/TR/ttml-imsc1.3/
[TTML1]
Timed Text Markup Language 1(TTML1)(第三 版)。Glenn Adams;Pierre-Anthony Lemieux。W3C。2018 年 11 月 8 日。W3C 推荐标准。URL:https://www.w3.org/TR/ttml1/
[TTML2]
Timed Text Markup Language 2(TTML2) (第二版)。W3C。2021-03-09。URL:https://www.w3.org/TR/2021/CR-ttml2-20210309
[UNICODE]
Unicode 标准。Unicode Consortium。URL:https://www.unicode.org/versions/latest/
[w3c-process]
W3C 流程文档。Elika J. Etemad(fantasai);Florian Rivoal。W3C。2025 年 8 月 18 日。URL:https://www.w3.org/policies/process/
[XML]
可扩展标记语言(XML)1.0(第五 版)。Tim Bray;Jean Paoli;Michael Sperberg-McQueen;Eve Maler;François Yergeau 等。W3C。2008 年 11 月 26 日。W3C 推荐标准。URL:https://www.w3.org/TR/xml/
[xml-names]
XML 1.0 中的命名空间(第三版)。 Tim Bray;Dave Hollander;Andrew Layman;Richard Tobin;Henry Thompson 等。W3C。2009 年 12 月 8 日。 W3C 推荐标准。URL:https://www.w3.org/TR/xml-names/
[xmlschema-2]
XML Schema 第二部分:数据类型第二 版。Paul V. Biron;Ashok Malhotra。W3C。2004 年 10 月 28 日。W3C 推荐标准。 URL:https://www.w3.org/TR/xmlschema-2/
[XPath]
XML 路径语言(XPath)Version 1.0。 James Clark;Steven DeRose。W3C。1999 年 11 月 16 日。W3C 推荐标准。URL:https://www.w3.org/TR/xpath-10/

K.2 资料性引用

[BBC-WHP051]
BBC R&D 白皮书 WHP 051。 音频描述:它是什么以及它如何工作。N.E. Tanton、T. Ware 和 M. Armstrong。2002 年 10 月(2004 年 7 月修订)。URL:https://www.bbc.co.uk/rd/publications/whitepaper051
[DAPT-REQS]
DAPT 要求。Cyril Concolato; Nigel Megitt。W3C。2025 年 5 月 12 日。W3C 工作组说明。URL:https://www.w3.org/TR/dapt-reqs/
[I18N-INLINE-BIDI]
HTML 中的内联标记和 双向文本。W3C。2021-06-25。URL:https://www.w3.org/International/articles/inline-bidi-markup
[media-accessibility-reqs]
媒体可访问性用户 要求。Shane McCarron;Michael Cooper;Mark Sadecki。W3C。2015 年 12 月 3 日。 W3C 工作组说明。URL:https://www.w3.org/TR/media-accessibility-reqs/
[SSML]
语音合成标记语言(SSML) Version 1.1。Daniel Burnett;Zhi Wei Shuang。W3C。2010 年 9 月 7 日。W3C 推荐标准。URL:https://www.w3.org/TR/speech-synthesis11/
[uml]
OMG 统一建模语言。Open Management Group。OMG。2015 年 3 月 1 日。规范性。URL:http://www.omg.org/spec/UML/
[WCAG22]
Web 内容可访问性指南(WCAG) 2.2。Michael Cooper;Andrew Kirkpatrick;Alastair Campbell;Rachael Bradley Montgomery;Charles Adams。W3C。2024 年 12 月 12 日。W3C 推荐标准。URL:https://www.w3.org/TR/WCAG22/
[webaudio]
Web Audio API 1.1。Paul Adenot; Hongchan Choi。W3C。2024 年 11 月 5 日。FPWD。URL:https://www.w3.org/TR/webaudio-1.1/
[xml-id]
xml:id Version 1.0。Jonathan Marsh;Daniel Veillard;Norman Walsh。W3C。2005 年 9 月 9 日。W3C 推荐标准。URL:https://www.w3.org/TR/xml-id/