2023年4月12日 星期三

OpenAI Whisper : highlight_words 逐字標底線的字幕

2023年4月12日 星期三

之前將 OpenAI Whisper 的安裝程序與使用簡單地寫 Colab 的筆記本中,方便有需要將影音檔案或 YouTube 影片轉為字幕檔或是逐字稿,工具網址及說明可以參考這一篇舊文:

二月啟用後,除了三月有再加強推出可以批次轉換的第二版,使用上都滿順的;今天一早看到在 YouTube 中有人留言說不能用,到 OpenAI Whisper 的專案研究了原始碼,看起來昨天有一個更新,可以逐字加上時間截記,這樣一來,字幕可以逐字加上 highlight (目前是加底線);但也因為這個功能,它把呼叫 Whisper 的參數新增了一個之前沒有的 dictionary 型態參數 options,然後我原來運作得好好的程式就卡住不能用了。

找到問題,把少的參數補上後,更新過的工具又可以正常使用了。所以如果之前曾經建立過副本使用的,記得要參考這篇舊文「雄:使用 OpenAI Whisper 製作影音的字幕或逐字稿」,重新開啟更新過的筆記本,並建立自己的副本,才能正常運作。

哈!那 Whisper 專案中新加的實驗功能是什麼呢?(備註:此功能選項並沒有加入「雄:使用 OpenAI Whisper 製作影音的字幕或逐字稿」的工具中。)

如果用 Whisper 的命令列模式,可以執行這道指令查看參數

whisper --help

其中有這幾個參數可以應用在字幕逐字加時間戳記的功能上:

  • --word_timestamps
  • --highlight_words
  • --max_line_count
  • --max_line_width

使用時要注意的是它們彼此間是有相依性的。

我錄了一小段語音,然後啟用了 Whisper 的「word_timestamps」和「highlight_words」選項,語音辨識後,輸出成 .srt 字幕檔,最後將語音及字幕合成了底下的影片,可以觀察一下「逐字標底線的字幕」效果如何。

字幕逐字標底線的影片

字幕檔內容的比較

前面影片的語音,如果是一般模式的字幕檔大概是這樣的內容:

1
00:00:00,000 --> 00:00:04,000
有人反映OpenAI的Whisper不能使用

2
00:00:04,000 --> 00:00:06,500
查過Whisper的專案以後

3
00:00:06,500 --> 00:00:09,000
發現他新增了一個功能

4
00:00:09,000 --> 00:00:12,000
當我們使用字幕格式輸出時

5
00:00:12,000 --> 00:00:16,000
他可以將每個字加上時間戳記

6
00:00:16,000 --> 00:00:18,000
影片在播放時

7
00:00:18,000 --> 00:00:19,000
講到哪個字

8
00:00:19,000 --> 00:00:22,000
那個字就會加上底線

9
00:00:22,000 --> 00:00:24,000
現在這支影片的字幕

10
00:00:24,000 --> 00:00:28,500
就是使用Whisper逐字加時間戳記的功能

11
00:00:28,500 --> 00:00:33,000
並且幫字幕的每個字加上底線標示

12
00:00:33,000 --> 00:00:36,500
以上是Whisper新功能的介紹

原來由 Whisper 語音辨識完,只有12句的字幕,如果開啟逐字標時間戳記,會變成這樣多行,可以觀察有加上 <u>...</u> 底線 tag 的位置變化:

1
00:00:00,380 --> 00:00:00,900
<u>有人</u>反映OpenAI的Whisper不能使用

2
00:00:00,900 --> 00:00:01,300
有人<u>反</u>映OpenAI的Whisper不能使用

3
00:00:01,300 --> 00:00:01,500
有人反<u>映</u>OpenAI的Whisper不能使用

4
00:00:01,500 --> 00:00:01,860
有人反映<u>Open</u>AI的Whisper不能使用

5
00:00:01,860 --> 00:00:02,200
有人反映Open<u>AI</u>的Whisper不能使用

6
00:00:02,200 --> 00:00:02,460
有人反映OpenAI<u>的</u>Whisper不能使用

7
00:00:02,460 --> 00:00:02,600
有人反映OpenAI的<u>Wh</u>isper不能使用

8
00:00:02,600 --> 00:00:02,680
有人反映OpenAI的Wh<u>is</u>per不能使用

9
00:00:02,680 --> 00:00:02,860
有人反映OpenAI的Whis<u>per</u>不能使用

