需求:
给出一个成语生成语音传到 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