Kakao 번역 API와 .NET 음성 Speech를 이용한 번역 나래이터 만들기 3. WrapSpeechLib 만들기[C#]
언휴2024. 1. 10. 09:20
유튜브 동영상 강의
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);
}
}
}
}
}