프로젝트에서 STT를 프론트에서 처리할 수 없는 상황이라 백엔드에서 미디어 파일을 받고 STT로 변환된 텍스트를 반환하도록 하였다.
콘솔
을 눌러서 로그인 후, 콘솔에 들어간다.Services
→ AI,NAVER API
눌러서 제일 상단의 AI, NAVER API
를 누른다.Application 등록
등록을 누른다등록
하면 되는데, 플랫폼에 맞게 옵션 선택하면 된다.인증 정보
눌러서 Client ID (X-NCP-APIGW-API-KEY-ID)
, Client Secret(X-NCP-APIGW-API-KEY)
를 각각 복사해둔다....
naver:
cloud:
id: ${NAVER_CLOUD_ID}
secrete: ${NAVER_CLOUD_SECRET}
위에서 복사한 키값들을 설정 파일에 추가해둔다.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class TmpResponse {
private String text;
}
@RestController
@RequiredArgsConstructor
public class TmpController {
private final TmpService tmpService;
@PostMapping("/sound-to-text")
public ResponseEntity<TmpResponse> getTextByFile(@RequestParam("file") MultipartFile file) {
return ResponseEntity.ok(tmpService.getTextByFile(file));
}
}
@Service
@RequiredArgsConstructor
public class TmpService {
private final NaverCloudClient naverCloudClient;
public TmpResponse getTextByFile(MultipartFile file) {
try {
File convFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
convFile.createNewFile();
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
String response = naverCloudClient.soundToText(convFile);
return new TmpResponse(response);
} catch (Exception e) {
throw new InvalidFileNameException("잘못된 파일", null);
}
}
@Component
public class NaverCloudClient {
private final ObjectMapper objectMapper;
@Value("${naver.cloud.id}")
String CLIENT_ID;
@Value("${naver.cloud.secret}")
String CLIENT_SECRET;
private final WebClient webClient;
public NaverCloudClient(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
this.webClient = WebClient.builder()
.baseUrl("https://naveropenapi.apigw.ntruss.com")
.build();
}
public String soundToText(File file) {
try {
byte[] fileContent = Files.readAllBytes(file.toPath());
String language = "Kor";
Mono<String> responseMono = webClient.post()
.uri(uriBuilder -> uriBuilder.path("/recog/v1/stt")
.queryParam("lang", language)
.build())
.header("X-NCP-APIGW-API-KEY-ID", CLIENT_ID)
.header("X-NCP-APIGW-API-KEY", CLIENT_SECRET)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.bodyValue(fileContent)
.retrieve()
.bodyToMono(String.class)
.map(this::getTextFromResponse);
return responseMono.block();
} catch (Exception e) {
System.out.println(e);
return null;
}
}
private String getTextFromResponse(String responseStr) {
try {
return objectMapper.readValue(responseStr, MediaTextResponse.class).getText();
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}