广阔天地大有作为

你想拥有什么,就去追求什么

17 Mar 2024

2024-03-17 第十一周:如何获取 podcast 文本内容

IMG_0203.jpg

流水账

阅读

茶馆

自由与爱之地

Linux内核观测技术

我是谁?

如何获取 podcast 文本内容

听了一段时间 podcast ,但除了初级到中级难度的英语教学那些能听懂个七七八八,其他的播客的基本上只能 10 % 以下,于是打算把字幕下载下来先看一遍,先搞懂大概意思和生词,再多听几遍。但 podcast 都没有字幕,网上虽然说有浏览器插件可以做到,但我并没有太多时间坐在电脑前去听。我的诉求是有文本的 PDF ,可以在通勤的时候先读一遍,把生词查好,再利用其他时间去听。 目前没有找到什么好办法。 自己折腾了一个土办法,我主要听的几个都同步有 youtube,从 youtube 下载字幕,再整理出 PDF。

利用 yt-dlp 下载字幕

yt-dlp --write-auto-subs --sub-lang en --skip-download https://youtu.be/48ypNTal_NI\?si\=auRa7HlS9t9yuoHp

字幕转换成 PDF

原理很简单,默认下下来的字幕格式是 vtt,从内容可以看到

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
WEBVTT
Kind: captions
Language: en

00:00:00.080 --> 00:00:01.829 align:start position:0%
 
hello<00:00:00.359><c> welcome</c><00:00:00.640><c> back</c><00:00:00.799><c> to</c><00:00:01.040><c> Luke's</c><00:00:01.400><c> English</c>

00:00:01.829 --> 00:00:01.839 align:start position:0%
hello welcome back to Luke's English
 

00:00:01.839 --> 00:00:04.110 align:start position:0%
hello welcome back to Luke's English
podcast<00:00:02.360><c> in</c><00:00:02.520><c> this</c><00:00:02.720><c> episode</c><00:00:03.560><c> I'm</c><00:00:03.719><c> going</c><00:00:03.879><c> to</c>

代码逻辑很简单,这两行内容是我不需要的,通过正则过滤匹配这两类规则的内容即可。最后输出 PDF 文件。 以下是代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// pdf package "github.com/jung-kurt/gofpdf"

func extractSubtitles(sourceFile, destinationFile string) error {  
   // 打开源文件进行读取  
   source, err := os.Open(sourceFile)  
   if err != nil {  
      return err  
   }  
   defer source.Close()  
  
   // 创建 PDF 文档  
   pdf := gofpdf.New("P", "mm", "A4", "")  
   pdf.AddPage()  
  
   // 设置字体样式  
   pdf.SetFont("Arial", "", 12)  
  
   // 创建源文件的读取器  
   scanner := bufio.NewScanner(source)  
  
   // 正则表达式匹配时间轴和样式标签  
   timeLinePattern := regexp.MustCompile(`\d{2}:\d{2}:\d{2}\.\d{3}\s*-->\s*\d{2}:\d{2}:\d{2}\.\d{3}`)  
   styleTagPattern := regexp.MustCompile(`<[^>]+>`)  
   lastLine := ""  
   for scanner.Scan() {  
      line := scanner.Text()  
  
      // 检查当前行是否为时间轴或样式标签  
      if timeLinePattern.MatchString(line) || styleTagPattern.MatchString(line) {  
         continue // 跳过时间轴和样式标签  
      }  
  
      // 去除行首和行尾的空格  
      line = strings.TrimSpace(line)  
  
      // 如果行不为空,则将文本添加到 PDF   
      // 字幕里面同一个句子会出现两次  
      if line != "" && line != lastLine {  
         lastLine = line  
         pdf.MultiCell(0, 10, line, "", "", false)  
      }  
   }  
  
   if err := scanner.Err(); err != nil {  
      return err  
   }  
  
   // 保存 PDF 文件  
   err = pdf.OutputFileAndClose(destinationFile)  
   if err != nil {  
      return err  
   }  
  
   return nil  
}

最终生成的 pdf 如图,难看了点,但也能凑合看。 Pasted image 20240312174518.png