10
00:00:02,860 --> 00:00:03,120
有人反映OpenAI的Whisper<u>不能</u>使用

11
00:00:03,120 --> 00:00:03,480
有人反映OpenAI的Whisper不能<u>使</u>用

12
00:00:03,480 --> 00:00:03,740
有人反映OpenAI的Whisper不能使<u>用</u>

13
00:00:03,740 --> 00:00:04,620
<u>查</u>過Whisper的專案以後

14
00:00:04,620 --> 00:00:04,840
查<u>過</u>Whisper的專案以後

15
00:00:04,840 --> 00:00:05,060
查過<u>Wh</u>isper的專案以後

16
00:00:05,060 --> 00:00:05,120
查過Wh<u>is</u>per的專案以後

17
00:00:05,120 --> 00:00:05,320
查過Whis<u>per</u>的專案以後

18
00:00:05,320 --> 00:00:05,440
查過Whisper<u>的</u>專案以後

19
00:00:05,440 --> 00:00:05,660
查過Whisper的<u>專</u>案以後

20
00:00:05,660 --> 00:00:05,840
查過Whisper的專<u>案</u>以後

21
00:00:05,840 --> 00:00:06,080
查過Whisper的專案<u>以</u>後

22
00:00:06,080 --> 00:00:06,300
查過Whisper的專案以<u>後</u>

23
00:00:06,300 --> 00:00:06,880
<u>發現</u>他新增了一個功能

24
00:00:06,880 --> 00:00:07,180
發現<u>他</u>新增了一個功能

25
00:00:07,180 --> 00:00:07,460
發現他<u>新</u>增了一個功能

26
00:00:07,460 --> 00:00:07,620
發現他新<u>增</u>了一個功能

27
00:00:07,620 --> 00:00:07,740
發現他新增<u>了</u>一個功能

28
00:00:07,740 --> 00:00:07,920
發現他新增了<u>一個</u>功能

29
00:00:07,920 --> 00:00:08,180
發現他新增了一個<u>功</u>能

30
00:00:08,180 --> 00:00:08,420
發現他新增了一個功<u>能</u>

31
00:00:08,420 --> 00:00:09,360
<u>當</u>我們使用字幕格式輸出時

32
00:00:09,360 --> 00:00:09,660
當<u>我們</u>使用字幕格式輸出時

33
00:00:09,660 --> 00:00:09,920
當我們<u>使</u>用字幕格式輸出時

34
00:00:09,920 --> 00:00:10,160
當我們使<u>用</u>字幕格式輸出時

35
00:00:10,160 --> 00:00:10,420
當我們使用<u>字</u>幕格式輸出時

36
00:00:10,420 --> 00:00:10,540
當我們使用字<u>幕</u>格式輸出時

37
00:00:10,540 --> 00:00:10,780
當我們使用字幕<u>格</u>式輸出時

38
00:00:10,780 --> 00:00:10,920
當我們使用字幕格<u>式</u>輸出時

39
00:00:10,920 --> 00:00:11,180
當我們使用字幕格式<u>輸</u>出時

40
00:00:11,180 --> 00:00:11,420
當我們使用字幕格式輸<u>出</u>時

41
00:00:11,420 --> 00:00:11,800
當我們使用字幕格式輸出<u>時</u>

42
00:00:11,800 --> 00:00:12,600
<u>他</u>可以將每個字加上時間戳記

43
00:00:12,600 --> 00:00:12,900
他<u>可以</u>將每個字加上時間戳記

44
00:00:12,900 --> 00:00:13,360
他可以<u>將</u>每個字加上時間戳記

45
00:00:13,360 --> 00:00:13,640
他可以將<u>每</u>個字加上時間戳記

46
00:00:13,640 --> 00:00:13,760
他可以將每<u>個</u>字加上時間戳記

47
00:00:13,760 --> 00:00:13,960
他可以將每個<u>字</u>加上時間戳記

48
00:00:13,960 --> 00:00:14,260
他可以將每個字<u>加</u>上時間戳記

49
00:00:14,260 --> 00:00:14,460
他可以將每個字加<u>上</u>時間戳記

50
00:00:14,460 --> 00:00:14,880
他可以將每個字加上<u>時間</u>戳記

51
00:00:14,880 --> 00:00:15,200
他可以將每個字加上時間<u>戳</u>記

52
00:00:15,200 --> 00:00:15,420
他可以將每個字加上時間戳<u>記</u>

