精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

EasyDub 配音視頻生成平臺:SpringBoot + Thymeleaf + Spring AI 實戰(zhàn)開發(fā)

人工智能
通過整合 Spring Boot、Thymeleaf、Redis、FFmpeg 與 AI 模型接口(Whisper、XTTSv2 等),我們構(gòu)建了一個功能強大且易用的 EasyDub Web 配音系統(tǒng),支持異步處理、狀態(tài)輪詢、數(shù)字人合成與完整視頻輸出。?

本項目旨在構(gòu)建一個 Web 端一鍵生成 AI 配音視頻的系統(tǒng),提供從“上傳視頻 → 提取語音 → 翻譯 → 合成音頻 → 合成字幕與數(shù)字人 → 下載結(jié)果”的完整流程。后端基于 SpringBoot,前端使用 Thymeleaf + Bootstrap,結(jié)合 Redis 實現(xiàn)異步任務(wù)狀態(tài)跟蹤與進(jìn)度輪詢,支持多用戶并發(fā)任務(wù)處理。

功能亮點

  • ?? 全流程:上傳原視頻 → 翻譯 → 配音合成 → 視頻輸出
  • ?? Spring AI:調(diào)用 AI 模型實現(xiàn)翻譯、合成
  • ??? Web UI:Thymeleaf + Bootstrap 實現(xiàn)進(jìn)度輪詢
  • ?? Redis + Spring Task 實現(xiàn)異步任務(wù)與進(jìn)度管理
  • ?? 實際 DEMO:上傳 original_video.mp4 → 下載 linly_dubbing.mp4

項目結(jié)構(gòu)

com.icoderoad.easydub
├── controller
│   └── DubbingController.java
├── service
│   ├── DubbingService.java
│   └── ProgressService.java
├── config
│   └── TaskConfig.java
├── model
│   └── TaskStatus.java
├── templates
│   └── index.html
├── static
│   └── bootstrap + js
├── application.yml
└── EasyDubApplication.java

SpringBoot 構(gòu)建 REST 接口

視頻上傳與任務(wù)創(chuàng)建接口

package com.icoderoad.easydub.controller;


import com.icoderoad.easydub.service.DubbingService;
import com.icoderoad.easydub.service.ProgressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;


@RestController
@RequestMapping("/api")
public class DubbingController {


    @Autowired
    private DubbingService dubbingService;


    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) {
        return dubbingService.handleUpload(file);
    }


    @GetMapping("/progress/{taskId}")
    public String getProgress(@PathVariable String taskId) {
        return dubbingService.getProgress(taskId);
    }


    @GetMapping("/download/{taskId}")
    public String getDownloadUrl(@PathVariable String taskId) {
        return dubbingService.getDownloadUrl(taskId);
    }
}

Spring Task + Redis 實現(xiàn)任務(wù)調(diào)度

配置異步線程池

package com.icoderoad.easydub.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;


import java.util.concurrent.Executor;


@Configuration
public class TaskConfig {
    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(3);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("DubbingTask-");
        executor.initialize();
        return executor;
    }
}

后臺任務(wù)處理服務(wù)

package com.icoderoad.easydub.service;


import com.icoderoad.easydub.model.TaskStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import redis.clients.jedis.Jedis;


import java.io.File;
import java.io.FileOutputStream;
import java.util.UUID;


@Service
public class DubbingService {


    @Autowired
    private ProgressService progressService;


    private final String baseDir = "output/";


    public String handleUpload(MultipartFile file) {
        String taskId = UUID.randomUUID().toString();
        File saveFile = new File(baseDir + taskId + "_original.mp4");
        try (FileOutputStream fos = new FileOutputStream(saveFile)) {
            fos.write(file.getBytes());
        } catch (Exception e) {
            return "上傳失敗:" + e.getMessage();
        }


        progressService.init(taskId);
        processAsync(taskId, saveFile.getAbsolutePath());
        return taskId;
    }


    @Async("taskExecutor")
    public void processAsync(String taskId, String inputPath) {
        try {
            progressService.update(taskId, "提取音頻中...");
            String audioPath = extractAudio(inputPath);


            progressService.update(taskId, "識別翻譯中...");
            String translatedText = callSpringAIWhisperAndTranslate(audioPath);


            progressService.update(taskId, "合成語音中...");
            String newVoice = synthesizeAudio(translatedText);


            progressService.update(taskId, "合成視頻中...");
            String finalVideo = composeVideo(inputPath, newVoice, taskId);


            progressService.complete(taskId, finalVideo);
        } catch (Exception e) {
            progressService.fail(taskId, e.getMessage());
        }
    }


