iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
生成式 AI

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

Day10 - 聲優太花錢?找 AI 幫你配音

  • 分享至 

  • xImage
  •  

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

模型說明

昨天教大家上字幕,今天則是反過來,給文字讓 AI 幫你配音
比起以前文字轉聲音的軟體,AI 的聲音更為自然,角色跟速度也都能調整,讓我們看看如何操作吧
文字轉語音也是劃分在 Audio Model 的部分,Spring AI 目前只支援 OpenAI
https://ithelp.ithome.com.tw/upload/images/20240809/20161290wi54q7gekg.png

為了彈性配置,application.yml 只存放 API KEY,其他參數都放在程式碼內

程式碼

@RestController
@RequiredArgsConstructor
class AiController {
	private final SpeechModel speechModel;
	@GetMapping("/tts")
    public ResponseEntity<byte[]> speech(String prompt) throws IOException {
		OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder()
			    .withModel("tts-1-hd")
			    .withVoice(Voice.ALLOY)
			    .withResponseFormat(AudioResponseFormat.MP3)
			    .withSpeed(1f)
			    .build();

			SpeechPrompt speechPrompt = new SpeechPrompt(prompt, speechOptions);
			SpeechResponse response = speechModel.call(speechPrompt);
        return ResponseEntity.ok()
        		.header(HttpHeaders.CONTENT_DISPOSITION, 
        				ContentDisposition
        					.attachment()
        					.filename("配音.mp3", StandardCharsets.UTF_8)
        					.build().toString())
        		.body(response.getResult().getOutput());
    }
}

程式重點說明

  • Text To Speech 的模組是 SpeechModel,跟之前模組不一樣的是這個模組回傳的是 byte[],要做一些處理才能下載檔案,所以回傳值特別使用 ResponseEntity<byte[]>,昨天的結果是 String,若不下載也能直接顯示在網頁上
  • .withModel("tts-1") TTS 的模型,可以選 tts-1 以及 tts-1-hd(取樣頻率較高)
  • .withVoice(Voice.ALLOY) 選擇要哪種角色的聲音,有以下六種可選
@JsonProperty("alloy") ALLOY("alloy"),
@JsonProperty("echo") ECHO("echo"),
@JsonProperty("fable") FABLE("fable"),
@JsonProperty("onyx") ONYX("onyx"),
@JsonProperty("nova") NOVA("nova"),
@JsonProperty("shimmer") SHIMMER("shimmer");
  • .withResponseFormat(AudioResponseFormat.MP3) 輸出聲音的格式,雖然後面存檔會自訂附檔名,不過格式得匹配,不然程式會無法辨認
@JsonProperty("mp3") MP3("mp3"),
@JsonProperty("opus") OPUS("opus"),
@JsonProperty("aac") AAC("aac"),
@JsonProperty("flac") FLAC("flac");
  • .withSpeed(1.0f) 講話的速度,雖然影音編輯軟體可以調整速度,不過透過 AI 來調整聲調才不會變太多,範圍介於 0.25 ~ 4
  • 下載時要指定檔名可以透過 HttpHeaders.CONTENT_DISPOSITION 指定
  • 因為結果直接是 byte[] 格式,直接放入 body 即可

測試成果

經過測試,雖然偶有錯誤發生,不過聲音聽起來非常自然,可以跟手機版 ChatGPT 對話就知道效果,雖然有點 ABC 腔調,不過整體來說還蠻好聽的

到目前為止凱文大叔把基本 Model 的操作都介紹過,不過 AI 的變化非常快,搞不好幾個月後又有新的 Model,大家覺得前面介紹這些 Model 可以取代掉那些職業?

回顧

  • SpeechModel 的調用
  • OpenAiAudioSpeechOptions 的參數設定
  • 回傳 binary 格式下載檔案的 header 寫法

Source Code

程式碼下載:
https://github.com/kevintsai1202/SpringBoot-AI-Day10.git


認識凱文大叔

凱文大叔使用 Java 開發程式超過 20 年,對於 Java 生態非常熟悉,曾使用反射機制開發 ETL 框架,對 Spring 背後的原理非常清楚,目前以 Spring Boot 作為後端開發框架,前端使用 React 搭配 Ant Design
下班之餘在 Amazing Talker 擔任程式語言講師,並獲得學員的一致好評

最近剛成立一個粉絲專頁-凱文大叔教你寫程式 歡迎大家多追蹤,我會不定期分享實用的知識以及程式開發技巧

想討論 Spring 的 Java 開發人員可以加入 FB 討論區 Spring Boot Developer Taiwan

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


上一篇
Day9 - 做一個雲端字幕產生器
下一篇
Day11 - 請支援 AI - Function Calling (上)
系列文
使用 Spring AI 打造企業 RAG 知識庫13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言