相信很多人知道 OpenAI 開源了 Whisper 模型,網路上也很多人製作本機端的字幕產生程式,凱文大叔試過,只能說慘不忍睹,由於電腦沒有獨立顯卡,不到 30 分鐘的影片竟然一個小時還沒完成
這時就很適合用平台的算力來協助了,音頻轉譯在 Spring AI 的文件中只支援 OpenAI
原本想說可以用 Groq 省錢,不過凱文大叔實際測試發現 Groq 閹割了很多功能,只能產生純文字,字幕最重要的時間戳記卻無法產生,若單純產生文字稿還是能用,需要時間戳記就只能花點小錢了(22mb 四分多鐘影片約 0.03 美金)
程式碼跟 Day7 的有點像,主要就是上傳影片或聲音檔,再透過 OpenAiAudioTranscriptionModel
生成文字,不過 application.yml
需要調整一下
spring:
ai:
openai:
api-key: ${OPENAI_APIKEY}
audio:
transcription:
options:
model: whisper-1
servlet:
multipart:
max-file-size:
25MB
max-request-size:
25MB
與 transcription 有關的設定放在 openai.audio.transcription 這邊我們只先設定 model,其它在程式中設定比較方便調整
另外有注意到下方多了 multipart 的設定嗎?MultipartFile 預設只能傳 1MB 所以我們必須把每次單檔最大(max-file-size)跟每次請求最大(max-request-size)都設為 25MB
為什麼設成 25MB?因為這是 whisper 的限制,超過大小會回錯誤訊息
接著看程式吧
@RestController
@RequiredArgsConstructor
class AiController {
private final OpenAiAudioTranscriptionModel transcriptionModel;
@PostMapping("/vtt")
public ResponseEntity<String> videoToText(MultipartFile file) {
OpenAiAudioTranscriptionOptions transcriptionOptions = OpenAiAudioTranscriptionOptions.builder()
.withTemperature(0f)
.withResponseFormat(TranscriptResponseFormat.SRT)
.build();
AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt( file.getResource(), transcriptionOptions);
AudioTranscriptionResponse response = transcriptionModel.call(transcriptionRequest);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION,
ContentDisposition
.attachment()
.filename("字幕檔.srt", StandardCharsets.UTF_8)
.build().toString()
)
.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE)
.body(response.getResult().getOutput());
}
}
其中比較重要的參數是withResponseFormat(TranscriptResponseFormat.SRT)
這會直接影響輸出的格式,srt 是最常見的字幕檔,除了文字外還會標示出現的時間,其他格式大家有興趣也可以測試看看
另外 header 的寫法中,CONTENT_DISPOSITION 使用 ContentDisposition 物件來建立,這能幫我們自動組成 "attachment; filename=字幕檔.srt
,這樣就能直接下載檔案了
下面是轉出的檔案內容,轉譯的內容除了幾個英文字念不標準翻錯以外XD,中文幾乎都沒問題,凱文大叔覺得最厲害的是一句話中英夾雜也能辨識出來 字幕檔.srt
1
00:00:00,000 --> 00:00:05,600
在學習程式或是求職時,是否遇過以下狀況
2
00:00:05,600 --> 00:00:10,400
學完Java仍不知如何開發應用程式
3
00:00:10,400 --> 00:00:17,100
在找Java相關工作,結果超過一半都要求會使用SpringBoot框架
4
00:00:17,100 --> 00:00:23,600
學完了SpringBoot,卻還是不知道如何整合各個模組完成一個專案
另外這模組也很適合做為會議紀錄,不管是線上會議還是錄音筆,他都能輕易的轉成文字,之後還能作為 RAG 的資料來源,當作企業 KM 系統的一環
今天的程式碼: https://github.com/kevintsai1202/SpringBoot-AI-Day9.git
凱文大叔使用 Java 開發程式超過 20 年,對於 Java 生態非常熟悉,曾使用反射機制開發 ETL 框架,對 Spring 背後的原理非常清楚,目前以 Spring Boot 作為後端開發框架,前端使用 React 搭配 Ant Design
下班之餘在 Amazing Talker 擔任程式語言講師,並獲得學員的一致好評
最近剛成立一個粉絲專頁-凱文大叔教你寫程式 歡迎大家多追蹤,我會不定期分享實用的知識以及程式開發技巧
想討論 Spring 的 Java 開發人員可以加入 FB 討論區 Spring Boot Developer Taiwan
我是凱文大叔,歡迎一起加入學習程式的行列