    private String extractAudio(String inputPath) throws Exception {
        String outPath = inputPath.replace(".mp4", ".wav");
        String cmd = String.format("ffmpeg -i %s -vn -acodec pcm_s16le -ar 16000 -ac 1 %s", inputPath, outPath);
        Runtime.getRuntime().exec(cmd).waitFor();
        return outPath;
    }


    private String callSpringAIWhisperAndTranslate(String audioPath) {
        // 偽代碼:可以集成 Spring AI Whisper + LLM 翻譯
        return "你好,歡迎來到 EasyDub。";
    }


    private String synthesizeAudio(String text) {
        // 偽代碼:調(diào)用 XTTS 合成中文音頻
        return "output/temp_tts.wav";
    }


    private String composeVideo(String originalVideo, String newAudio, String taskId) throws Exception {
        String output = baseDir + taskId + "_linly_dubbing.mp4";
        String cmd = String.format("ffmpeg -i %s -i %s -map 0:v -map 1:a -c:v copy -c:a aac %s",
                originalVideo, newAudio, output);
        Runtime.getRuntime().exec(cmd).waitFor();
        return output;
    }


    public String getProgress(String taskId) {
        return progressService.query(taskId);
    }


    public String getDownloadUrl(String taskId) {
        return progressService.getResultUrl(taskId);
    }
}

Redis 進(jìn)度服務(wù)封裝

package com.icoderoad.easydub.service;


import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;


@Service
public class ProgressService {


    private final Jedis redis = new Jedis("localhost", 6379);


    public void init(String taskId) {
        redis.set(taskId, "開始處理...");
    }


    public void update(String taskId, String message) {
        redis.set(taskId, message);
    }


    public void complete(String taskId, String path) {
        redis.set(taskId + ":done", path);
        redis.set(taskId, "處理完成!");
    }


    public void fail(String taskId, String errorMsg) {
        redis.set(taskId, "失敗:" + errorMsg);
    }


    public String query(String taskId) {
        return redis.get(taskId);
    }


    public String getResultUrl(String taskId) {
        return redis.get(taskId + ":done");
    }
}

Web 前端 Thymeleaf + Bootstrap

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>EasyDub 配音生成</title>
    <link rel="stylesheet" />
</head>
<body class="container mt-5">
<h2>?? EasyDub 配音生成平臺</h2>


<form id="uploadForm" enctype="multipart/form-data">
    <input type="file" class="form-control" name="file" required/>
    <button type="submit" class="btn btn-primary mt-2">上傳并開始處理</button>
</form>


<div class="mt-3" id="status" style="display:none;">
    <h5>進(jìn)度:<span id="progressMsg"></span></h5>
</div>


<div class="mt-3" id="download" style="display:none;">
    <a class="btn btn-success" id="downloadLink" href="#">下載結(jié)果視頻</a>
</div>


<script>
    document.getElementById('uploadForm').addEventListener('submit', function (e) {
        e.preventDefault();
        let formData = new FormData(this);
        fetch('/api/upload', {
            method: 'POST',
            body: formData
        }).then(res => res.text()).then(taskId => {
            document.getElementById("status").style.display = "block";
            pollProgress(taskId);
        });
    });


    function pollProgress(taskId) {
        let interval = setInterval(() => {
            fetch('/api/progress/' + taskId).then(res => res.text()).then(msg => {
                document.getElementById("progressMsg").innerText = msg;
                if (msg.includes("完成")) {
                    clearInterval(interval);
                    document.getElementById("download").style.display = "block";
                    fetch('/api/download/' + taskId).then(r => r.text()).then(url => {
                        document.getElementById("downloadLink").href = '/' + url;
                    });
                } else if (msg.includes("失敗")) {
                    clearInterval(interval);
                    alert("處理失敗:" + msg);
                }
            });
        }, 2000);
    }
</script>
</body>
</html>

本地 DEMO 流程

  1. 啟動 SpringBoot 應(yīng)用
  2. 瀏覽器打開 http://localhost:8080
  3. 上傳 original_video.mp4
  4. 等待進(jìn)度提示,后臺完成:

視頻 → 音頻提取 → Whisper識別 → 翻譯 → 合成配音 → 視頻合成

  1. 下載生成的 linly_dubbing.mp4

結(jié)語

通過整合 Spring Boot、Thymeleaf、Redis、FFmpeg 與 AI 模型接口(Whisper、XTTSv2 等),我們構(gòu)建了一個功能強大且易用的 EasyDub Web 配音系統(tǒng),支持異步處理、狀態(tài)輪詢、數(shù)字人合成與完整視頻輸出。

