이번 포스트는 마이크로소프트 IoT Device의 걸작! AI 스피커의 기대주인 하만/카돈 인보크 AI 스피커 설치 및 실행기 입니다.

이렇게 쓰고, 삽질기라고 부르기는 하지만;;;


어제 설치하고 사용한다고 이제서야 동영상 편집하고 올립니다. PPT는 없습니다. 그냥 MS의 AI 스피커가 이런거구나 하고 재미로 보시면 될 것 같습니다. 참 채널에 구독 신청하시면 더 빨리 올라가는 동영상을 확인 하실 수 있습니다~


유튜브 채널 바로가기


즐감 하세용~



블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/


이번 포스트는 얼마전 대한민국 정부에서 AI 서비스 개발을 지원하기 위해 오픈한 AI 오픈 이노베이션 허브에서 제공하는 한글 음성 인식 기능을 이용해서 한글 인식을 하는 방법에 대한 내용입니다.


개발 가이드를 보면 Java, PHP, C++, Python Node.js를 이용한 예제가 존재 합니다.  그런데, C# 예제가 존재 하지 않아 직접 삽질을 했습니다.


이 API는 상업용 목적으로 사용하기 위해서는 기술 이전을 받아야 하고, 일반 업무용 목적의 사용이라면, 1일기준 제한된 범위에서 특별한 제약이 없이 사용이 가능하다고 합니다.


우선 이런 좋은 서비스를 Open API 형태로 제공해 준 여러 관계자 분들께 감사드리고 싶습니다. 이 API를 이용하면 좀더 쉽게 한글 음성 인식을 지원하는 앱 개발이 가능할 것 같습니다. 


동영상을 보시기 전에 채널 구독 먼저 부탁드립니다~ 유튜브 채널 바로가기



PPT


aihub.pptx


블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/



Windows 10 IoT Core에 음성으로 명령을 내려서 음악을 재생, 다음곡, 이전곡, 장르 검색의 기능을 수행하는 UWP 앱을 개발하는 과정을 동영상으로 만들었습니다. 개발 소스, 동영상, ppt를 참고하시면 여러분도 멋진 앱을 만드실 수 있을 것이라고 생각합니다.


감상하시기 전에 유튜브 채널 구독 신청 부탁드립니다~. 유튜브 채널 바로가기



완성된 앱 시연 영상




Part 1


* 환경 및 준비
* 참고 자료
* Media Player
* SRGS
* IoT Player with voice commands
* Begin Playback
* PC 환경 설정 확인
* 앱 개발 순서
* 뮤직 플레이 페이지 구현 로직




Part 2


* 프로젝트 추가
* package.appmanifest 설정
* 앱 초기화 모듈 구현
- 외장 디스크 연결 확인
- 일단 음악 재생이 되도록 작업
* MediaPlayerViewModel.cs
- Navigation_Navigated 구현
- 음성 인식 초기화
- MediaPlayerElement 초기화




Part 3


* SRGS 만들기
- begin playback
* MediaPlayerViewModel.cs
- SRGS 파일 불러와서 음성 인식 컴파일
* 시작 페이지를 MediaPlayerPage로 변경
* MediaPlayerViewModel.cs
- 시작하면서 음성 인식 시작 하도록
- 음성 인식 후 넘어오는 데이터 확인
- tag에 ECMAScript를 이용해서 반환 결과 변경
- 음성 인식 결과 확인
- 음성 인식 결과를 action에 넣어서 어떤 명령인지 구분해서 명령 실행
- BeginPlaybackAsync() 실행
- DispatcherHelper 초기화, 사용
- 결과 확인




Part 4


* 음성 입력 대기 상태 구현 및 음성 명령 종류에 따른 분기 처리 시작
* SRGS에 기능 추가
- pause playback
- MediaPlayerViewModel에도 pause playback 구현
- stop playback
- next playback
- previous playback
* MediaPlayerPage.xaml 디자인 작업
- Binding




