语音文件上传正式
This commit is contained in:
parent
de5fa9030f
commit
d2ec25cfb0
7
pom.xml
7
pom.xml
@ -98,7 +98,12 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<version>5.2.2.RELEASE</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
@ -1,11 +1,20 @@
|
|||||||
package club.joylink.rtss.services;
|
package club.joylink.rtss.services;
|
||||||
|
|
||||||
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
|
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
|
||||||
|
import club.joylink.rtss.util.JsonUtils;
|
||||||
|
import club.joylink.rtss.vo.CommonJsonResponse;
|
||||||
import club.joylink.rtss.vo.client.VoiceRecognitionResult;
|
import club.joylink.rtss.vo.client.VoiceRecognitionResult;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import net.bytebuddy.utility.RandomString;
|
import net.bytebuddy.utility.RandomString;
|
||||||
|
import org.springframework.core.io.FileSystemResource;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
|
import org.springframework.util.MultiValueMap;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@ -14,13 +23,14 @@ import java.util.Objects;
|
|||||||
|
|
||||||
public interface IVoiceService {
|
public interface IVoiceService {
|
||||||
String AudioFileBasePath = "/usr/local/joylink/jlcloud/audio/";
|
String AudioFileBasePath = "/usr/local/joylink/jlcloud/audio/";
|
||||||
|
|
||||||
static String getFilePath() {
|
static String getFilePath() {
|
||||||
LocalDate now = LocalDate.now();
|
LocalDate now = LocalDate.now();
|
||||||
String datePath = now.getYear() + File.separator + now.getMonthValue() + File.separator + now.getDayOfMonth();
|
String datePath = now.getYear() + File.separator + now.getMonthValue() + File.separator + now.getDayOfMonth();
|
||||||
String fileName = System.currentTimeMillis() + "-" + RandomString.make() + ".wav";
|
String fileName = System.currentTimeMillis() + "-" + RandomString.make() + ".wav";
|
||||||
String directoryPath = AudioFileBasePath + datePath;
|
String directoryPath = AudioFileBasePath + datePath;
|
||||||
File directory = new File(directoryPath);
|
File directory = new File(directoryPath);
|
||||||
if(!directory.exists()) {
|
if (!directory.exists()) {
|
||||||
directory.mkdirs();
|
directory.mkdirs();
|
||||||
}
|
}
|
||||||
String filePath = directoryPath + File.separator + fileName;
|
String filePath = directoryPath + File.separator + fileName;
|
||||||
@ -29,6 +39,7 @@ public interface IVoiceService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存语音文件
|
* 保存语音文件
|
||||||
|
*
|
||||||
* @param inputStream 此方法结束时会进行关闭
|
* @param inputStream 此方法结束时会进行关闭
|
||||||
* @return
|
* @return
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
@ -46,33 +57,63 @@ public interface IVoiceService {
|
|||||||
}
|
}
|
||||||
saveFile = new File(filePath);
|
saveFile = new File(filePath);
|
||||||
} finally {
|
} finally {
|
||||||
if(Objects.nonNull(inputStream)) {
|
if (Objects.nonNull(inputStream)) {
|
||||||
inputStream.close();
|
inputStream.close();
|
||||||
}
|
}
|
||||||
if(os != null) {
|
if (os != null) {
|
||||||
os.close();
|
os.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new VoiceFile(filePath.replace(AudioFileBasePath, ""), saveFile);
|
return new VoiceFile(filePath.replace(AudioFileBasePath, ""), saveFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VoiceFile saveFile(MultipartFile multipartFile) {
|
||||||
|
RestTemplate restTemplate = new RestTemplate();
|
||||||
|
String url = "http://joylink.club/jlfile/api/upload/AUDIO?appId=00001&appSecret=joylink00001";
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
|
||||||
|
String fileName = multipartFile.getName();
|
||||||
|
String prefix = fileName.substring(fileName.lastIndexOf("."));
|
||||||
|
File tempFile = null;
|
||||||
|
try {
|
||||||
|
tempFile = File.createTempFile("fileName", prefix);
|
||||||
|
multipartFile.transferTo(tempFile);
|
||||||
|
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
|
||||||
|
map.add("file", new FileSystemResource(tempFile));
|
||||||
|
|
||||||
|
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, map, String.class);
|
||||||
|
String body = responseEntity.getBody();
|
||||||
|
// body = body.replaceAll("\\\\", "/");
|
||||||
|
CommonJsonResponse response = JsonUtils.read(body, CommonJsonResponse.class);
|
||||||
|
BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.assertEquals(200, response.getCode());
|
||||||
|
String path = (String) response.getData();
|
||||||
|
File file = new File("https://joylink.club/oss/joylink" + path);
|
||||||
|
return new VoiceFile(path, file);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.exception("创建文件报错");
|
||||||
|
} finally {
|
||||||
|
if (tempFile != null)
|
||||||
|
tempFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static VoiceFile handleAndSaveFile(MultipartFile file) throws IOException {
|
static VoiceFile handleAndSaveFile(MultipartFile file) throws IOException {
|
||||||
String contentType = file.getContentType();
|
String contentType = file.getContentType();
|
||||||
BusinessExceptionAssertEnum.UNSUPPORTED_FILE_FORMAT.assertTrue(
|
BusinessExceptionAssertEnum.UNSUPPORTED_FILE_FORMAT.assertTrue(
|
||||||
"audio/wave".equals(contentType) || "audio/wav".equals(contentType),
|
"audio/wave".equals(contentType) || "audio/wav".equals(contentType),
|
||||||
String.format("不支持的文件格式[%s]", contentType));
|
String.format("不支持的文件格式[%s]", contentType));
|
||||||
InputStream inputStream = file.getInputStream();
|
// InputStream inputStream = file.getInputStream();
|
||||||
return saveFile(inputStream);
|
return saveFile(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 识别服务器收到的语音文件
|
* 识别服务器收到的语音文件
|
||||||
* @param file
|
|
||||||
* @param lang
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
VoiceRecognitionResult voiceRecognition(MultipartFile file, String lang);
|
VoiceRecognitionResult voiceRecognition(MultipartFile file, String lang);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 语音合成,返回文件路径
|
* 语音合成,返回文件路径
|
||||||
|
*
|
||||||
* @return 文件路径
|
* @return 文件路径
|
||||||
*/
|
*/
|
||||||
String synthesis(String message, String per);
|
String synthesis(String message, String per);
|
||||||
|
@ -5,12 +5,15 @@ import club.joylink.rtss.services.IVoiceService;
|
|||||||
import club.joylink.rtss.vo.client.VoiceRecognitionResult;
|
import club.joylink.rtss.vo.client.VoiceRecognitionResult;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.mock.web.MockMultipartFile;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service("baiDuVoiceService")
|
@Service("baiDuVoiceService")
|
||||||
@ -22,6 +25,9 @@ public class VoiceServiceImpl implements IVoiceService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private TtsService ttsService;
|
private TtsService ttsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RestTemplate restTemplate;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoiceRecognitionResult voiceRecognition(MultipartFile multipartFile, String lang) {
|
public VoiceRecognitionResult voiceRecognition(MultipartFile multipartFile, String lang) {
|
||||||
try {
|
try {
|
||||||
@ -40,7 +46,9 @@ public class VoiceServiceImpl implements IVoiceService {
|
|||||||
public String synthesis(String message, String per) {
|
public String synthesis(String message, String per) {
|
||||||
try {
|
try {
|
||||||
byte[] data = this.ttsService.run(message, per, TokenHolder.getInstance().getToken());
|
byte[] data = this.ttsService.run(message, per, TokenHolder.getInstance().getToken());
|
||||||
VoiceFile voiceFile = IVoiceService.saveFile(new ByteArrayInputStream(data));//生成的音频数据
|
InputStream inputStream = new ByteArrayInputStream(data);
|
||||||
|
MultipartFile file = new MockMultipartFile("语音文件.wav", inputStream);
|
||||||
|
VoiceFile voiceFile = IVoiceService.saveFile(file);//生成的音频数据
|
||||||
return voiceFile.getPath();
|
return voiceFile.getPath();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw BusinessExceptionAssertEnum.THIRD_SERVICE_CALL_EXCEPTION.exception();
|
throw BusinessExceptionAssertEnum.THIRD_SERVICE_CALL_EXCEPTION.exception();
|
||||||
|
Loading…
Reference in New Issue
Block a user