責(zé)任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2025-05-14 07:35:27

UVR5合成管道集成

2025-04-16 09:20:00

虛擬模型數(shù)字

2024-02-28 08:22:07

2018-04-27 11:21:14

2025-09-25 14:15:51

2024-06-17 08:03:51

2024-10-15 13:30:03

2024-10-28 07:30:00

2023-03-03 15:40:43

抖音視頻編碼器

2022-08-29 10:39:32

FFmpeg多媒體框架開源

2023-11-20 22:02:54

開源模型

2024-11-08 17:34:38

2025-06-18 14:40:22

2018-04-13 17:00:21

騰訊云音視頻

2022-09-21 11:48:40

端到端音視頻測試用戶體驗

2024-10-05 08:10:01

2022-06-20 05:59:35

5G技術(shù)音視頻技術(shù)安卓系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號

国产极品jizzhd欧美| 日韩黄色在线视频| 黄色免费av网站| 日韩av黄色| 亚洲天堂激情| 欧美日韩你懂的| 就去色蜜桃综合| 国产大片aaa| 亚洲免费看片| 亚洲国产高清aⅴ视频| 97国产精品视频| 国产一级片中文字幕| av在线中文| 美女亚洲一区| 亚洲国产精品一区二区久久恐怖片| 国产精品嫩草影院一区二区| 丰满少妇高潮一区二区| 精精国产xxxx视频在线播放| 丁香网亚洲国际| 欧美激情第三页| 免费黄视频在线观看| 久久77777| 久久成人精品无人区| 在线观看亚洲区| 狠狠躁狠狠躁视频专区| 国产在线免费观看| 蜜臀av在线播放一区二区三区| 日韩黄色在线免费观看| 福利视频免费在线观看| 亚洲精品久久久久avwww潮水| 久久精品亚洲欧美日韩精品中文字幕| 欧美三级视频在线| 亚洲欧美日韩在线综合| 一二三四区视频| 999精品视频| 欧美一区二区三区公司| 成人在线观看毛片| 免费激情视频网站| 一本久道久久久| 国产视频欧美视频| 亚洲少妇第一页| 男人在线资源站| 国产精品中文有码| 久久久久久久久久久网站| 亚洲激情 欧美| 欧美日韩国产v| 国产精品美日韩| 亚洲free嫩bbb| 久久久久久久久久99| 欧美精品中文| 欧美日韩免费观看一区二区三区| 国产午夜福利在线播放| 国产精品久久久久一区二区国产 | 丰满少妇被猛烈进入高清播放| 国产自产一区二区| 久久国产毛片| 久久精品成人一区二区三区| xxxxwww一片| 国产精品xnxxcom| 亚洲成人第一页| 草草草视频在线观看| 女人偷人在线视频| 国产综合色产在线精品| 韩国19禁主播vip福利视频| 人妻丰满熟妇av无码久久洗澡 | 国产视频福利在线| 久久久亚洲精品石原莉奈| 国产在线视频91| 久久高清免费视频| 亚洲激情亚洲| 久久精品久久久久久| 国产福利视频网站| 曰本一区二区三区视频| 欧美一区永久视频免费观看| 中文字幕资源在线观看| 中文字幕资源网在线观看免费| 国产精品久久精品日日| 久久久综合亚洲91久久98| 国产又粗又猛视频| 国产精品久久久久久久免费软件| 日韩最新在线视频| 少妇久久久久久久久久| 精品一区二区三区在线 | 日韩美女视频免费在线观看| 黄色录像一级片| 久操成人av| 在线视频一区二区| 先锋资源av在线| 一区二区三区四区在线看 | 欧美xxxx免费虐| 国产欧美一区二区精品性| 成人免费观看网站| 国产精品欧美激情在线| 玖玖玖国产精品| 韩国美女主播一区| 波多野结衣毛片| 9久re热视频在线精品| 国产精品第3页| 免费在线观看黄网站| 午夜精品久久| 久久99久久99精品免观看粉嫩| 精品人体无码一区二区三区| 国产精品美女久久久久久不卡| 亚洲精品97久久| 国产精品久久久久久亚洲av| 亚洲精品午夜| 日韩一级黄色大片| 永久看看免费大片| 国产精品va视频| 亚洲男人的天堂在线播放| 99久久人妻无码中文字幕系列| 成人精品视频| 色久欧美在线视频观看| 美国一级黄色录像| 亚洲香蕉网站| 日韩一区二区欧美| 日本熟妇成熟毛茸茸| 麻豆高清免费国产一区| 国产噜噜噜噜久久久久久久久| 亚洲免费视频二区| 久久99久久99小草精品免视看| 国产一区二区三区四区五区在线| 亚洲国产www| 国产精品久久久久久久久晋中 | 亚洲高清一区二| wwwxx日本| 精品国产午夜肉伦伦影院| 亚洲精品一区二区三区蜜桃下载 | 日日碰狠狠丁香久燥| 不卡福利视频| 色综合久久久久综合体桃花网| 国产美女无遮挡网站| 日本一区精品视频| 精品国产一区二区三区av性色| 国产一区第一页| 亚洲国产精品久久久天堂| 国产91在线播放九色快色| 亚洲三区在线播放| 国产午夜亚洲精品午夜鲁丝片 | 久久久久av| 国产精品免费看久久久香蕉| 精品电影在线| 在线视频综合导航| 久久国产激情视频| 欧美二区观看| 精品一区电影国产| 日韩成人一区二区三区| 成人一区在线看| 人妻少妇精品久久| 国模套图日韩精品一区二区| 亚洲国产精品视频在线观看| 欧美成人手机视频| 国产精品久久久免费| 国产亚洲一区在线播放| av电影免费在线看| 欧美三级电影精品| 免费看91的网站| 欧美a级片网站| 亚洲自拍高清视频网站| 手机在线免费看av| 欧美在线高清视频| 香蕉在线观看视频| 黄色亚洲在线| 精品日本一区二区| 国产婷婷视频在线| 日韩一区二区三区观看| 久久久精品国产sm调教网站| 成人sese在线| 午夜啪啪福利视频| 日本一道高清亚洲日美韩| 欧美一区二区播放| 久久精品国产亚洲AV无码麻豆| 丁香啪啪综合成人亚洲小说 | 日韩精品一区二| 欧美精品一区二区在线播放| 国产自产在线视频一区| 国产不卡123| 亚洲性夜色噜噜噜7777| 欧美日韩在线观看成人| 国精产品一区一区三区mba桃花| 国产一区二区免费电影| 中文字幕在线看片| 日韩性xxxx爱| 可以免费观看的毛片| 欧美日韩国产中文字幕 | 亚洲国产综合久久| 91色视频在线| av日韩在线看| 亚洲第一论坛sis| 国产久一一精品| 第四色日韩影片| 欧美一区午夜视频在线观看| 日韩av综合在线| 国产精品电影院| 国产真实乱人偷精品| 日本aⅴ亚洲精品中文乱码| 鲁丝片一区二区三区| 色999韩欧美国产综合俺来也| 欧美日本中文字幕| 国内三级在线观看| 精品久久久久久综合日本欧美| 国产成人免费在线观看视频| 国产精品18久久久| 亚洲国产精品女人| 日韩av网站在线免费观看| 国产男女猛烈无遮挡91| 超碰激情在线| 久久影院免费观看| 国产乱叫456在线| 欧美小视频在线| 最新中文字幕视频| 亚洲专区在线| 韩国成人av| 91精品视频一区二区| 欧美在线激情视频| 99精品在线视频观看| 亚洲视频免费看| 国模大尺度视频| 日韩av网站免费在线| 欧美一区二区三区爽大粗免费| 91精品国产调教在线观看| 欧美一级爱爱| 久久夜夜久久| 久久国产精品首页| 亚洲爱爱综合网| 欧美日韩国产一区二区三区地区| 亚洲天堂av片| 国产女人水真多18毛片18精品视频 | 亚洲最大免费视频| 在线综合亚洲| 国产免费一区二区三区四在线播放 | 丝袜亚洲另类欧美| 六月丁香激情网| 亚洲毛片网站| 激情深爱综合网| 亚洲三级网址| 极品校花啪啪激情久久| 1313精品午夜理伦电影| 亚洲在线免费观看| 欧美一区在线观看视频| 国产情人节一区| 欧美成人xxxx| 成人精品一区二区三区电影免费| 四虎影视国产在线视频| 蜜臀久久99精品久久久无需会员| 在线播放毛片| 欧美成人精品二区三区99精品| 国产又粗又猛又爽| 5858s免费视频成人| 国产无遮挡又黄又爽| 亚洲蜜臀av乱码久久精品| 久久午夜夜伦鲁鲁片| jlzzjlzz亚洲日本少妇| 九色91popny| 日本亚洲免费观看| 在线免费av播放| 久久成人免费电影| 永久免费黄色片| 国产欧美三级| 春日野结衣av| 欧美aaaaaa午夜精品| 在线免费av播放| 国产在线精品一区在线观看麻豆| 国产无遮挡猛进猛出免费软件 | 久久精品水蜜桃av综合天堂| 新91视频在线观看| 国产精品毛片久久久久久| fc2ppv在线播放| 亚洲精品国产a| 老熟妇一区二区| 99久久精品情趣| free性中国hd国语露脸| 久久久777精品电影网影网| 蜜臀久久99精品久久久久久| 国产精品久久久久久久岛一牛影视 | 69av视频在线播放| 菠萝蜜视频国产在线播放| 国产亚洲欧美aaaa| 黄色网页在线观看| 亚洲3p在线观看| 日韩经典一区| 99久久精品免费看国产一区二区三区 | 久草成人资源| 最新视频 - x88av| av成人毛片| 中文字幕第88页| 成人免费视频视频在线观看免费| 美女久久久久久久久久| 亚洲婷婷在线视频| 婷婷激情五月网| 欧美精品粉嫩高潮一区二区| 波多野结衣家庭主妇| 欧美一区二区三区视频在线 | 中文字幕欧美激情一区| 午夜爽爽爽男女免费观看| 精品国产31久久久久久| 日韩免费不卡视频| 欧美网站大全在线观看| 亚洲男人天堂久久| 国产亚洲欧洲高清| 超免费在线视频| 国产伦精品一区二区三区精品视频| 亚洲综合色婷婷在线观看| 日韩高清三级| 精品视频国产| 日韩精品在线视频免费观看| 久久婷婷激情| 艳妇乳肉豪妇荡乳xxx| 中文天堂在线一区| 少妇一级淫片免费放中国 | 青青艹在线观看| 亚洲国产成人91精品| 久久综合之合合综合久久| 57pao精品| 成人另类视频| 成人欧美一区二区三区视频xxx| 久久99精品久久久久久园产越南| 成年丰满熟妇午夜免费视频 | 亚洲aⅴ男人的天堂在线观看| 久久99国产成人小视频| 国产无限制自拍| 国产jizzjizz一区二区| 免费欧美一级片| 中文子幕无线码一区tr| 国产又黄又猛又粗又爽| 欧美大片一区二区三区| 日本www在线观看视频| 国产99久久久欧美黑人| 91综合精品国产丝袜长腿久久| 自拍另类欧美| 国产精品地址| 午夜精品免费看| 国产精品国产三级国产普通话蜜臀 | 欧美性xxxxxxxx| 日韩资源在线| 中文字幕欧美日韩精品| 韩日成人影院| 欧美精品成人一区二区在线观看| av资源久久| 黄色片一级视频| 久久66热re国产| 网站永久看片免费| 欧美四级电影在线观看| 国产三级在线看| 国产大片精品免费永久看nba| 久久av网址| 久久九九国产视频| 国产成人鲁色资源国产91色综| 欧美爱爱免费视频| 欧美乱妇一区二区三区不卡视频| 视频免费一区| 成人在线精品视频| 欧美一区高清| 国产sm在线观看| 亚洲成人免费看| 三级无遮挡在线观看| 国产成人精品免高潮在线观看 | 在线看片第一页欧美| 成人一区视频| 国产一区二区三区奇米久涩| 一区视频在线| 一本加勒比北条麻妃| 在线国产亚洲欧美| fc2在线中文字幕| 91精品国产综合久久久久久蜜臀| 国产精品99一区二区三| 欧美日韩一道本| 久久久久久亚洲综合影院红桃| 青青草视频在线观看免费| 综合网日日天干夜夜久久| 成人国产精品久久| 妞干网视频在线观看| 麻豆精品一区二区av白丝在线| av片在线免费看| 精品少妇一区二区三区在线播放 | 国产综合福利在线| 欧美成熟视频| 国产a级黄色片| 在线观看一区二区视频| 成人免费网站在线观看视频| 懂色中文一区二区三区在线视频| 亚洲私人影院| 亚洲色成人网站www永久四虎 | 性感美女极品91精品| 国产精品久久久久久久免费| 欧美区在线播放| 免费av一区| 99999精品| 欧美视频在线免费| 国产美女在线观看| 久久av一区二区三区漫画| 美女看a上一区| 日本熟女一区二区| 中文字幕不卡在线视频极品| 99久久婷婷国产综合精品青牛牛| 四虎永久在线精品无码视频| 亚洲欧美日韩中文字幕一区二区三区 | 日韩va亚洲va欧洲va国产| 亚洲伊人精品酒店| 欧美在线观看成人|