Part 5


* Begin playback 구현
* MediaPlayerViewModel.cs
- InitPlaylistAsync()
- 외장 드라이브에서 파일 목록 가지고오도록...
- BeginPlaybackAsync() 수정
- GetMusicPropertiesAsync()를 사용해서 타이틀, 앨범, 아티스트, 이미지 출력
- PosterSource 수정
* MediaPlayerBehavior 추가 및 구현
- CurrentPlaybackState 추가
* MediaPlayerBehavior를 MediaPlayerElement와 연결 - blend
- Binding
* MediaPlayerViewModel.cs
- Init() 수정 - PropertyChanged 추가
* MediaPlayerBehavior 수정
- MediaPlayer를 MediaPlayerElement에 추가




Part 6


* 외장 드라이브에서 파일 목록 가지고 오는 것 포기!! 그래서 Music Library에서 파일 목록을 가지고 오는 방법으로 변경
- SD 카드에 Music Library에 파일 복사하기..
* MediaPlayerViewModel.cs
- CreateFileQueryWithOptions()를 이용해서 파일 필터링과 목록 조회를 동시에
* Pause playback 구현
* CommandMediaPlayer enum 추가
- Messenger를 이용해서 MediaPlayerBehavior에 명령 전달
* MediaPlayerBehavior 수정
- Messenger 구독
- Source 프로퍼티 추가
- ExecuteCommandMediaPlayer 구현




Part 7


** Next, Previous 기능 구현 동영상은 생략 합니다.

(편집했는데..날려서..ㅜㅜ 혹~~~~~~시라도..필요하다고 하시는 분이 계시면..한 10분 정도;; 그러면 다시 편집해서 추가하도록 하겠습니다~)


* 음악 검색 기능 구현
- Filter 추가
* MediaPlayerViewModel.cs
- SelectSourceAsync()
* SRGS.xml 파일에 장르 추가
- 재생 완료 후 다음 곡으로 넘어가는 기능 구현
- ContinuousRecognitionSession_Completed 이벤트 발생 이유에 대해..
* 존재하지 않는 장르를 이야기하면 미친듯이 돌아가는 버그!! 잡아주세요




PPT


iot-mediaplayer.pptx








블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/



이번 강좌는 지난번에 만들었던 영어 단문 발음 연습 앱에 TTS 기능을 추가해서 좀더 효과적인 학습앱 개발을 하는 것 입니다.

TTS는 글씨를 음성으로 변경해서 스피커를 통해서 들려주는 서비스로, 우리 주위에서 상당히 많이 사용되고 있는 기술 입니다. Windows에서는 기본적으로 한글 음성 서비스를 지원하고 있기 때문에 손쉽게 이런 기능을 구현 할 수 있습니다.



유튜브 채널 구독 신청 plz~



* 라즈베리파이3에 한국어 음성 파일 설치하기




완성 앱 데모







Part 1


* 환경 및 준비
* 참고 자료
* TTS, Text-To-Speech Service
* TTS, Text-To-Speech
* SSML Element
* TTS - Demo
* 영어 단문 발음 연습 앱 V2
* PC 환경 설정 확인
* 앱 개발 순서
* 음성 출력 방법
* 단문 발은 연습 페이지 구현 로직




Part 2


* 단문 초기화 기능 구현
* cvs 파일 프로젝트에 추가
* 단문 헬퍼 파일 추가, 구현
* CommonHelper 추가, 구현
* Singleton을 이용해서 싱글톤 인스턴스 만들어서 사용하기




Part 3


* 단문 연습 페이지 구현 - 시작 버튼 클릭 시 단문 하나 선택 하기 구현
* MainPage.xaml 화면 구현
* MainViewModel.cs 구현
- 커맨드 추가
- ShowText, Result 프로퍼티 추가 및 디자인 타임 데이터 연결
- 화면에 바인딩
- 화면에 MediaElement 컨트롤 추가
* Blend를 이용해서 커맨드와 MediaElement 연결
* MainPage.xaml 화면 추가 구현
* MainViewModel.cs 추가 구현
- Init() 구현
- NavigationServiceEx 인스턴스 가지고 와서 이벤트 연결
- NavigationService_Navigated 이벤트 핸들러 구현
- 시작 버튼 클릭 시 단문 하나 선택하기 구현




