文字转语音 demo|给出一个成语生成语音传到 oss

需求:

给出一个成语生成语音传到 oss

实现流程

  • TTS生成语音:通过百度TTS API生成成语发音的MP3文件。
  • 自动上传到OSS:阿里云OSS模块,将生成的MP3文件上传至OSS并返回URL。

jar 依赖

        <!-- 百度TTS依赖 -->
        <dependency>
            <groupId>com.baidu.aip</groupId>
            <artifactId>java-sdk</artifactId>
            <version>4.6.0</version>
        </dependency>

        <!-- OSS SDK 相关依赖 -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        

OSSService

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.UUID;

@Service
public class OSSService {
    private static final Logger log = LoggerFactory.getLogger(OSSService.class);
    /**
     * oss公钥
     */
    @Value("${oss.access-key}")
    public String accessKey;

    /**
     * oss私钥
     */
    @Value("${oss.secret-key}")
    public String secretKey;

    /**
     * oss存储桶域名地址
     */
    @Value("${oss.endpoint}")
    public String endpoint;

    /**
     * oss存储桶名称
     */
    @Value("${oss.bucketName}")
    public String bucketName;


    // 上传文件到OSS
    public String uploadToOSS(String filePath) throws IOException {
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey);

        //make file
        java.io.File file = new java.io.File(filePath);

        // 生成唯一文件名,防止文件名冲突
        String fileName = UUID.randomUUID().toString() + "-" + file.getName();

        try {
            // 上传文件到指定的bucket和文件名
            ossClient.putObject(new PutObjectRequest(bucketName, fileName, file));

            // 拼接文件的URL
            String fileUrl = "https://" + bucketName + "." + endpoint + "/" + fileName;

            return fileUrl; // 返回文件的URL
        } catch (Exception e) {
            e.printStackTrace();
            return "File upload failed!";
        } finally {
            // 关闭OSSClient
            ossClient.shutdown();
        }

    }
}

TTSService


import com.baidu.aip.speech.AipSpeech;
import com.baidu.aip.speech.TtsResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.FileOutputStream;
import java.io.IOException;

@Slf4j
@Component
public class TTSService {
    // 百度AI配置
    @Value("${baidu.app-id}")
    public String APP_ID;
    @Value("${baidu.api-key}")
    public String API_KEY;
    @Value("${baidu.secret-key}")
    public String SECRET_KEY;


    // 将成语转换为语音文件
    public String convertTextToSpeech(String idiom) throws IOException {
        AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
        TtsResponse res = client.synthesis(idiom, "zh", 1, null);


        if (res.getResult() != null) {
            log.info("res: {}", res.getResult());
        } else {
            log.warn("res.getResult() returned null");
        }

        // 保存语音文件
        byte[] audioData = res.getData();
        if (audioData == null) {
            throw new IOException("Audio data is null");
        }
        log.info("audioData: {}", audioData);
        String filePath = "tmp.mp3";
        try (FileOutputStream out = new FileOutputStream(filePath)) {
            out.write(audioData);
        }
        return filePath;
    }
}

聚合一个 service 调用


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Slf4j
@Service
public class TransService {
    @Autowired
    private OSSService ossService;

    @Autowired
    private TTSService ttsService;

    public String tans(String text) {
        try {
            String filePath = ttsService.convertTextToSpeech(text);
            ossService.uploadToOSS(filePath);
            log.info("filePath: {}", filePath);
            log.info("上传成功");
            return filePath;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

没写 controller 直接单元测试调一下

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.io.IOException;


@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class TTSServiceTest {

    @Autowired
    private TransService transService;

    @Test
    public void convertTextToSpeech() throws IOException {

        //随机返回一个成语
        String url = transService.tans("吭哧瘪肚");
        log.info(url);
    }
}

参考

百度 ai 模块挺强大,使用的文本合成语音,还能微调。
https://cloud.baidu.com/doc/SPEECH/s/mlbxh7xie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值