如何用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
相关产品推荐
相关产品推荐