Part 4


* 단문 연습 페이지 구현 - 음성 출력 구현
* MainViewModel.cs 추가 구현
- SpeechSynthesizer 인스턴스 생성 및 초기화
- 음성 스트림 생성
- Voice 목록에서 한국어, 영어 두개의 voice 찾아서 사용
- 음성 스트림 출력
* MediaBehavior 추가 및 구현
* Blend를 이용해서 MediaBehavior를 MediaElement와 연결
* MediaElement에 바인딩 수정




Part 5


* 단문 연습 페이지 구현 - 음성 입력 받기와 결과 표시
* MainViewModel.cs 에 음성 입력 받기 구현
- MediaEndedCommand가 실행 된 후 로직 구현
- RecognizeWithUIAsync를 사용해서 음성 입력 받기
- UIOptions 수정




Part 6


* 단문 연습 페이지 구현 - 틀렸을 경우 처리와 반복 학습 처리 구현
* MainViewModel.cs 추가 구현
- HasStart 프로퍼티로 변경
- 음성 스트림 생성 부분 메소드로 변경
- 한국어일 때와 영문일 때 음성 스트림 생성 방법 다르게 구현
- 음성 입력 부분 메소드로 변경
- 틀렸을 때 영문 음성 출력이 되도록 구현(SSML 사용)
- 영문 음성 시작전 1초의 딜레이 추가
- 반복 학습을 위해 랜덤 단어 선택 부분을 메소드로 변경




Part 7


* 단문 연습 페이지 구현 - 종료 버튼 처리
* Target Version을 변경해서 Property Maker를 이용한다.
* MainPage.xaml 화면 추가 구현
- BoolToVisibilityConverter를 추가해서 버튼 보이기/숨기기 작업




PPT


iot-tts.pptx



블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/



IoT Core에서 동작하는 Speech Recognition에 대한 내용입니다.


ppt작성, 코딩, 촬영, 편집까지.. 시간이 많이 걸리내요.. 아침에 일어나서 바로 시작한 작업인데..밤새고 새벽에..쿨럭..

음성 인식에 대해서 처음 접하시는 분들이 보시고 이해하실 수 있으면 좋겠습니다. 


앞으로 지속적으로 음성 인식과 연결된 주제에 대해서 동영상을 만들려고 합니다. 그 끝에는 어떤 것이 있을까요?

높은 산의 꼭데기만 보고 뛰어서 올라가면 힘이 마니 듭니다. 하지만, 산 아래에서 부터 천천히 꾸준히 올라간다면, 아무리 높은 산이라도 정복 할 수 있습니다. 그러니, 모두 함께 천천히 올라갔으면 좋겠습니다.


마지막, 한가지 작은 부탁이라면, 유튜브 구독자가 좀더 늘었으면 하는..후후

유튜브 채널 바로가기






Part 1


* 환경 및 준비
* 참고 자료
* Speech Recognition Constraints
* Speech Recognition 기초
* SpeechRecognizer
* List of speech recognition supported languages




Part 2


* 영어 말하기 연습 앱 개발
* PC 환경 설정 확인
* 앱 개발 순서
* 프로젝트 생성
* 세팅




Part 3


* 영어 단문을 CSV 파일로 생성
* 생성한 파일 프로젝트 추가하고 빌드시 앱 설치 폴더에 복사되도록 설정
* 파일을 읽어서 ShellPage CaseList 프로퍼티에 추가
* GitHub에 Project생성
* To-do 등록 - issues로 변경

* 브랜치 생성

* PR 생성




Part 4