53
00:00:15,420 --> 00:00:16,360
<u>影片</u>在播放時,講到哪個字

54
00:00:16,360 --> 00:00:16,640
影片<u>在</u>播放時,講到哪個字

55
00:00:16,640 --> 00:00:16,860
影片在<u>播</u>放時,講到哪個字

56
00:00:16,860 --> 00:00:17,140
影片在播<u>放</u>時,講到哪個字

57
00:00:17,140 --> 00:00:17,540
影片在播放<u>時,</u>講到哪個字

58
00:00:17,540 --> 00:00:18,080
影片在播放時,講到哪個字

59
00:00:18,080 --> 00:00:18,160
影片在播放時,<u>講</u>到哪個字

60
00:00:18,160 --> 00:00:18,360
影片在播放時,講<u>到</u>哪個字

61
00:00:18,360 --> 00:00:18,520
影片在播放時,講到<u>哪</u>個字

62
00:00:18,520 --> 00:00:18,660
影片在播放時,講到哪<u>個</u>字

63
00:00:18,660 --> 00:00:18,900
影片在播放時,講到哪個<u>字</u>

64
00:00:18,900 --> 00:00:19,620
<u>那個</u>字就會加上底線

65
00:00:19,620 --> 00:00:19,800
那個<u>字</u>就會加上底線

66
00:00:19,800 --> 00:00:20,100
那個字<u>就會</u>加上底線

67
00:00:20,100 --> 00:00:20,480
那個字就會<u>加</u>上底線

68
00:00:20,480 --> 00:00:20,680
那個字就會加<u>上</u>底線

69
00:00:20,680 --> 00:00:20,940
那個字就會加上<u>底</u>線

70
00:00:20,940 --> 00:00:21,180
那個字就會加上底<u>線</u>

71
00:00:21,180 --> 00:00:22,580
<u>現在</u>這支影片的字幕

72
00:00:22,580 --> 00:00:22,820
現在<u>這</u>支影片的字幕

73
00:00:22,820 --> 00:00:22,980
現在這<u>支</u>影片的字幕

74
00:00:22,980 --> 00:00:23,360
現在這支<u>影片</u>的字幕

75
00:00:23,360 --> 00:00:23,640
現在這支影片<u>的</u>字幕

76
00:00:23,640 --> 00:00:23,840
現在這支影片的<u>字</u>幕

77
00:00:23,840 --> 00:00:23,980
現在這支影片的字<u>幕</u>

78
00:00:23,980 --> 00:00:24,300
<u>就是</u>使用Whisper逐字加時間戳記的功能

79
00:00:24,300 --> 00:00:24,640
就是<u>使</u>用Whisper逐字加時間戳記的功能

80
00:00:24,640 --> 00:00:24,900
就是使<u>用</u>Whisper逐字加時間戳記的功能

81
00:00:24,900 --> 00:00:25,180
就是使用<u>Wh</u>isper逐字加時間戳記的功能

82
00:00:25,180 --> 00:00:25,320
就是使用Wh<u>is</u>per逐字加時間戳記的功能

83
00:00:25,320 --> 00:00:25,660
就是使用Whis<u>per</u>逐字加時間戳記的功能

84
00:00:25,660 --> 00:00:26,020
就是使用Whisper<u>逐</u>字加時間戳記的功能

85
00:00:26,020 --> 00:00:26,260
就是使用Whisper逐<u>字</u>加時間戳記的功能

86
00:00:26,260 --> 00:00:26,560
就是使用Whisper逐字<u>加</u>時間戳記的功能

87
00:00:26,560 --> 00:00:26,960
就是使用Whisper逐字加<u>時間</u>戳記的功能

88
00:00:26,960 --> 00:00:27,280
就是使用Whisper逐字加時間<u>戳</u>記的功能

89
00:00:27,280 --> 00:00:27,440
就是使用Whisper逐字加時間戳<u>記</u>的功能

90
00:00:27,440 --> 00:00:27,600
就是使用Whisper逐字加時間戳記<u>的</u>功能

91
00:00:27,600 --> 00:00:27,860
就是使用Whisper逐字加時間戳記的<u>功</u>能

92
00:00:27,860 --> 00:00:28,260
就是使用Whisper逐字加時間戳記的功<u>能</u>

93
00:00:28,320 --> 00:00:28,860
<u>並</u>且幫字幕的每個字加上底線標示

