[VB.net]네이버 클로바 음성 합성 기술 API 사용법 (Clova Speech Synthesis : CSS)

2017. 11. 15. 00:30Programming/VB.net

안녕하세요! Nitro입니다.

오늘 여러분깨 설명해 드릴 내용은..

네이버 클로바 API 사용법인데요!


클로바 관련된 3가지 API중, 텍스트를 소리로 바꾸어주는 TTS API인

Clova Speech Synthesis : CSS API의 사용법을 알아보도록 하겠습니다.


CSS API란?

Clova Speech Synthesis API(이하 CSS API)는 음성으로 변환할 텍스트를 입력받은 후,

파라미터로 지정된 음색과 속도로 음성을 합성하여 그 결과를 반환합니다.

CSS API는 HTTP 기반의 REST API이며, 사용자 인증(로그인)이 필요하지 않은 비로그인 Open API입니다.

일단 비로그인이라고 해도, API신청은 불가피합니다.

https://clova.ai/ko/ko-platform-api.html

위 링크로 가셔서 Clova Speech Synthesis API의 등록신청을 해주세요.


그럼 위와 같은 이미지가 나타나게 될것인데, 위처럼 적당히 입력해주고 등록해주시면 됩니다.


API 사용하기

CSS API는 REST 기반의 API입니다.

따라서 음성으로 출력할 내용의 텍스트를 HTTP로 POST 해주면 됩니다.