* 기본 연습 페이지 구현 시작
* MainPage.xaml.cs 코딩
- SpeechAndTTS 셈플 프로젝트 중 Scenario_ListConstraint의 코드를 복사해서 붙여 넣는 방법으로 기본 작업
- OnNavigateTo 코딩
- AudioCapturePermissions 클래스 복사
- InitializeRecognizerAsync 코딩
- CommonHelper 클래스 추가, ShowMessageAsync 추가




Part 5


* 기본 연습 페이지 화면 구현 시작 MainPage.xaml
* MainPage.xaml.cs
- ButtonBase_OnClick 구현
- _speechRecognizer_StateChanged 구현
* 화면 테스트
- ButtonBase_OnClick 수정 : 실패인 경우 메시지 추가
* 라즈베리파이3에 배포 테스트



Part 6

* 심화 연습 페이지 구현
* MainPage.xaml.cs에
- OnNavigatedFrom 구현
- Cleanup 수정
* PredefindedPage.xaml
- MainPage.xaml 디자인 복사
* PredefindedPage.xaml.cs
- field 복사
- MainPage.xaml.cs 코드 복사 후 수정
- InitializeRecognizerAsync 수정
- ButtonBase_OnClick 수정
- ContinuousRecognitionSession_Completed 구현
- _speechRecognizer_HypothesisGenerated 구현
- ContinuousRecognitionSession_ResultGenerated 구현



Part 7

* 심화 연습 페이지 구현
* PredefindedPage.xaml.cs
- _timer 추가 구현
* 테스트
* 라즈베리파이3에 배포 테스트
* 버그 수정
* 마침말



PPT




블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

라즈베리파이에서 한글 음성 출력은 이전 포스트에서 보듯이 나름 간단히 해결을 했습니다. 그런데, 진짜 문제는 음성 인식에서 막혔네요.. 기본적으로 윈도우 10에서 한국어 지원이 원할하지 않기 때문에, 여러가지 시도를 해보았지만, 결국 성공한 것은 Get started with speech recognition using REST API를 이용하는 방법이 였습니다. 



0. 기본적인 내용


UWP를 이용해서 언어 인식하는 작업은 SpeechAndTTS라는 셈플 앱만 보더라도 어렵지 않습니다. 다만, 한글이 정식 지원이 되지 않기 때문이 이러고 있는 것입니다.


Bing Speech이용하는 방법도 사실 Nuget package를 지원하기 때문에 사용하기 쉽습니다.  다만, 라즈베리 파이가 ARM을 사용하기 때문에 ARM에서 실행되는 Nuget package가 없어서 REST API를 이용하는 것입니다.


REST API 셈플대로 하면 간단할 것 같은데...라고 생각하실 수 있을 것 같습니다. 셈플에서는 HttpWebRequest를 이용하였고, 저는 HttpClient를 이용했는데, 이로인해 발생되는 차이점을 극복하는데 시간이 좀 걸렸습니다.


결국 엄청난 삽질의 결과라는 것을..



1. Azure서비스 가입 및 Bing Speech API 구독하기


우선 이 서비스는 Azure의 Cognitive Services 중 Bing Speech API라는 녀석으로, 사용하기 위해서는 여기서 사용자 등록을 해서 인증키를 받아야 합니다.


아래 이미지는 정상적으로 API 키를 발급 받은 모습입니다. 설명에는 20분당 5,000개의 음성 인식을 처리할 수 있고 남은 날짜가 25일이라고 나옵니다. 처음에는 30일이 였습니다.




2. Windows Template Studio를 이용해서 Blank앱을 생성 합니다.


Windows Template Studio에 대한 포스트는 블로그 검색으로 찾으시면 쉽게 하실 수 있습니다.


이번에 가을 업데이트가 되면서 버전이 올라가서 전에는 보이지 않던, Caliburn.Micro가 추가 되어 있습니다. MVVM Basic를 선택하시고 Next를 누르시고, 페이지는 추가하지 않고, 완료를 해서 프로젝트를 생성 합니다.




