之前將 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 無法使用的經驗,我應該要來想想怎樣修改安裝程序,讓它不會老是受到專案異動的影響。
使用錯誤像這樣,想請問如何修改 :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'
我是將檔案放在GOOGLE雲端硬碟上的.將檔案放在colab資料夾下面也一樣錯誤.謝謝您
回覆刪除可以了 謝謝您辛苦的修改
回覆刪除有任何問題的話,歡迎再反應 ^_^
刪除哈!這樣可以當卡拉OK
回覆刪除哈哈哈~ 是,等心血來潮,再將選項弄完整一點,現在其實少滿多的。
刪除