94
00:00:28,860 --> 00:00:29,020
並<u>且</u>幫字幕的每個字加上底線標示

95
00:00:29,020 --> 00:00:29,280
並且<u>幫</u>字幕的每個字加上底線標示

96
00:00:29,280 --> 00:00:29,520
並且幫<u>字</u>幕的每個字加上底線標示

97
00:00:29,520 --> 00:00:29,720
並且幫字<u>幕</u>的每個字加上底線標示

98
00:00:29,720 --> 00:00:29,960
並且幫字幕<u>的</u>每個字加上底線標示

99
00:00:29,960 --> 00:00:30,260
並且幫字幕的<u>每</u>個字加上底線標示

100
00:00:30,260 --> 00:00:30,440
並且幫字幕的每<u>個</u>字加上底線標示

101
00:00:30,440 --> 00:00:30,720
並且幫字幕的每個<u>字</u>加上底線標示

102
00:00:30,720 --> 00:00:31,080
並且幫字幕的每個字<u>加</u>上底線標示

103
00:00:31,080 --> 00:00:31,300
並且幫字幕的每個字加<u>上</u>底線標示

104
00:00:31,300 --> 00:00:31,620
並且幫字幕的每個字加上<u>底</u>線標示

105
00:00:31,620 --> 00:00:31,900
並且幫字幕的每個字加上底<u>線</u>標示

106
00:00:31,900 --> 00:00:32,240
並且幫字幕的每個字加上底線<u>標</u>示

107
00:00:32,240 --> 00:00:32,600
並且幫字幕的每個字加上底線標<u>示</u>

108
00:00:32,600 --> 00:00:33,460
<u>以上</u>是Whisper新功能的介紹

109
00:00:33,460 --> 00:00:34,000
以上<u>是</u>Whisper新功能的介紹

110
00:00:34,000 --> 00:00:34,400
以上是<u>Wh</u>isper新功能的介紹

111
00:00:34,400 --> 00:00:34,540
以上是Wh<u>is</u>per新功能的介紹

112
00:00:34,540 --> 00:00:34,780
以上是Whis<u>per</u>新功能的介紹

113
00:00:34,780 --> 00:00:35,120
以上是Whisper<u>新</u>功能的介紹

114
00:00:35,120 --> 00:00:35,340
以上是Whisper新<u>功</u>能的介紹

115
00:00:35,340 --> 00:00:35,500
以上是Whisper新功<u>能</u>的介紹

116
00:00:35,500 --> 00:00:35,660
以上是Whisper新功能<u>的</u>介紹

117
00:00:35,660 --> 00:00:35,940
以上是Whisper新功能的<u>介</u>紹

118
00:00:35,940 --> 00:00:36,160
以上是Whisper新功能的介<u>紹</u>

有加上 <u>...</u> 底線 tag 的,就是該時間點,語音說到的字眼。不過字幕加底線這個功能,在 YouTube 中。似乎沒有作用,反而原形畢露;另外,如果語音辨識結果是要輸出成逐字稿,應該也不適合使用「--word_timestamps」。

有了這樣因為改版而造成 Whisper 無法使用的經驗,我應該要來想想怎樣修改安裝程序,讓它不會老是受到專案異動的影響。

相關連結

6 則留言:

  1. 使用錯誤像這樣,想請問如何修改 :TypeError Traceback (most recent call last)
    in ()
    375 else :
    376 #直接辨識 url 指定的網址或是檔案
    --> 377 title = getAudioAndTranscribe(url)
    378
    379

    2 frames
    in saveToFile(result, output_path, filename, fileType)
    212 # save SRT(full filename : output_path/filename.fileType)
    213 file_writer = get_writer(fileType, output_path) #whisper get_writer
    --> 214 file_writer(result, filename)
    215
    216 #

    TypeError: __call__() missing 1 required positional argument: 'options'

    回覆刪除
  2. 我是將檔案放在GOOGLE雲端硬碟上的.將檔案放在colab資料夾下面也一樣錯誤.謝謝您

    回覆刪除
  3. 可以了 謝謝您辛苦的修改

    回覆刪除
    回覆
    1. 有任何問題的話,歡迎再反應 ^_^

      刪除
  4. 回覆
    1. 哈哈哈~ 是,等心血來潮,再將選項弄完整一點,現在其實少滿多的。

      刪除

 
雄::gsyan © 2009. Design by Pocket