3. 화면 디자인


MainViewModel를 DataContext에 연결하고, 버튼 2개와 택스트 박스를 추가해 넣었습니다.


<Page
    x:Class="IoTSampleWithWTS.Views.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:viewModels="using:IoTSampleWithWTS.ViewModels"
    Style="{StaticResource PageStyle}"
    mc:Ignorable="d">
    <Page.DataContext>
        <viewModels:MainViewModel />
    </Page.DataContext>

    <Grid
        x:Name="ContentArea"
        Margin="{StaticResource MediumLeftRightMargin}">

        <Grid.RowDefinitions>
            <RowDefinition x:Name="TitleRow" Height="48" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <TextBlock
            x:Name="TitlePage"
            x:Uid="Main_Title"
            Style="{StaticResource PageTitleStyle}" />

        <Grid
            Grid.Row="1"
            Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">

            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <Button Content="Start" FontSize="40" Margin="10" Command="{Binding StartRecodingCommand}" />
                    <Button Content="Stop" FontSize="40" Margin="10" Command="{Binding StopRecodingCommand}" />
                </StackPanel>
                <TextBox x:Name="Result" Text="{Binding ResponseText}" FontSize="20" />
            </StackPanel>

        </Grid>
    </Grid>
</Page>




4. 마이크 사용 권한 얻기 및 음성 파일 저장


우선 앱의 Package.appxmanifest 파일을 열어서, Capabilities를 선택하신 후 Microphone을 체크해 줍니다. 


그리고, 음성을 녹음한 후에 서비스로 전달 하고 결과를 반환 받아서 택스트를 출력합니다.


음성 녹음에 관련된 부분은 MicrophoneHelper이며, 오픈 소스를 참고 했으며, async - await 패턴으로 변경하고, 권한 체크하는 로징을 추가해서 완성 했습니다. (참고한 오픈 소스 링크가 남아 있지 않아서 링크를 추가하지 못했습니다.) 



5. BingSpeechHelper.cs


가장 고생한 부분이 이 부분입니다. 일단 저장된 파일을 열때 반드시 FileStream으로 열어야 제대로 전송이 됩니다.


그리고, 헤더 부분을 HttpWebRequest에서 처럼 구성 하는 부분이였습니다. 


한번 성공을 하고나서 인식율을 올리기 위해서 조정했던 옵션이 Interactive인지 Conversation인지 Dictation인지를 정하는 부분이 였습니다. 이 옵션에 따라서 반환되는 결과가 서로 다릅니다. DeserializeObject할 모델에 영향을 주는 부분이니 미리 택스트를 보시고 모델을 만들어 주셔야 합니다.


using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Windows.Storage;
using IoTSampleWithWTS.Interfaces;
using IoTSampleWithWTS.Models;
using Newtonsoft.Json;

namespace IoTSampleWithWTS.Helpers
{
    internal class BingSpeechHelper
    {
        private const string INTERACTIVE = "interactive";
        private const string CONVERSATION = "conversation";
        private const string DICTATION = "dictation";

        private readonly string _language = "ko-KR";
        private readonly string _requestUri;
        private IAuthenticationService _authenticationService;

        public BingSpeechHelper()
        {
            //&format=detailed
            _requestUri =
                $@"https://speech.platform.bing.com/speech/recognition/{
                    INTERACTIVE}/cognitiveservices/v1?language={
                        _language}";

        }

        public async Task<string> GetTextResultAsync(string recordedFilename)
        {
            var file = await ApplicationData.Current.LocalFolder.GetFileAsync(recordedFilename);

            using (var fileStream = new FileStream(file.Path, FileMode.Open, FileAccess.Read))
            {
                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json"));
                    client.DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("text/xml"));
                    client.DefaultRequestHeaders.TransferEncoding.Add(TransferCodingHeaderValue.Parse("chunked"));
                    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "API키를 입력하세요");

