[Spring] Naver Cloud Platform STT 연결

AMUD·2023년 11월 10일
0

etc

목록 보기
5/5


프로젝트에서 STT를 프론트에서 처리할 수 없는 상황이라 백엔드에서 미디어 파일을 받고 STT로 변환된 텍스트를 반환하도록 하였다.

🍀 Application 추가

NAVER CLOUD PLATFORM

  • 위 사이트로 들어가서 오른쪽 상단의 콘솔 을 눌러서 로그인 후, 콘솔에 들어간다.

  • 왼쪽 메뉴에서 ServicesAI,NAVER API 눌러서 제일 상단의 AI, NAVER API 를 누른다.

  • Application 등록 등록을 누른다

  • 이름을 입력하고 CLOVA Speech Recognition을 선택한다.
  • 그리고 하단의 등록하면 되는데, 플랫폼에 맞게 옵션 선택하면 된다.

  • 새로 App이 만들어졌고, 인증 정보 눌러서 Client ID (X-NCP-APIGW-API-KEY-ID) , Client Secret(X-NCP-APIGW-API-KEY) 를 각각 복사해둔다.

🍅 Spring Boot 코드 작성 (JAVA)

application.yml

...

naver:
  cloud:
    id: ${NAVER_CLOUD_ID}
    secrete: ${NAVER_CLOUD_SECRET}

위에서 복사한 키값들을 설정 파일에 추가해둔다.

TmpResponse.java

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class TmpResponse {
    private String text;
}

TmpController.java

@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));
    }
}

TmpService.java

@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);
        }
    }
}

🐇 테스트

  • 간단하게 Postman으로 테스트하니까 잘된다.

🎀 참고

stt (Speech-To-Text)

profile
210's Velog :: Ambition Makes Us Diligent

0개의 댓글