(다음과 같은 방식입니다 : https://openapi.naver.com/v1/voice/tts.bin)

이 과정에서 필요한것이  Client IDClient Secret 입니다.

Client IDClient Secret, 합성시킬 데이터를 다음과 같은 양식으로 서버에 제출합니다.

 

[HTTP Request Header]

POST /v1/voice/tts.bin HTTP/1.1

Host: openapi.naver.com

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

X-Naver-Client-Id: {앱 등록 시 발급받은 Client ID}

X-Naver-Client-Secret: {앱 등록 시 발급 받은 Client Secret}


[HTTP Request Body]

speaker=mijin&speed=0&text=만나서 반갑습니다.


위와 같은 양식이 정상적으로 제출되었을 경우, 클로버 측에서는 텍스트를 음성으로 합성시켜 mp3 형태로 넘겨주게 됩니다.


[HTTP Response Header]

HTTP/1.1 200 OK

Server: nginx

Date: Wed, 28 Sep 2016 06:51:49 GMT

Content-Type: audio/mpeg;charset=utf-8

Content-Length: 19794

Connection: keep-alive

Keep-Alive: timeout=5

X-QUOTA: 10


[HTTP Response Body]

{MP3 형식의 바이너리 데이터}


위와 같은 값을 반환받게 됩니다.


합성할 텍스트를 보네는 방법은 알려드렸고, 다음은 옵션입니다.

 파라미터 이름

 타입

 설명

 필수 여부

 speaker

 string

 음성 합성에 사용할 목소리 종류

    • mijin : 한국어, 여성 음색
    • jinho : 한국어, 남성 음색
    • clara : 영어, 여성 음색
    • matt : 영어, 남성 음색
    • yuri : 일본어, 여성 음색
    • shinji : 일본어, 남성 음색
    • meimei : 중국어, 여성 음색
    • liangliang : 중국어, 남성 음색
    • jose : 스페인어, 남성 음색
    • carmen : 스페인어, 여성 음색

 필수

 speed

 integer

 음성 재생 속도. -5에서 5 사이의 정수 값이며, -5이면 0.5배 빠른 속도이고 5이면 0.5배 느린 속도입니다. 0이면 정상 속도의 목소리로 음성을 합성합니다.

 필수

 text

 string

 음성 합성할 문장. UTF-8 인코딩된 텍스트만 지원합니다. CSS API는 최대 5000자의 텍스트까지 음성 합성을 지원합니다.

 필수

언어에 따라 목소리를 달리 할 수 있으며, 남성, 여성 선택 가능합니다.

속도또한 조절할 수 있고, 글자는 한번다 최대 5000자까지 가능합니다.

뭐 글자수가 아니라 시간에 따라 API 한도를 결정하는 방식이기에 딱히 필요 없을듯 합니다.


기능

text 필드에 음성 합성할 문장을 입력할 때,

쉼표(,)를 넣으면 음성 합성 결과에서 해당 부분을 조금 쉬었다가 말하게 되며,

마침표와 개행 문자를 연속 입력(.\n)하면 구분된 문장으로 합성 결과를 보내줍니다.

예를 들면, 다음은 두 문장으로 구분되며, 첫 번째 문장의 쉼표에서 한번 쉬었다가 읽게됩니다.


'그는 방으로 들어가고, 그녀는 집 밖으로 나갔다.\n이유는 알 수 없었다.'


오류코드

오류 코드

HTTP 응답 코드

오류 메시지

설명

VS01

400

speaker parameter is needed.

speaker 파라미터가 누락되었습니다.

VS02

400

Unsupported speaker.

speaker 파라미터에 지원하지 않는 값이 입력된 경우 발생합니다.

VS03

400

speed parameter is needed.

speed 파라미터가 누락되었습니다.

VS04

400

Unsupported speed.

speed 파라미터에 지원하지 않는 값이 입력된 경우 발생합니다.

VS05

400

text parameter is needed.

text 파라미터가 누락되었습니다.

VS06

400

text parameter exceeds max length.

text 파라미터에 입력할 수 있는 최대 글자 수를 초과했습니다.

VS99

500

Internal server error

서버 내부 오류가 발생했습니다.

포럼에 문의하시면 신속히 조치하겠습니다.

네이버 만의 특징인지 응답코드는 거의 동일합니다.

오류나면 직접 뜯어보셔야해요.


다음은 소스코드인데요.

자바, PHP, Node.js, 파이썬, C#, cURL 등이 있습니다만.

역시나 VB.net은 없습니다.


일단 가장 비슷한 C#코드를 들고와봅시다.

using System;
using System.Net;
using System.Text;
using System.IO;

namespace NaverAPI_Guide
{
    public class APIExamTTS
    {
        static void Main(string[] args)
        {
            string text = "좋은 하루 되세요."; // 음성합성할 문자값
            string url = "https://openapi.naver.com/v1/voice/tts.bin";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("X-Naver-Client-Id", "YOUR-CLIENT-ID");
            request.Headers.Add("X-Naver-Client-Secret", "YOUR-CLIENT-SECRET");
            request.Method = "POST";
            byte[] byteDataParams = Encoding.UTF8.GetBytes("speaker=mijin&speed=0&text=" + text);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteDataParams.Length;
            Stream st = request.GetRequestStream();
            st.Write(byteDataParams, 0, byteDataParams.Length);
            st.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string status = response.StatusCode.ToString();
            Console.WriteLine("status="+ status);
            using (Stream output = File.OpenWrite("c:/tts.mp3"))
            using (Stream input = response.GetResponseStream())
            {
                input.CopyTo(output);
            }
            Console.WriteLine("c:/tts.mp3 was created");
        }
    }
}

VB.net과 C#은 거의 비슷한 구조를 가지고 있어, 쉽게 변환이 가능합니다.


Imports System.Net Imports System.Text Imports System.IO ... Function Speake(text) Dim url As String = "https://openapi.naver.com/v1/voice/tts.bin" Dim request As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest) request.Headers.Add("X-Naver-Client-Id", "YOUR-CLIENT-ID") request.Headers.Add("X-Naver-Client-Secret", "YOUR-CLIENT-SECRET") request.Method = "POST" Dim byteDataParams As Byte() = Encoding.UTF8.GetBytes(Convert.ToString("speaker=mijin&speed=0&text=") & text) request.ContentType = "application/x-www-form-urlencoded" request.ContentLength = byteDataParams.Length Dim st As Stream = request.GetRequestStream() st.Write(byteDataParams, 0, byteDataParams.Length) st.Close() Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse) Dim status As String = response.StatusCode.ToString() Console.WriteLine(Convert.ToString("status=") & status) Using output As Stream = File.OpenWrite(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\tts.mp3") Using input As Stream = response.GetResponseStream() input.CopyTo(output) End Using End Using Console.WriteLine("c:/tts.mp3 was created") Return Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\tts.mp3" End Function

위와 같이 변환됩니다.

Environment.GetFolderPath(Environment.SpecialFolder.Desktop)를 이용하여 저는 C드라이브가 아닌,

바탕화면에 tts.mp3 파일이 다운받아지도록 해두었습니다.

Function 으로 입력했기때문에 Return 값으로 경로를 얻으실 수 있습니다.


추가적인 팁으로 소리를 폼에서 출력할려면,

도구상자 우클릭 -  항목 선택 - COM 구성 요소 - Windows Media Player를 채크해줍니다.

적당히 Textbox와 button을 하나씩 추가시켜주고

Imports WMPLib

    ...

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim Player As WindowsMediaPlayer = New WindowsMediaPlayer
        Player.URL = Speake(TextBox1.Text)
        Player.controls.play()
    End Sub

위와 같은 이벤트를 추가시켜줍니다.


그러면 Textbox에다가 TTS할 글자를 적어주시고 버튼을 눌렀을때 음성이 자동 실행됩니다!

주의 하셔야 할점은... mp3를 바탕화면에 저장할때, File.OpenWrit를 이용하기 때문에, 파일이 겹칩니다.

"안녕하세요"를 먼저 한번 뽑고, "하이" 를 뽑으면, "하이하세요" 같은 느낌으로 글자가 겹칩니다.

그러니, 버튼이밴트에서 음성출력이 완료되면 파일을 지워줘야 합니다!


제가 구성한 전채 소스는 아레와 같습니다.

Imports System.Net
Imports System.Text
Imports System.IO
Imports WMPLib
Public Class Form1
    Function Speake(text)
        Dim url As String = "https://openapi.naver.com/v1/voice/tts.bin"
        Dim request As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
        request.Headers.Add("X-Naver-Client-Id", "YOUR-CLIENT-ID")
        request.Headers.Add("X-Naver-Client-Secret", "YOUR-CLIENT-SECRET")
        request.Method = "POST"
        Dim byteDataParams As Byte() = Encoding.UTF8.GetBytes(Convert.ToString("speaker=mijin&speed=0&text=") & text)
        request.ContentType = "application/x-www-form-urlencoded"
        request.ContentLength = byteDataParams.Length
        Dim st As Stream = request.GetRequestStream()
        st.Write(byteDataParams, 0, byteDataParams.Length)
        st.Close()
        Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
        Dim status As String = response.StatusCode.ToString()
        Console.WriteLine(Convert.ToString("status=") & status)
        Using output As Stream = File.OpenWrite(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\tts.mp3")
            Using input As Stream = response.GetResponseStream()
                input.CopyTo(output)
            End Using
        End Using
        Console.WriteLine("c:/tts.mp3 was created")
        Return Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\tts.mp3"
    End Function
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim Player As WindowsMediaPlayer = New WindowsMediaPlayer
        Player.URL = Speake(TextBox1.Text)
        Player.controls.play()
    End Sub
End Class


다운로드

Voice(네이버).zip


참고

https://developers.naver.com/docs/clova/api/#/CSS/API_Guide.md#Preparation

네이버가 클로버 번역기 만들더니 참된것(?)을 많이 만들어주네요.

좋습니다.

개인적으로 샐리(인공지능 스피커)를 소유하고있는지라 기계목소리에 민감한데, 같은 네이버 같은 TTS이지만,

샐리가 이것보다 더 자연스럽네요.

(에초에 목소리도 다른듯...;;)


뭐 이런느낌으로! 오늘 포스팅도 여기까지입니다!

다음포스팅에서 뵙시다.

빠빠~


본 강좌는 Visual Studio 2017년 버전을 기준으로 작성되었습니다.


반응형