                    var content = new StreamContent(fileStream);
                    content.Headers.Add("ContentType", new[] {"audio/wav", "codec=audio/pcm", "samplerate=16000"});

                    try
                    {
                        var response = await client.PostAsync(_requestUri, content);
                        var responseContent = await response.Content.ReadAsStringAsync();
                        var speechResults = JsonConvert.DeserializeObject<BinSpeechResult>(responseContent);

                        content.Dispose();

                        return speechResults.DisplayText;
                    }
                    catch (Exception e)
                    {
                        content.Dispose();
                        Console.WriteLine(e);
                        throw;
                    }
                }
            }
        }
    }
}



6. MainViewModel.cs


Start버튼을 클릭하면, test.wav 파일을 로컬스토리지에 저장하고, Stop 버튼을 클릭하면 해당 파일을 Speech API로 전송해서 결과를 받아오고 ResponseText에 넣어서 화면에 출력합니다.


using System.Windows.Input;
using IoTSampleWithWTS.Helpers;

namespace IoTSampleWithWTS.ViewModels
{
    public class MainViewModel : Observable
    {
        private string _responseText;

        public MainViewModel()
        {
            Init();
        }

        public ICommand StartRecodingCommand { get; set; }

        public ICommand StopRecodingCommand { get; set; }

        public string ResponseText
        {
            get => _responseText;
            set => Set(ref _responseText, value);
        }

        private void Init()
        {
            StartRecodingCommand = new RelayCommand(async () =>
            {
                await Singleton<MicrophoneHelper>.Instance.StartRecordingAsync("test.wav");
            });

            StopRecodingCommand = new RelayCommand(async () =>
            {
                await Singleton<MicrophoneHelper>.Instance.StopRecordingAsync();

                var result = await Singleton<BingSpeechHelper>.Instance.GetTextResultAsync("test.wav");
                if (result == null) return;
                ResponseText = result;

            });
        }
    }
}



7. 한계점


REST API는 15초 이상 오디오 전송 불가, 오디오 중간에 결과 반환 불가, 오디오를 LUIS로 직접 전달하는 것 불가라는 한계가 존재 합니다. 더 자세한 사항은 여기를 참고하세요.


아..그런데 방금 생각난 내용인데요..JavaScript용 라이브러리를 사용하면 ARM에서 사용이 가능할 것도 같습니다. 테스트를 해보아야 겠지만요..(테스트라 쓰고 삽질이라 읽어야 하지만..)





8. 소스


Speech API 키를 발급받아서 소스에 넣고 실행하셔야 정상적으로 결과를 보실 수 있습니다.


IoTSampleWithWTS.zip




블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

얼마전 구입했던 라즈베리 파이에 한국어 음성을 출력하기 위한 과정을 간단하게 포스팅 하겠습니다.

1. 음성 입/출력에 대한 기본 사항

UWP에 기본 내장되어 있는 Voice Recognition, TTS가 지원하는 언어는 여기를 참고하시면 됩니다.

Speech Recognition is only available for the following languages: English (United States and United Kingdom), French, German, Japanese, Mandarin (Chinese Simplified and Chinese Traditional), and Spanish.

그런데, 중요한 건... 아직 한글은 미지원이라는.. 물론 언젠가는 하겠지만.. 그 때까지 기다리기는 너무 오래 걸리니 일단 가능한 방법을 찾아 보도록 하겠습니다.


2. 라파에 한글 Speech Synthesis 파일 복사하기

윈도우에서 Speech 관련된 파일을 다운로드 받습니다.


