精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

92久久精品一区二区| 俄罗斯毛片基地| 欧美办公室脚交xxxx| 久久久91精品国产一区二区精品 | 久久久一二三四| 成人小说亚洲一区二区三区| 久久蜜桃精品| 欧美黑人xxx| 国产美女免费无遮挡| 激情不卡一区二区三区视频在线| 午夜精品福利一区二区三区av | 福利小视频在线观看| 国产很黄免费观看久久| 2019精品视频| 国产67194| 精品美女久久久| 亚洲福利精品在线| 三级av免费看| 外国电影一区二区| 午夜国产不卡在线观看视频| 中文字幕人成一区| 久久电影视频| 99精品热视频| 99在线视频播放| 91丨porny丨在线中文| 久久国产精品99国产| 欧美成人午夜激情在线| 1024手机在线观看你懂的| 老司机成人在线| 日韩视频在线永久播放| 香港日本韩国三级网站| 一本大道色婷婷在线| 亚洲电影第三页| a级网站在线观看| av网站无病毒在线| 久久久精品欧美丰满| 狠狠色综合网站久久久久久久| 国产喷水吹潮视频www| 久久精品国产一区二区三| 国产精品白嫩初高中害羞小美女| 日本最新中文字幕| 欧美激情视频一区二区三区在线播放 | 五月香视频在线观看| 国产亚洲欧美日韩俺去了| 美乳视频一区二区| 四虎影视精品成人| 白白色亚洲国产精品| 99在线首页视频| 精品国产亚洲av麻豆| 国产乱子伦一区二区三区国色天香 | 亚洲人成电影在线播放| 我和岳m愉情xxxⅹ视频| 一区二区三区日本久久久| 亚洲精品国产精品久久清纯直播| 国产日韩视频一区| 9l视频自拍蝌蚪9l视频成人| 日韩精品专区在线影院观看 | 最新国产一区二区| 精品99久久久久久| 艳妇乳肉豪妇荡乳xxx| 精品久久ai电影| 日韩h在线观看| 偷拍女澡堂一区二区三区| 亚洲综合小说图片| 国产亚洲aⅴaaaaaa毛片| 欧洲美熟女乱又伦| 日本一本不卡| 久久夜色精品国产欧美乱| 国产精品 欧美激情| 欧美1区免费| 午夜精品久久久久久久99热浪潮| 国产午夜精品无码一区二区| 亚洲国产日韩在线| 国产成人精品视| 一级特黄aa大片| 国产成人在线视频免费播放| 国产综合欧美在线看| 清纯唯美亚洲色图| 国产精品久久久久久久裸模| 国产手机视频在线观看| www.九色在线| 在线观看日韩毛片| 奇米777在线| 日韩高清成人在线| 色偷偷888欧美精品久久久 | 午夜精品剧场| 3344国产精品免费看| 欧美高清69hd| 国产91丝袜在线18| 日本视频精品一区| 羞羞网站在线免费观看| 日韩欧美视频一区二区三区| 国产日韩欧美久久| 国产伦精品一区二区三区免费优势 | 国产精品自拍视频| 欧美一级淫片免费视频魅影视频| 久久一夜天堂av一区二区三区| 亚洲精品第一区二区三区| 色综合999| 在线观看免费亚洲| 四虎国产精品永久免费观看视频| 一道在线中文一区二区三区| 欧美精品免费看| 黄色污污网站在线观看| 韩国视频一区二区| 欧洲精品一区色| 国内老司机av在线| 欧美区视频在线观看| v天堂中文在线| 中文字幕亚洲综合久久五月天色无吗'' | 久草网站在线观看| 日韩精品一二三区| 国产一区二区高清不卡| 成人免费网址| 欧美在线观看18| 三级男人添奶爽爽爽视频| 欧美激情成人| 国产精品福利观看| 天天综合网在线观看| 亚洲美女视频在线观看| 在线观看的毛片| 亚洲人成网站77777在线观看| 久久不射电影网| 亚洲一级特黄毛片| 久久久精品免费观看| 777精品久无码人妻蜜桃| 国产一区二区久久久久| 中文字幕在线观看日韩| 蜜臀尤物一区二区三区直播| 99久久精品情趣| 日韩小视频网站| 亚洲国产欧美国产第一区| 色婷婷久久av| 一卡二卡三卡在线| 国产精品久久久一区麻豆最新章节| 男人揉女人奶房视频60分| 高清日韩中文字幕| 欧美激情图片区| 成人久久久精品国产乱码一区二区| 中文字幕亚洲区| 91av视频免费观看| 日韩中字在线| 成人黄色午夜影院| а√资源新版在线天堂| 6080国产精品一区二区| 视频这里只有精品| 国产最新精品精品你懂的| 一区二区三区四区五区精品 | 国产精品毛片va一区二区三区| 怡红院在线播放| 欧美成人欧美edvon| 久久久久亚洲av片无码下载蜜桃| 国产精品99久久久久久有的能看 | 久久一区二区三区av| 欧美三级网站| 亚洲人午夜精品| 最近中文字幕在线观看| 国产精品网站在线| 九九热99视频| 欧美精品一卡| 精品国产乱码久久久久久郑州公司 | 91国产免费看| 亚洲综合图片一区| 激情偷乱视频一区二区三区| 天天想你在线观看完整版电影免费| 日韩激情精品| 97在线视频一区| 九色在线观看| 欧美精品亚洲一区二区在线播放| 国产中文av在线| 成人性生交大片免费看视频在线| 99视频在线免费播放| 国产一区二区在线| 91精品在线影院| 99爱在线视频| 中文字幕欧美日韩精品| 国产高潮流白浆喷水视频| 亚洲高清三级视频| 亚洲第一综合网| 国产一区二区三区日韩| 日韩欧美视频网站| 日韩综合精品| 好吊妞www.84com只有这里才有精品| 欧美国产大片| 久久99精品久久久久久噜噜 | 中文字幕精品在线不卡| 日本r级电影在线观看| 亚洲欧美日韩国产一区| 亚洲v欧美v另类v综合v日韩v| 日韩三级av高清片| 日本久久久久久久久| 国产福利视频在线观看| 日韩精品在线观看网站| 91免费视频播放| 色综合久久中文综合久久牛| 三上悠亚作品在线观看| 26uuu色噜噜精品一区| 亚洲a级黄色片| 欧美亚洲专区| 成人免费看片'免费看| 九热爱视频精品视频| 99国精产品一二二线| 播放一区二区| 欧美一级视频一区二区| av色综合久久天堂av色综合在| 亚洲人成绝费网站色www| 国 产 黄 色 大 片| 欧美日韩免费观看一区二区三区| xxxxxx国产| 亚洲视频一二三| 日本二区在线观看| 99久久婷婷国产综合精品电影| av在线免费看片| 免费观看成人鲁鲁鲁鲁鲁视频| 好吊妞无缓冲视频观看| 欧美日韩国产高清| 在线丝袜欧美日韩制服| 精品美女视频| 欧美日韩综合网| 欧美精品中文字幕亚洲专区| 99r国产精品视频| 精品176极品一区| 日韩av123| 牛牛精品一区二区| 欧美精品久久久久| 亚洲第一图区| 精品中文字幕在线观看| 国内外激情在线| 最新国产精品亚洲| av在线电影免费观看| 亚洲男人的天堂在线播放| 亚州av在线播放| 亚洲第一中文字幕| 欧美在线 | 亚洲| 亚洲精品一区二区三区在线观看| 国产日韩在线观看一区| 在线观看日韩一区| 中国黄色一级视频| 欧美午夜精品久久久| 欧美性猛交xxxx乱大交hd| 色呦呦一区二区三区| 午夜婷婷在线观看| 日韩欧美黄色动漫| 无码人妻久久一区二区三区| 色久综合一二码| 久草热在线观看| 欧美视频一区二区| 亚洲永久精品视频| 欧美精品乱人伦久久久久久| 最近中文字幕免费观看| 欧美日韩不卡在线| 国产夫妻性生活视频| 精品国产乱码久久久久久蜜臀| 亚洲成熟女性毛茸茸| 精品少妇一区二区| 天天躁日日躁狠狠躁喷水| 精品无人区太爽高潮在线播放| 欧美日韩在线精品一区二区三区激情综 | 日本久久精品电影| 中文字幕在线观看国产| 欧美老肥妇做.爰bbww| 99热这里只有精品9| 日韩精品一区二区三区四区视频| 欧美一区二区三区成人片在线| 精品丝袜一区二区三区| av在线收看| 久久国产天堂福利天堂| 美女网站视频在线| 日本久久亚洲电影| 高清亚洲高清| 99免费在线观看视频| 久久激情av| 少妇特黄a一区二区三区| 婷婷综合亚洲| 免费一级特黄特色毛片久久看| 丝瓜av网站精品一区二区| 999在线观看| 成人性色生活片| 欧美多人猛交狂配| 亚洲精品乱码久久久久久| 好吊妞视频一区二区三区| 欧美亚洲高清一区| wwwav网站| 国产亚洲欧美一区| 在线看女人毛片| 日本视频久久久| 玖玖精品一区| 日本不卡一二三区| 欧美+日本+国产+在线a∨观看| 国产视频九色蝌蚪| 久久99久久久久| 大地资源二中文在线影视观看 | 九九热国产视频| 欧美网站一区二区| 高h震动喷水双性1v1| 伊人久久五月天| av影视在线看| 国产日韩欧美中文| 妖精视频一区二区三区| 蜜桃视频成人在线观看| 久久精品国语| 中文字幕一区二区三区四| 久久精品亚洲乱码伦伦中文| 久草视频在线资源| 欧美三片在线视频观看 | 91麻豆精品国产综合久久久| 久久精品国产第一区二区三区最新章节| 久久影院一区| 日韩欧美在线免费观看视频| 成人免费高清在线| 99自拍视频在线| 欧美性猛交一区二区三区精品| 后入内射欧美99二区视频| 日韩视频免费看| 亚洲a∨精品一区二区三区导航| 国产一区精品视频| 欧美日韩国产综合网| 五月激情五月婷婷| 久久久www成人免费毛片麻豆 | 韩国成人av| 你懂的国产精品| 不卡的在线视频| 中日韩av电影| 91在线视频免费播放| 亚洲电影免费观看高清| 欧美精品videossex少妇| 91久久国产精品91久久性色| 欧美中文一区二区| 人妻无码视频一区二区三区| 91免费视频观看| 中文字幕第15页| 亚洲黄页视频免费观看| 久草在线视频福利| av激情久久| 欧美三级不卡| 亚洲黄色av片| 亚洲免费观看在线观看| jizz中国女人| 欧美激情按摩在线| 久久久久久久久久久久电影| 特级黄色录像片| 国产精品综合av一区二区国产馆| 成人一级黄色大片| 欧美日韩国产另类不卡| 免费网站免费进入在线| 国产精品99导航| 日韩成人精品一区| 自拍偷拍一区二区三区四区| 国产精品成人在线观看| 一本色道久久综合无码人妻| 日韩一区二区三区国产| 免费看一区二区三区| 日韩一区二区高清视频| 成人动漫在线一区| 国产成人在线视频观看| 亚洲图片在区色| 免费一区二区三区四区| 欧洲美女和动交zoz0z| 国产suv精品一区二区6| 日韩av在线天堂| 亚洲色图日韩av| 丰满少妇一区| 强开小嫩苞一区二区三区网站| 国产91在线观看丝袜| 午夜毛片在线观看| 在线视频免费一区二区| 精品一区二区三区亚洲| 成人在线播放网址| 久久综合九色综合97婷婷| 中文字幕永久免费视频| 美女精品视频一区| 国产精品黄网站| 日本999视频| 一区二区三区在线免费观看| 色婷婷av一区二区三| 国产成人a亚洲精品| 亚洲精品91| 国产精品无码在线| 欧美三级资源在线| 丁香花电影在线观看完整版| 蜜桃视频日韩| 国产精品一二三四五| youjizz在线视频| 久久偷看各类女兵18女厕嘘嘘| 另类尿喷潮videofree| www.日本一区| 亚洲18色成人| 另类小说第一页| 蜜桃视频在线一区| 久久伊人成人网| 亚洲夜晚福利在线观看| 日韩影片在线观看| 成年人黄色片视频| 亚洲色图一区二区| 天堂在线中文| 91日韩在线播放| 久久久水蜜桃av免费网站| 26uuu成人网| 夜夜嗨av色一区二区不卡| 香港久久久电影|