프로젝트/번역 나래이터 [WPF]

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

언휴 2024. 1. 10. 09:20

유튜브 동영상 강의

[WPF] 번역 나래이터 - WrapSpeechLib 만들기

Narrator 소스 코드

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

namespace WrapSpeechLib
{
    ///
    /// 번역 나래이터 클래스
    /// 
    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;
                }
            }
        }

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

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

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

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

        ///
        /// "말하다." 메서드
        /// 
        ///말할 내용
        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);
            }
        }
        ///
        /// "말하다." 비동기 메서드
        /// 
        ///
        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);
            }
        }

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

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

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

테스트 소스 코드

/*https://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 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);
                }
            }
        }
    }
}