여기서 다운받은 파일은 Speech Recognition 관련 파일은 아닙니고, Speech Synthesis 관련 파일 이며, 다운로드 경로는 C:\Windows\Speech_OneCore\Engines\TTS 폴더에 들어갑니다. 추가로 C:\Windows\System32\Speech_OneCore\common\ko-KR 폴더가 생성되며, tokens_TTS_ko-KR.xml 파일이 생성이 되며, 이 파일들을 라파로 복사하면 음성을 만들 수 있으며. 라파는 언어팩 다운로드 기능이 없기 때문에 다른 언어도 동일한 방법으로 작업을 해야 합니다. 딱히 한국어만 앙되는 것은 아닙니다. 더 자세한 사항은 블로그 포스트를 참고하시면 됩니다.

저는 라파의 c$를 네트워크 폴더로 잡고, 복사하는 방법을 사용했으며, System32\Speech_OneCore\common 폴더는 사용자가 임으로 파일을 복사해서 넣을 수 있는 권한이 없어서, 폴더 권한에 administrator를 추가해서 복사를 완료했습니다.

복사를 진행한 후 반드시 재부팅을 하셔야 인식을 하며, SpeechAndTTS와 같은 셈플 앱을 라파에서 실행하시면 한국어를 선택하 실 수 있습니다.



음성 출력 동영상을 촬영했는데, 소리가 좀 적어서 패스 하도록 하겠습니다.

다음 포스트에서 UWP ARM에서 한글 음성 인식 방법에 대해서 포스팅 하도록 하겠습니다.


블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

작년에 Windows 10 IoT가 Raspberry Pi를 지원한다는 뉴스를 듣고 참 관심이 많은 분야였던, IoT를 이제 시작해 보려고 합니다. IoT 초보이기 때문에 천천히 진행할 예정이며, LED에 불 깜박이는 것 보다 좀더 윈도우 기능을 이용하는 부분에 대해서 도전을 하려고 합니다. 


우선 첫번째 목표는 대략적인 모양은 그려 놓았는데, 진짜로 잘 동작이 되는지는 저도 해봐야하기에.. 쇼핑몰에서 라즈베리 파이 3 모델 B(너무 길어서 라파로 줄여서 이야기 하겠습니다)를 하나 구입했습니다. 

 

온라인 쇼핑몰의 기본은 총알배송이네요 ㅎㅎ 구입한지 2일만에 물건을 받았습니다.

 

 

제일 먼저 해야할 일은 SD카드에 Windows 10 IoT를 설치 하고, 그 걸 라파에 꼽아서 부팅을 해주어야 합니다. 아마 이런 내용들은 대부분 아실 것이라 생각하고 자세하게 다루지는 않겠습니다. 그동안 제가 궁금했던 것은 윈도우를 라파에 어떻게 설치하는지, 어떻게 앱을 배포하는지, 어떤 기능까지가 가능한지 였기 때문에 그 부분에 집중 하겠습니다. 

 

 

1. Windows 10 IoT core dashboard 사용하기

 

https://developer.microsoft.com/en-us/windows/iot/downloads

 

한글 설치 페이지가 있을까 해서 ko-kr로 변경해서 입력했지만, 메뉴만 한글로 나오는 군요;; 그냥 영어로 진행 합니다.

 

Get Windows 10 IOT Core Dashboard를 클릭하면, 설치형 프로그램인 IoT Dashboard를 다운 받을 수 있습니다. 이 프로그램은 윈도우 다운로드, 설치 및 관리에 사용되는 중요한 프로그램 입니다.

 

 

 

IoT Dashboard 실행 화면입니다. 처음에 Set up a new device 탭이 선택이 되어 있습니다.

 

제가 사용하는 디바이스가 라파이니 그대로 두고, OS Build는 최신 버전으로, SD 메모리가 들어있는 Drive는 자동선택됩니다.

 

관리자 비밀번호를 꼭! 입력하시고, IoT 디바이스와 네트워크 연결을 Wi-Fi로 하실려면 Wi-Fi를 꼭 체크해 주셔야 합니다.

 

Download and Install 버튼을 클릭하시면, 해당 버전을 다운로드하고 설치까지 진행 합니다. 이 과정은 금방 끝나니 잠시만 기다리시면 됩니다.

 

 

