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

如何用R将Adobe Premiere XML转换为Praat双层TextGrid?

用R实现Adobe Premiere XML转Praat双层TextGrid

直接解析XML生成TextGrid(优先方案)

步骤1:安装依赖包

需要用到xml2解析XML,rPraat生成TextGrid:

install.packages(c("xml2", "rPraat"))

步骤2:解析Premiere的XML转录文件

Premiere导出的转录XML多为FCPXML格式,核心节点包含说话人、时间戳和文本内容。假设XML中每个转录片段是<transcript-item>节点,包含speaker属性,以及start/end时间(单位:秒)和<text>子节点:

library(xml2)
library(rPraat)

# 读取XML文件
xml_doc <- read_xml("premiere_transcript.xml")

# 提取转录数据
transcript_data <- xml_find_all(xml_doc, "//transcript-item") |>
  tibble::tibble() |>
  dplyr::mutate(
    speaker = xml_attr(., "speaker"),
    start = as.numeric(xml_attr(., "start")),
    end = as.numeric(xml_attr(., "end")),
    text = xml_text(xml_find_first(., "./text"))
  )

步骤3:生成双层TextGrid

按说话人拆分数据,分别创建两个IntervalTier,再合并成完整TextGrid:

# 拆分两个说话人的数据
speaker1_data <- dplyr::filter(transcript_data, speaker == "Speaker 1")
speaker2_data <- dplyr::filter(transcript_data, speaker == "Speaker 2")

# 创建第一个说话人的Tier
tier1 <- rPraat::tier.new(
  type = "IntervalTier",
  name = "Speaker 1",
  xmin = 0,
  xmax = max(transcript_data$end),
  intervals = data.frame(
    xmin = speaker1_data$start,
    xmax = speaker1_data$end,
    text = speaker1_data$text
  )
)

# 创建第二个说话人的Tier
tier2 <- rPraat::tier.new(
  type = "IntervalTier",
  name = "Speaker 2",
  xmin = 0,
  xmax = max(transcript_data$end),
  intervals = data.frame(
    xmin = speaker2_data$start,
    xmax = speaker2_data$end,
    text = speaker2_data$text
  )
)

# 合并为TextGrid并保存
tg <- rPraat::tg.new(list(tier1, tier2), xmin = 0, xmax = max(transcript_data$end))
rPraat::tg.write(tg, "output_textgrid.TextGrid", format = "short")

注意:如果你的XML节点结构和示例不同,需要调整xml_find_all的XPath表达式,匹配实际的转录节点、属性和文本位置。

中转格式方案

如果直接解析XML遇到结构不兼容问题,可以通过SRT字幕文件中转:

步骤1:XML转SRT

用R的xml2和stringr生成标准SRT格式:

# 从转录数据生成SRT内容
srt_lines <- purrr::pmap_chr(transcript_data, function(speaker, start, end, text, ...) {
  # 将秒转换为SRT的HH:MM:SS,mmm格式
  format_time <- function(sec) {
    sprintf("%02d:%02d:%02d,%03d",
            floor(sec / 3600),
            floor((sec %% 3600) / 60),
            floor(sec %% 60),
            round((sec %% 1) * 1000))
  }
  paste0(
    which(transcript_data$speaker == speaker & transcript_data$start == start), "\n",
    format_time(start), " --> ", format_time(end), "\n",
    paste0(speaker, ": ", text), "\n\n"
  )
})

# 写入SRT文件
writeLines(srt_lines, "transcript.srt")

步骤2:SRT转TextGrid

读取SRT并拆分说话人到不同Tier:

# 读取SRT生成初始TextGrid
srt_tg <- rPraat::tg.read.srt("transcript.srt", tierName = "Combined")

# 提取每个片段的说话人标签
speaker_labels <- stringr::str_extract(srt_tg$`Combined`$text, "^.*:") |>
  stringr::str_remove(":")

# 拆分两个说话人的区间数据
speaker1_intervals <- dplyr::filter(srt_tg$`Combined`, speaker_labels == "Speaker 1")
speaker2_intervals <- dplyr::filter(srt_tg$`Combined`, speaker_labels == "Speaker 2")

# 重新生成双层TextGrid,步骤同直接解析方案

内容的提问来源于stack exchange,提问作者Aimee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:15:09