android studio

[안드로이드] 클로바 보이스api 레트로핏으로 쉽게 tts어플만들기

공부짱짱열심히하기 2023. 4. 3. 13:01

https://console.ncloud.com/naver-service/application

 

 

 

안드로이드 패키지 이름 등록후 카드등록만 되어있으면 api key발급 완료

 

인증정보를 확인해보면 클라이언트id와 클라이언트 시크릿키가 발급됨

 


기본세팅

레트로핏으로 rest api를 활용할꺼기 때문에

레트로핏 기본세팅

 

매니페스트

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

gradle 모듈

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")

 

 


네이버 클로바 세팅

https://api.ncloud-docs.com/docs/ai-naver-clovavoice

 

CLOVA Voice 개요

 

api.ncloud-docs.com

 

https://api.ncloud-docs.com/docs/ai-naver-clovavoice-ttspremium

 

tts (Premium)

 

api.ncloud-docs.com

 

호출받을 API URL ,요청 헤더,요청 파라미터 필요

api호출 정보를위한 api class 생성

public  interface ClovaVoiceService {

    @POST("tts")
    @Headers({
            "Content-Type: application/x-www-form-urlencoded",
            "X-NCP-APIGW-API-KEY-ID: {니가 발급받은거}",
            "X-NCP-APIGW-API-KEY:{니가 발급받은거}"
    })
    @FormUrlEncoded
    Call<ResponseBody> synthesize(@Field("speaker") String speaker, //목소리(이름선택)
                                  @Field("speed") int speed,    //속도(-로 갈수록 빨라짐)
                                  @Field("volume") int volume, //소리 크기(클수록커짐)
                                  @Field("pitch") int pitch, //음역대? -로갈수록 외계인소리
                                  @Field("emotion-strength") int emotion, //감정표현
                                  @Field("alpha") int alpha, //음색 높을수록 하이톤
                                  @Field("end-pitch") int enpitch, //끝음처리 -로갈수록 끝음내리고 +일수록 올림
                                  @Field("text") String text);

}

 파라미터는 본인이 필요한 거만 집어넣어도됨(단 스피커와 텍스트는필수)

 

레트로핏 연결

public class ClovaNetworkClient {

    public static Retrofit retrofit;

    public static Retrofit getRetrofitClient(Context context){
        if(retrofit == null){
            // 통신 로그 확일할때 필요한 코드
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);


            // 네트워크 연결관련 코드
            OkHttpClient httpClient = new OkHttpClient.Builder().connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(1,TimeUnit.MINUTES)
                    .writeTimeout(1,TimeUnit.MINUTES)
                    .addInterceptor(loggingInterceptor)
                    .build();

            // 네트워크로 데이터를 보내고 받는 레트로핏 라이브러리 관련 코드
            retrofit = new Retrofit.Builder()
                    .baseUrl("https://naveropenapi.apigw.ntruss.com/tts-premium/v1/")
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

당연히 baseUrl은 하드코딩안하고 config에 domain에 변수로 저장해서 사용하길 권장

 


네이버는 아주 친절하게 코드가 소개되어있기때문에 복사해서 그대로 사용해도 금방 활용 가능

 

 

레트로핏 코드

 public void clova() {

        Retrofit retrofit = 레트로핏class.호출함수(사용하는액티비티.this);
        ClovaVoiceService api = retrofit.create(사용하는액티비티.class);


        Call<ResponseBody> call = api.synthesize("nbora", -1,2 ,1,2,0,1,"안녕하세요, 네이버 클로바 보이스입니다.");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                if (response.isSuccessful()) {
                    try {
                        File tempMp3 = File.createTempFile("temp","mp3",getCacheDir());
                        tempMp3.deleteOnExit();;

                        InputStream inputStream = response.body().byteStream();
                        FileOutputStream fos = new FileOutputStream(tempMp3);
                        byte[] buffer = new byte[1024];
                        int read;
                        while ((read = inputStream.read(buffer))!=-1){
                            fos.write(buffer,0,read);
                        }
                        fos.flush();
                        fos.close();
                        inputStream.close();

                        MediaPlayer mediaPlayer = new MediaPlayer();
                        mediaPlayer.setDataSource(tempMp3.getPath());
                        mediaPlayer.prepare();
                        mediaPlayer.start();

                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }


            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                t.printStackTrace();
                Log.d("TAG", "onFailure: " + t.getMessage());
            }
        });


    }

아주 기본적으로 필요한거만 집어넣은 코드

호출파라미터를 모두 변수로 만들어서 여러 목소리나 속도,멘트등을 조절하기를 권장