설치가 완료되면, SD 카드를 뽑아서 라파에 꼽아주고 전원을 연결하면 부팅이 됩니다.

 

 


2. 라파를 네트워크에 연결하기


SD 카드를 꼽고, 전원을 연결하면 네트워크에 자동으로 붙을 줄 알았습니다만.. 그런 일은 일어나지 않았습니다.

Windows 10 IoT도 나름 OS이기 때문에 부팅 과정도 들어가고, 윈도우 설정 같은 화면도 출력됩니다. 다만, 이런 작업을 위해서는 처음 한번은 HDMI를 이용해서 모니터에 연결하고, USB 키보드, 마우스를 이용해서, 네트워크를 설정해 주어야 하네요.


일반 랜선을 사용하는 경우에도 자동으로 언어 설정등을 하지 못하니(아마도..) 될 수 있으면 해당 주변 기기를 이용하는 것이 좋을 것 같습니다.

 



3. 라파와 PC 연결하기


My devices탭을 선택하고 잠시 기다리면 목록에 방금 연결한 녀석이 뜹니다. 이 때 동일한 네트워크(공유기에)에 연결이 않되어 있으면, 표시가 되지 않을 수 있으니 참고하시기 바랍니다.


라파를 선택하면 다음 화면으로 넘어 갑니다.

 


여기서는 간단한 정보만 확인이 가능합니다. User name이 입력이 되어 있는데, 수정은 불가능 하더군요.. Apply 버튼도 눌러지지 않고..


여기서 중요한 건 Open Windows Device Portal in browser 링크입니다. 링크를 클릭해서 브라우저를 열어서 장비 상태, 설정 등을 확인하고 변경할 수 있습니다.



Windows Device Portal 페이지 입니다. 


가장 처음에 보이는 것은 Device Settings이며, 장비 이름을 변경하고, 비밀 번호를 변경할 수 있습니다. 또한 오른쪽에 오디오 장치와 스피커에 대한 정보 등도 표시 됩니다.


아쉬운데로 이 화면을 보면서 이것 저것 만저 보기는 했는데.. 저는 디바이스 화면이 궁금하더군요. 아래 Capture Screenshot이라는 버튼을 누르면, 현재 라파의 화면을 캡처해서 보여주고, 저장을 할 수 있습니다만..아무래도 실시간으로 보는 것이 필요 했습니다.


 

그래서 찾아보니, Remote 탭을 이용하면 된다는 것을 알았습니다.


Enable Windows IoT Remote Server를 체크하신 후 그 아래 링크를 클릭합니다.

 


링크를 클릭하면 Windows IoT Remote Client라는 앱을 다운로드 받으라고 나옵니다. 이 앱의 용도는 제가 원하던 라파의 화면을 실시간으로 보면서, 직접 조작도 가능한 것입니다. 즉, HDMI, 마우스와 키보드가 더 이상 필요가 없어진 다는 것입니다.


단점은.. 좀 느립니다. 하하;; 빠른 화면, 빠른 조작을 원하시면 그냥 주변 장치를 사용하셔야 합니다.



앱을 성공적으로 설치하고, 실행하면 바로 Connect라는 화면이 나오는데, 콤보 박스를 클릭하니, 아까 연결했던 정보가 떡~하고 출력됩니다. 이녀석을 선택하고, Connect를 클릭합니다.



잠시 후에 짜잔~ 아래 화면과 같이 라파의 현재 화면 출력을 볼 수 있습니다. 하하;; 전 여기까지만 해도 신기하네요..

이런 재미를 이제야 느끼다니..



이번 포스트는 우선 여기까지만 진행 하겠습니다. OS깔고 화면 나오면 절반은 성공 아닐까요??


이제는 달리면 됩니다. 열심히 달려 보겠습니다. 아마 다음에는 헬로 월드를 IoT에서 실행하는 예제를 따라할 것 같네용




블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

티스토리 툴바