iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
生成式 AI

使用 Spring AI 打造企業 RAG 知識庫系列 第 9

Day9 - 做一個雲端字幕產生器

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20240810/20161290jCx3iLQjtI.jpg

模型說明

相信很多人知道 OpenAI 開源了 Whisper 模型,網路上也很多人製作本機端的字幕產生程式,凱文大叔試過,只能說慘不忍睹,由於電腦沒有獨立顯卡,不到 30 分鐘的影片竟然一個小時還沒完成

這時就很適合用平台的算力來協助了,音頻轉譯在 Spring AI 的文件中只支援 OpenAI
https://ithelp.ithome.com.tw/upload/images/20240807/201612904zZn4fPMwh.png

原本想說可以用 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 系統的一環

回顧:

  • 透過 Whisper 可以輕鬆的將影片或音檔轉成文字
  • application.yml 以及 Options 的設定方式
  • MultipartFile 上限大小調整
  • 讓前端直接下載檔案的 Header 寫法

Source Code

今天的程式碼: 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

我是凱文大叔,歡迎一起加入學習程式的行列


上一篇
Day8 - 透過 Spring AI 生成美女圖
下一篇
Day10 - 聲優太花錢?找 AI 幫你配音
系列文
使用 Spring AI 打造企業 RAG 知識庫13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言