[ko] Korean Translation for Lesson 6 (#427)
* Create README.kr.md fisrtcommit * translate kr * Update README.kr.md modify image address * Translation_kr create assignment.kr.md * Create pi-actuator.kr.md [create] pi-actuator.kr.md * Create pi-sensor.kr.md [create] Korean Translation of pi-sensor * Update pi-actuator.kr.md * Update pi-sensor.kr.md * Update README.kr.md fix README.KR.md * Update README.kr.md Review-based modifications * Update assignment.kr.md Review-based modifications * Create single-board-computer-mqtt.kr.md This file is translated to Korean * Add files via upload * Update README.md did Korean translation _ microphones * Create pi-microphone.ko.md did Korean translation * Rename README.md to README.ko.md * Add files via upload * Update README.ko.md Korean translation completed * Delete 6-consumer/lessons/3-spoken-feedback/translations directory * Add files via upload * Update README.ko.md Korean translation completed * Create pi-text-to-speech.ko.md Korean translation completed * Delete 6-consumer/lessons/1-speech-recognition/translation directory * Add files via upload * Delete README.ko.md * Add files via upload * Update pi-text-to-speech.ko.md 6-1 pi-text-to-speech Korean translation * Update and rename pi-text-to-speech.ko.md to pi-microphone.ko.md 6-1 pi-microphone.ko.md Korean translation * Update pi-microphone.ko.md * Update pi-actuator.kr.md * Update pi-sensor.kr.md * Update pi-text-to-speech.ko.md * Rename pi-actuator.kr.md to pi-actuator.ko.md * Rename pi-sensor.kr.md to pi-sensor.ko.md Co-authored-by: Jim Bennett <jim.bennett@microsoft.com>pull/435/head
parent
cdadb585cb
commit
fb3ad1717b
@ -0,0 +1,140 @@
|
||||
# 마이크 및 스피커 구성 - Raspberry Pi
|
||||
|
||||
이 단원에서는 Raspberry Pi에 마이크와 스피커를 추가합니다.
|
||||
|
||||
## 하드웨어
|
||||
|
||||
Raspberry Pi에 연결할 마이크가 필요합니다.
|
||||
|
||||
Pi에는 내장 마이크가 없기 때문에 외부 마이크를 추가해야 합니다. 외부 마이크를 추가하는 방법에는 여러가지가 있습니다.
|
||||
|
||||
* USB 마이크
|
||||
* USB 헤드셋
|
||||
* USB 연결 스피커폰
|
||||
* USB 연결 3.5mm 잭이 있는 오디오 어댑터 및 마이크
|
||||
* [ReSpeaker 2-Mics Pi HAT](https://www.seeedstudio.com/ReSpeaker-2-Mics-Pi-HAT.html)
|
||||
|
||||
> 💁 Raspberry Pi에서는 블루투스 마이크가 일부 지원되지 않으므로 블루투스 마이크 또는 헤드셋이 있는 경우 오디오 페어링 또는 캡처에 문제가 있을 수 있습니다.
|
||||
|
||||
Raspberry Pi 장치에는 3.5mm 헤드폰 잭이 있습니다. 헤드셋 또는 스피커를 연결하기 위해 이를 사용할 수 있으며 아래 방법을 통해서도 스피커를 추가할 수 있습니다.
|
||||
|
||||
* 모니터 또는 TV를 통한 HDMI 오디오
|
||||
* USB 스피커
|
||||
* USB 헤드셋
|
||||
* USB 연결 가능 스피커폰
|
||||
* 3.5mm 잭 또는 JST 포트에 스피커가 부착된 [ReSpeaker 2-Mics Pi HAT](https://www.seeedstudio.com/ReSpeaker-2-Mics-Pi-HAT.html)
|
||||
|
||||
## 마이크와 스피커를 연결하고 구성합니다.
|
||||
|
||||
마이크와 스피커를 연결하고 구성해야 합니다.
|
||||
|
||||
### 작업 - 마이크를 연결하고 구성합시다.
|
||||
|
||||
1. 적절한 방법으로 마이크를 연결합니다. 예를 들어 USB 포트 중 하나를 통해 연결합니다.
|
||||
|
||||
1. ReSpeaker 2-Mics Pi HAT를 사용하는 경우 Grove base hat을 제거한 다음 ReSpeaker hat을 그 자리에 장착할 수 있습니다.
|
||||
![A raspberry pi with a ReSpeaker hat](../../../../images/pi-respeaker-hat.png)
|
||||
|
||||
이 과정의 후반부에 Grove 버튼이 필요하지만, 이 모자에는 Grove base hat이 내장되어 있으므로 Grove base hat이 필요하지 않습니다.
|
||||
|
||||
hat이 장착되면 드라이버를 설치해야 합니다. 드라이버 설치 지침은 [Seeed getting started instructions](https://wiki.seeedstudio.com/ReSpeaker_2_Mics_Pi_HAT_Raspberry/#getting-started) 을 참고하세요.
|
||||
|
||||
> ⚠️ 명령어는 `git`를 사용하여 저장소를 복제합니다. Pi에 `git`이 설치되어 있지 않은 경우 다음 명령을 실행하여 설치할 수 있습니다.
|
||||
>
|
||||
> ```sh
|
||||
> sudo apt install git --yes
|
||||
> ```
|
||||
|
||||
1. 연결된 마이크에 대한 정보를 보려면 Pi에서 또는 VS Code 및 원격 SSH 세션을 사용하여 연결된 터미널에서 다음 명령을 실행합니다.
|
||||
|
||||
```sh
|
||||
arecord -l
|
||||
```
|
||||
|
||||
아래와 같이 연결된 마이크 목록이 표시됩니다:
|
||||
|
||||
```output
|
||||
pi@raspberrypi:~ $ arecord -l
|
||||
**** List of CAPTURE Hardware Devices ****
|
||||
card 1: M0 [eMeet M0], device 0: USB Audio [USB Audio]
|
||||
Subdevices: 1/1
|
||||
Subdevice #0: subdevice #0
|
||||
```
|
||||
|
||||
연결된 마이크가 하나일 때 하나의 항목만 표시됩니다. 리눅스에서 마이크 구성이 까다로울 수 있으므로 한 개의 마이크만 사용하고 다른 마이크는 분리하는 것을 추천합니다.
|
||||
|
||||
카드 번호는 나중에 필요하므로 적어 두세요. 위의 출력에서 카드 번호는 1입니다.
|
||||
|
||||
### 작업 - 스피커를 연결하고 구성합니다.
|
||||
|
||||
1. 적절한 방법으로 스피커를 연결합니다.
|
||||
|
||||
1. 연결된 스피커에 대한 정보를 보려면 Pi에서 또는 VS Code와 원격 SSH 세션을 사용하여 연결된 터미널에서 다음 명령을 실행합니다.
|
||||
```sh
|
||||
aplay -l
|
||||
```
|
||||
|
||||
아래와 같이 연결된 스피커 목록이 표시됩니다:
|
||||
|
||||
```output
|
||||
pi@raspberrypi:~ $ aplay -l
|
||||
**** List of PLAYBACK Hardware Devices ****
|
||||
card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones]
|
||||
Subdevices: 8/8
|
||||
Subdevice #0: subdevice #0
|
||||
Subdevice #1: subdevice #1
|
||||
Subdevice #2: subdevice #2
|
||||
Subdevice #3: subdevice #3
|
||||
Subdevice #4: subdevice #4
|
||||
Subdevice #5: subdevice #5
|
||||
Subdevice #6: subdevice #6
|
||||
Subdevice #7: subdevice #7
|
||||
card 1: M0 [eMeet M0], device 0: USB Audio [USB Audio]
|
||||
Subdevices: 1/1
|
||||
Subdevice #0: subdevice #0
|
||||
```
|
||||
|
||||
헤드폰 잭이 내장돼 있어 `card 0: Headphones`이 항상 확인되는 것을 볼 수 있습니다. USB 스피커와 같은 스피커를 추가한 경우에도 이 목록은 표시됩니다.
|
||||
|
||||
1. 내장 헤드폰 잭에 연결된 스피커나 헤드폰이 아닌 추가 스피커를 사용하는 경우 다음 명령어를 통해 기본값으로 구성해야 합니다.
|
||||
```sh
|
||||
sudo nano /usr/share/alsa/alsa.conf
|
||||
```
|
||||
|
||||
이렇게 하면 단말기 기반 텍스트 편집기인 `nano`에서 구성 파일이 열립니다. 다음 줄을 찾을 때까지 키보드의 화살표 키를 사용하여 아래로 스크롤합니다.
|
||||
|
||||
```output
|
||||
defaults.pcm.card 0
|
||||
```
|
||||
|
||||
호출 후 돌아온 목록에서 사용할 카드의 카드 번호를 `0`에서 `aplay -l`로 변경합니다. 예를 들어, 위의 출력에는 `card 1: M0 [eMeet M0], 장치 0: USB Audio [USB Audio]`라는 두 번째 사운드 카드가 있습니다. 이를 사용하기 위해 다음과 같이 파일을 업데이트합니다.
|
||||
|
||||
```output
|
||||
defaults.pcm.card 1
|
||||
```
|
||||
|
||||
이 값을 적절한 카드 번호로 설정합니다. 키보드의 화살표 키를 사용하여 숫자로 이동한 다음 텍스트 파일을 편집할 때 일반적으로 새 숫자를 삭제하고 입력할 수 있습니다.
|
||||
|
||||
1. `Ctrl+x`를 눌러 변경 내용을 저장하고 파일을 닫습니다. `y`를 눌러 파일을 저장한 다음 `return`을 눌러 파일 이름을 선택합니다.
|
||||
|
||||
### 작업 - 마이크와 스피커를 테스트합니다
|
||||
|
||||
1. 다음 명령을 실행하여 마이크를 통해 5초간의 오디오를 녹음합니다.:
|
||||
|
||||
```sh
|
||||
arecord --format=S16_LE --duration=5 --rate=16000 --file-type=wav out.wav
|
||||
```
|
||||
|
||||
이 명령이 실행되는 동안 말하기, 노래하기, 비트박스, 악기 연주 또는 하고싶은 것을 하며 마이크에 소리를 내십시오.
|
||||
|
||||
1. 5초 후에 녹화가 중지됩니다. 다음 명령을 실행하여 오디오를 재생합니다.
|
||||
|
||||
```sh
|
||||
aplay --format=S16_LE --rate=16000 out.wav
|
||||
```
|
||||
|
||||
스피커를 통해 audio bing이 재생되는 소리가 들립니다. 필요에 따라 스피커의 출력 볼륨을 조정합니다.
|
||||
|
||||
1. 내장된 마이크 포트의 볼륨을 조절하거나 마이크의 게인을 조절해야 할 경우 `alsamixer` 유틸리티를 사용할 수 있습니다. 이 유틸리티에 대한 자세한 내용은 [Linux alsamixer man page](https://linux.die.net/man/1/alsamixer) 에서 확인할 수 있습니다.
|
||||
|
||||
1. 오디오를 재생할 때 오류가 발생하면 `alsa.conf` 파일에서 `defaults.pcm.card`로 설정한 카드를 확인합니다.
|
@ -0,0 +1,130 @@
|
||||
# 타이머 설정 및 음성 피드백 제공
|
||||
|
||||
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-23.jpg)
|
||||
|
||||
> [Nitya Narasimhan](https://github.com/nitya)의 스케치노트. 클릭하여 크게 보세요.
|
||||
|
||||
## 강의 전 퀴즈
|
||||
|
||||
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/45)
|
||||
|
||||
## 도입
|
||||
|
||||
스마트 어시스턴트는 단방향 통신 장치가 아닙니다. 그들에게 말을 걸면 그들은 대답합니다.
|
||||
|
||||
"Alexa, 3분짜리 타이머 설정해줘"
|
||||
|
||||
"네. 3분 타이머 설정했습니다."
|
||||
|
||||
지난 두 번의 수업에서 여러분은 강의를 듣고 음성을 통해 텍스트를 생성하는 방법을 배웠고, 생성한 텍스트에서 타이머 설정 요청에 관한 내용을 추출했습니다. 이 수업에서는 IoT 장치에서 타이머를 설정하고, 사용자에게 타이머 설정이 완료됨을 확인하는 음성안내를 송출한 후, 타이머가 종료되면 알람을 울리는 방법을 배울 것 입니다.
|
||||
|
||||
이 강의에서는 다음을 다룹니다.:
|
||||
|
||||
* [텍스트에서 음성으로](#텍스트에서-음성으로)
|
||||
* [타이머 설정하기](#타이머-설정하기)
|
||||
* [텍스트를 음성으로 변환하기](#텍스트를-음성으로-변환하기)
|
||||
|
||||
## 텍스트에서 음성으로
|
||||
|
||||
제목에서부터 알다시피 텍스트를 음성으로 변환하는 과정입니다. 기본 원칙은 텍스트의 단어를 구성하는 소리(음소)로 나누고, 사전 녹음된 오디오나 AI모델에서 생성된 오디오를 사용하여 하나의 오디오로 연결합니다.
|
||||
|
||||
![일반적인 텍스트 음성 시스템의 3단계](../../../../images/tts-overview.png)
|
||||
|
||||
텍스트 음성 변환 시스템은 일반적으로 3단계로 구성됩니다.
|
||||
|
||||
* 텍스트 분석
|
||||
* 언어 분석
|
||||
* 파형 발생
|
||||
|
||||
### 텍스트 분석
|
||||
|
||||
텍스트 분석에는 제공된 문장을 가져와서 음성을 생성하는 데 필요한 단어로 변환하는 작업이 포함됩니다. 예를 들어 "Hello wolrd" 를 변환하면 텍스트 분석 없이 두 단어를 음성으로 변환할 수 있습니다. 그러나 "1234"는 문맥에 따라 "천 이백 삼시 사" 혹은 "일 이 삼 사" 로 변환해야 할 수 있습니다. "나는 1234개의 사과를 가지고 있다"의 경우 문맥상 "천 이백 삼십 사"로 감지되지만, "아이가 1234ㄹ를 세었다"의 경우 "일 이 삼 사"가 됩니다.
|
||||
|
||||
생성된 단어는 언어 뿐만 아니라 해당 언어의 사용 환경에 따라 다릅니다. 예를 들면, 미국영어에서 "120"은 "One hundred twenty" 이지만, 영국에서는 "One hundred and twenty"으로 hundreds 뒤에 "and"를 사용합니다.
|
||||
|
||||
✅ 텍스트 분석이 필요한 다른 예로는 inch의 in을 발음하는 짧은 음, saint와 street의 짧은 형태의 "st"등이 있습니다. 여러분은 문맥 상 모호한 언어로 구성된 다른 예시들이 생각 나시나요?
|
||||
|
||||
+) 한국어 문맥 상 "난 네 말이 궁금해" 에서 동물을 의미하는 지 대화를 의미하는 지 등의 동음이의어이지 않을까 생각합니다.
|
||||
|
||||
문맥상 단어가 명확해지면 언어 분석을 위해 전송됩니다.
|
||||
|
||||
### 언어 분석
|
||||
|
||||
언어 분석은 단어들을 음소로 나눕니다. 음소는 사용된 문자 뿐만 아니라 단어의 다른 문자에도 기반을 두고 있습니다. 예를들어 영어에서 'car'와 'care'에서의 'a'소리가 다릅니다. 영어는 알파벳의 26개 문자에 대하여 44개의 서로 다른 음소를 가지고 있으며, 일부는 'circle'와 'serpent'처럼 다른 문자이지만 동일한 음소로 사용되는 경우도 존재합니다.
|
||||
|
||||
✅ 생각 해 봅시다 : 한국어 음소는 무엇이 있나요?
|
||||
|
||||
일단 단어들이 음소로 변환되면, 이 음소들은 문맥에 따라서 음조나 발음 시간을 조절하면서 억양을 지원하기 위한 추가적인 데이터가 필요합니다. 한 예로 영어에서 마지막 단어에 대한 음높이 증가는 질문을 의미합니다. 이를 바탕으로 문장을 질문으로 변환하는 데 사용할 수 있습니다.
|
||||
|
||||
예를 들어, "You have an apple"이라는 문장은 상대방이 사과를 가지고 있다는 것을 나타내는 문장입니다. 만약 마지막 'apple' 단어의 끝음이 올라간다면 "You have an apple?"의 질문 형태가 됩니다. 언어 분석 시 마지막 단어의 음이 올라가는 것을 파악하면 물음표를 사용하여 질문임을 표시해야합니다.
|
||||
|
||||
일단 음소가 생성되면, 오디오 출력을 생성하기 위한 파형 생성을 위해 전송될 수 있습니다.
|
||||
|
||||
### 파형 발생
|
||||
|
||||
최초의 전자 텍스트 음성 변환 시스템은 각 음소에 단일 오디오 녹음을 사용하여 매우 단조로운 로봇 음성으로 구현되었습니다. 이들은 소리 데이터베이스에서 로드되고 오디오를 만들기 위해 연결됩니다.
|
||||
|
||||
✅ 생각 해 봅시다 : 초기 음성 합성 시스템의 오디오 녹음을 찾아봅시다. 스마트 어시스턴트에 사용되는 것과 같은 최신 음성 합성과 비교 해 봅시다.
|
||||
|
||||
보다 최신의 파형 생성은 딥러닝을 사용하여 구축된 머신 러닝 모델을 사용하여 인간과 구별 할 수 없는 더 자연스러운 소리를 생성합니다.
|
||||
|
||||
> 💁 이러한 머신 러닝 모델 중 일부는 실제 사람이 말하는 것 처럼 들리기 위해 전이 학습을 사용하여 재학습 될 수 있습니다. 즉, 은행에서 점점 더 시도하고 있는 음성 보안 시스템은 여러분의 목소리를 몇 분 녹음한 사람은 누구나 여러분을 사칭할 수 있기 때문에 좋은 방법이 아니라고 생각합니다.
|
||||
|
||||
이러한 대형 머신 러닝 모델은 세 단계를 모두 end-to-end 음성 합성기로 결합하도록 학습되고 있습니다.
|
||||
|
||||
## 타이머 설정하기
|
||||
|
||||
타이머를 설정하려면 IoT 장치가 서버리스 코드를 사용하여 만든 REST 엔드포인트를 호출한 후, 결과 시간을 사용하여 타이머를 설정합니다.
|
||||
|
||||
### 작업 - 서버리스 함수를 호출하여 타이머 시간을 가져옵시다.
|
||||
|
||||
아래 안내에 따라 IoT 장치에서 REST 끝 점을 호출하고 요청한 시간 동안의 타이머를 설정 해 줍니다.:
|
||||
|
||||
* [Arduino - Wio Terminal](../wio-terminal-set-timer.md)
|
||||
* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-set-timer.ko.md)
|
||||
|
||||
## 텍스트를 음성으로 변환하기
|
||||
|
||||
음성을 텍스트로 변환하는 데 사용한 것과 동일한 음성 서비스를 사용하여 텍스트를 다시 음성으로 변환할 수 있습니다. 이는 IoT 장치의 스피커를 통해 재생할 수 있습니다. 변환하고자 하는 텍스트는 필요한 오디오 유형(ex: 샘플링 정도)정보와 함께 음성 서비스로 전송되고 오디오가 포함된 이진 데이터가 반환됩니다.
|
||||
|
||||
해당 요청을 보낼 때, 음성 합성 응용 프로그램을 위한 XML 기반 마크업 언어인 *Speech Synthesis Markup Language*(SSML)를 사용하여 전송합니다. 이것은 변환될 텍스트 뿐만 아니라 텍스트의 언어, 사용할 음성을 정의하며 텍스트의 일부 또는 전부에 대한 말한느 속도, 볼륨, 피치 등을 정의하는 데 사용될 수 있습니다.
|
||||
|
||||
예를 들어, 이 SSML은 "Your 3 minute 5 second time has been set" 라는 텍스트를 `en-GB-MiaNeural`이라는 영국 언어 음성을 사용하여 음성으로 변환하는 요청을 정의합니다.
|
||||
|
||||
```xml
|
||||
<speak version='1.0' xml:lang='en-GB'>
|
||||
<voice xml:lang='en-GB' name='en-GB-MiaNeural'>
|
||||
Your 3 minute 5 second time has been set
|
||||
</voice>
|
||||
</speak>
|
||||
```
|
||||
|
||||
> 💁 대부분의 텍스트 음성 시스템은 영국 억양 영어 음성, 뉴질랜드 억양 영어 음성 등 다양한 언어에 대한 다양한 음성을 가지고 있습니다.
|
||||
|
||||
### 작업 - 텍스트를 음성으로 변환 해 봅시다.
|
||||
|
||||
IoT 장치를 사용하여 텍스트를 음성으로 변환하려면 아래 가이드를 사용하십시오.
|
||||
|
||||
* [Arduino - Wio Terminal](../wio-terminal-text-to-speech.md)
|
||||
* [Single-board computer - Raspberry Pi](pi-text-to-speech.ko.md)
|
||||
* [Single-board computer - Virtual device](../virtual-device-text-to-speech.md)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 도전
|
||||
|
||||
SSML은 특정 단어를 강조하거나, 잠깐의 텀을 두거나, 음높이를 변경하는 등 단어를 말하는 방식을 변경하는 방법을 가지고 있습니다. IoT 장치에서 다른 SSML을 전송하고 출력을 비교하면서 이 중 몇가지를 시도해봅시다. SSML에 대한 자세한 내용은 [World Wide Web Consortium의 음성 합성 마크업 언어(SSML) Version 1.1](https://www.w3.org/TR/speech-synthesis11/))에서 확인할 수 있습니다.
|
||||
|
||||
## 강의 후 퀴즈
|
||||
|
||||
[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/46)
|
||||
|
||||
## 복습 및 독학
|
||||
|
||||
* 음성 합성에 대한 자세한 내용은 [speech synthesis page on Wikipedia](https://wikipedia.org/wiki/Speech_synthesis) 에서 확인 하세요.
|
||||
* 범죄자들이 음성 합성을 사용하여 [가짜 목소리로 돈을 훔치는 것에 대한 BBC뉴스](https://www.bbc.com/news/technology-48908736) 기사에서 확인 해 보세요.
|
||||
* [TikTok 플랫폼이 성우들의 동의 없이 AI를 사용하여 그들의 목소리를 악의적으로 사용하였다.](https://www.vice.com/en/article/z3xqwj/this-tiktok-lawsuit-is-highlighting-how-ai-is-screwing-over-voice-actors) 와 관련된 기사를 확인 해 보세요.
|
||||
|
||||
## 과제
|
||||
|
||||
[타이머 취소하기](assignment.ko.md)
|
@ -0,0 +1,140 @@
|
||||
# 텍스트 음성 변환 - Raspberry Pi
|
||||
|
||||
이 단원에서는 음성 서비스를 사용하여 텍스트를 음성으로 변환하는 코드를 작성합니다.
|
||||
|
||||
## 음성 서비스를 사용하여 텍스트를 음성으로 변환 해봅시다.
|
||||
|
||||
텍스트는 REST API를 사용하여 음성 서비스로 전송되어 IoT 장치에서 재생할 수 있는 오디오 파일로 음성을 얻을 수 있습니다. 음성을 요청할 때 다양한 음성을 사용하여 변환된 음성을 생성할 수 있으므로 사용할 voice를 제공해야 합니다.
|
||||
|
||||
각 언어는 다양한 voice를 지원하며, 음성 서비스에 대해 REST를 요청하여 각 언어에 대해 지원되는 voice 목록을 얻을 수 있습니다.
|
||||
|
||||
### 작업 - voice를 얻어 봅시다.
|
||||
|
||||
1. VS Code에서 `smart-timer` 프로젝트를 열어주세요.
|
||||
|
||||
1. 언어에 대한 voice 목록을 요청하려면 `say`함수 뒤에 아래 코드를 추가하십시오.
|
||||
|
||||
```python
|
||||
def get_voice():
|
||||
url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/voices/list'
|
||||
|
||||
headers = {
|
||||
'Authorization': 'Bearer ' + get_access_token()
|
||||
}
|
||||
|
||||
response = requests.get(url, headers=headers)
|
||||
voices_json = json.loads(response.text)
|
||||
|
||||
first_voice = next(x for x in voices_json if x['Locale'].lower() == language.lower() and x['VoiceType'] == 'Neural')
|
||||
return first_voice['ShortName']
|
||||
|
||||
voice = get_voice()
|
||||
print(f'Using voice {voice}')
|
||||
```
|
||||
|
||||
이 코드는 음성 서비스를 사용하여 voice 리스트를 가져오는 `get_voice`라는 함수를 정의합니다. 이후 사용중인 언어와 일치하는 첫 번째 voice를 찾습니다.
|
||||
|
||||
이후 이 기능을 호출하여 첫 번째 voice를 저장하면 음성 이름이 console에 출력됩니다. 이 voice는 한 번 요청할 수 있으며 텍스트를 음성으로 변환하기 위해 모든 호출에 사용되는 값입니다.
|
||||
|
||||
> 💁 지원되는 voice의 전체 목록은 [Microsoft Docs 언어 및 음성 지원 설명서](https://docs.microsoft.com/azure/cognitive-services/speech-service/language-support?WT.mc_id=academic-17441-jabenn#text-to-speech)에서 확인할 수 있습니다. 특정 voice를 사용하려면 이 기능을 제거하고 설명서에서 voice를 해당 voice의 명칭으로 하드코딩 할 수 있습니다.
|
||||
> 예시 :
|
||||
> ```python
|
||||
> voice = 'hi-IN-SwaraNeural'
|
||||
> ```
|
||||
|
||||
### 작업 - 텍스트를 음성으로 변환
|
||||
|
||||
1. 아래에서 음성 서비스에서 검색할 오디오 형식에 대한 상수를 정의합니다. 오디오를 요청할 때 다양한 형식으로 요청할 수 있습니다.
|
||||
|
||||
```python
|
||||
playback_format = 'riff-48khz-16bit-mono-pcm'
|
||||
```
|
||||
|
||||
하드웨어에 따라 사용할 수 있는 형식이 다릅니다. 오디오를 재생할 때 `Invalid sample rate`오류가 발생하면 이 값을 다른 값으로 변경하면 됩니다. 지원되는 목록은 [Microsoft Docs의 Text to speech REST API 설명서](https://docs.microsoft.com/azure/cognitive-services/speech-service/rest-text-to-speech?WT.mc_id=academic-17441-jabenn#audio-outputs) 에서 확인할 수 있습니다. `riff` 형식의 오디오를 사용해야 하며, 시도할 값은 `riff-16khz-16bit-mono-pcm`, `riff-24khz-16bit-mono-pcm` 그리고 `riff-48khz-16bit-mono-pcm`입니다.
|
||||
|
||||
1. 아래 코드를 통해 음성 서비스 REST API를 사용하여 텍스트를 음성으로 변환하는 `get_speech`함수를 선언합니다.
|
||||
|
||||
```python
|
||||
def get_speech(text):
|
||||
```
|
||||
|
||||
1. `get_speech` 함수에서 호출할 URL과 전달할 헤더를 정의합니다.
|
||||
|
||||
```python
|
||||
url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/v1'
|
||||
|
||||
headers = {
|
||||
'Authorization': 'Bearer ' + get_access_token(),
|
||||
'Content-Type': 'application/ssml+xml',
|
||||
'X-Microsoft-OutputFormat': playback_format
|
||||
}
|
||||
```
|
||||
|
||||
생성된 액세스 토큰을 사용하도록 헤더를 설정하고 콘텐츠를 SSML로 설정하며 필요한 오디오 형식을 정의합니다.
|
||||
|
||||
1. 아래 코드를 통해 REST API로 보낼 SSML을 정의합니다.
|
||||
|
||||
```python
|
||||
ssml = f'<speak version=\'1.0\' xml:lang=\'{language}\'>'
|
||||
ssml += f'<voice xml:lang=\'{language}\' name=\'{voice}\'>'
|
||||
ssml += text
|
||||
ssml += '</voice>'
|
||||
ssml += '</speak>'
|
||||
```
|
||||
|
||||
이 SSML은 변환할 텍스트와 함께 사용할 언어와 voice를 설정합니다.
|
||||
|
||||
1. 마지막으로 REST를 요청하고 이진 오디오 데이터를 반환하는 코드를 이 함수에 추가합니다.
|
||||
|
||||
```python
|
||||
response = requests.post(url, headers=headers, data=ssml.encode('utf-8'))
|
||||
return io.BytesIO(response.content)
|
||||
```
|
||||
|
||||
### 작업 - 오디오를 재생해봅시다
|
||||
|
||||
1. `get_speech` 함수 아래에 REST API 호출에 의해 반환된 오디오를 재생하는 새 함수를 정의합니다.
|
||||
|
||||
```python
|
||||
def play_speech(speech):
|
||||
```
|
||||
|
||||
1. 이 함수에 전달되는 `speech`는 REST API에서 반환되는 이진 오디오 데이터입니다. 다음 코드를 사용하여 이를 파형 파일로 열고 PyAudio로 전달하여 오디오를 재생합니다
|
||||
```python
|
||||
def play_speech(speech):
|
||||
with wave.open(speech, 'rb') as wave_file:
|
||||
stream = audio.open(format=audio.get_format_from_width(wave_file.getsampwidth()),
|
||||
channels=wave_file.getnchannels(),
|
||||
rate=wave_file.getframerate(),
|
||||
output_device_index=speaker_card_number,
|
||||
output=True)
|
||||
|
||||
data = wave_file.readframes(4096)
|
||||
|
||||
while len(data) > 0:
|
||||
stream.write(data)
|
||||
data = wave_file.readframes(4096)
|
||||
|
||||
stream.stop_stream()
|
||||
stream.close()
|
||||
```
|
||||
|
||||
이 코드는 오디오를 캡처하는 것과 동일한 PyAudio 스트림을 사용합니다. 여기서 차이점은 오디오 데이터에서 데이터가 읽혀지고 출력 스트림으로 설정 된 스트림으로 푸시된다는 것입니다.
|
||||
|
||||
샘플링 정도와 같은 스트림 세부 사항을 하드 코딩하는 대신 오디오 데이터로부터 읽다.
|
||||
|
||||
1. `say` 함수의 내용을 다음과 같이 바꿉니다.
|
||||
|
||||
```python
|
||||
speech = get_speech(text)
|
||||
play_speech(speech)
|
||||
```
|
||||
|
||||
이 코드는 텍스트를 이진 오디오 데이터로 음성으로 변환하고 오디오를 재생합니다.
|
||||
|
||||
1. 앱을 실행하고 function 앱도 실행 중인지 확인합니다. 타이머를 설정하면 타이머가 설정되었다는 음성 응답이 들리고, 타이머의 시간이 완료되면 다른 음성 응답이 들립니다.
|
||||
`Invalid sample rate` 오류가 발생하면 위에서 설명한 대로 `playback_format`을 변경하십시오.
|
||||
|
||||
> 💁 [code-spoken-response/pi](code-spoken-response/pi) 폴더에서 코드를 확인할 수 있습니다.
|
||||
|
||||
😀 타이머를 만들었어요! 야호!
|
Loading…
Reference in new issue