프로젝트/번역 나래이터 만들기

Kakao 번역 API와 .NET 음성 Speech를 이용한 번역 나래이터 만들기[WPF] - 2. 번역 나래이터 라이브러리 제작하기

언제나휴일 2020. 4. 29. 16:10
반응형

 

이전 강의에서 Kakao API를 이용하여 번역 라이브러리를 만들었어요.
이번 강의는 번역 라이브러리와 음성 Speech를 이용하여 번역 나래이터 라이브러리를 만듭니다.

참조할 라이브러 및 작성한 라이브러리.zip
0.01MB

WrapSpeechLib 이름의 클래스 라이브러리로 제작합니다. 디폴트로 제공하는 파일이름을 Narrator.cs로 변경합니다.

WrapKakaoLib.dll 파일을 참조 추가하세요.

System.Speech 어셈블리를 참조 추가하세요.

Narrator.cs

using System.Collections.Generic;
using System.Globalization;
using System.Speech.Synthesis;
using WrapKakaoLib;

namespace WrapSpeechLib
{
    /// <summary>
    /// 번역 나래이터 클래스
    /// </summary>
    public class Narrator
    {
        static SpeechSynthesizer speecher = new SpeechSynthesizer();
        static Dictionary<LanguageInfo, InstalledVoice> voice_dics = new Dictionary<LanguageInfo, InstalledVoice>();

        static Narrator()
        {
            foreach (InstalledVoice voice in speecher.GetInstalledVoices())
            {
                if (voice.VoiceInfo.Culture.Name == "en-US")
                {
                    voice_dics[LanguageInfo.en] = voice;
                }
                if (voice.VoiceInfo.Culture.Name == "ko-KR")
                {
                    voice_dics[LanguageInfo.kr] = voice;
                }
            }
        }

        /// <summary>
        /// 나래이터 이름 - 가져오기
        /// </summary>
        public string Name
        {
            get;
            private set;
        }
        /// <summary>
        /// 나래이터 지역 정보 - 가져오기
        /// </summary>
        public CultureInfo CultureInfo
        {
            get;
            private set;
        }
        /// <summary>
        /// 인사말 - 가져오기 및 설정하기
        /// </summary>
        public string Introduce_msg
        {
            get;
            set;
        }
        /// <summary>
        /// 지역화 이름 - 가져오기
        /// </summary>
        public string CultureName
        {
            get
            {
                return CultureInfo.Name;
            }
        }
        /// <summary>
        /// 지역화 디스플레이 이름 - 가져오기
        /// </summary>
        public string DisplayName
        {
            get
            {
                return CultureInfo.DisplayName;
            }
        }

        /// <summary>
        /// 나래이터 생성자
        /// </summary>
        /// <param name="ivoice">설치된 음성</param>
        public Narrator(InstalledVoice ivoice)
        {
            Name = ivoice.VoiceInfo.Name;
            //speecher.SelectVoice(Name);
            CultureInfo = ivoice.VoiceInfo.Culture;
            Introduce_msg = string.Format("안녕하세요. 저의 이름은 {0}입니다.", Name);
        }

        /// <summary>
        /// "소개하다." 메서드
        /// </summary>
        public void Introduce()
        {
            Speak(Introduce_msg);
        }

        /// <summary>
        /// "소개하다." 비동기 메서드
        /// </summary>
        public void IntroduceAsync()
        {
            SpeakAsync(Introduce_msg);
        }

        /// <summary>
        /// "말하다." 메서드
        /// </summary>
        /// <param name="msg">말할 내용</param>
        public void Speak(string msg)
        {
            speecher.SelectVoice(Name);
            if (CultureInfo.Name == "ko-KR")
            {
                speecher.Speak(msg);
            }
            else if (CultureInfo.Name == "en-US")
            {
                string result = KakaoTransAPI.Translate(msg);
                speecher.Speak(result);
            }
        }
        /// <summary>
        /// "말하다." 비동기 메서드
        /// </summary>
        /// <param name="msg"></param>
        public void SpeakAsync(string msg)
        {
            speecher.SelectVoice(Name);
            if (CultureInfo.Name == "ko-KR")
            {
                speecher.SpeakAsync(msg);
            }
            else if (CultureInfo.Name == "en-US")
            {
                string result = KakaoTransAPI.Translate(msg);
                speecher.SpeakAsync(result);
            }
        }

        /// <summary>
        /// 라이브러리 제공 나래이터 컬렉션 - 가져오기
        /// </summary>
        public static List<Narrator> Narrators
        {
            get
            {
                int max = (int)LanguageInfo.MAX_LI;
                List<Narrator> narrators = new List<Narrator>();
                Narrator narrator;
                for (int i = 0; i < max; i++)
                {
                    narrator = MakeNarator((LanguageInfo)i);
                    if (narrator != null)
                    {
                        narrators.Add(narrator);
                    }
                }
                return narrators;
            }
        }

        /// <summary>
        /// "나래이터 생성" 정적 메서드
        /// </summary>
        /// <param name="li">지역 정보</param>
        /// <returns>나래이터</returns>
        public static Narrator MakeNarator(LanguageInfo li)
        {
            if (voice_dics.ContainsKey(li))
            {
                return new Narrator(voice_dics[li]);
            }
            return null;

        }
        /// <summary>
        /// ToString 재정의
        /// </summary>
        /// <returns>이름+디스플레이 이름</returns>
        public override string ToString()
        {
            return string.Format("{0}:{1}", Name, DisplayName);
        }
    }
}

 


위에 작성한 라이브러리를 테스트하는 코드

Program.cs

/*                                                                                                                                                          http://ehpub.co.kr
 *                                                                                                    카오 번역 API와 .NET 음성 Speech 기술을 Mash-up ***
 *                                                                                                    번역 나래이터 만들기 - 언제나 WPF 프로젝트  ********
 *                                                                                                    2. WrapSpeechLib             *************************
 */

using System;
using System.Collections.Generic;
using WrapSpeechLib;

namespace WrapNarrator_예광탄
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadLine();
            List<Narrator> narrators = Narrator.Narrators;

            foreach (Narrator narrator in narrators)
            {
                narrator.Introduce();
            }            
            Console.WriteLine("원하는 문장을 입력하면 읽어주고 번역도 해 줘요.");
            string str = string.Empty;
            while (str != "끝")
            {
                str = Console.ReadLine();
                foreach (Narrator narrator in narrators)
                {
                    narrator.Speak(str);
                }
            }
        }
    }
}

 

 

 

Kakao 번역 API와 .NET 음성 Speech를 이용한 번역 나래이터 만들기 3. WrapSpeechLib 만들기[C#] – 언제나 휴일

안녕하세요. 언제나 휴일, 언휴예요. 이전 강의에서 Kakao API를 이용하여 번역 라이브러리를 만들었어요. 이번 강의에서는 .NET 음성 Speech 기술을 접목하여 WrapSpeechLib를 만들어 봅시다. WrapSpeechLib에는 입력한 내용을 번역하여 읽어주는 Narrator 클래스를 정의할 거예요. 이전 강의에서 만든 WrapKakaoLib 어셈블리와 System.Speech 어셈블리를 참조하세요. 작성할 클래스는 Narrator라고 정할게

ehpub.co.kr

 

반응형