Merge pull request #1 from WZNT-KimHyeJin/Translation_KR

Translation kr
pull/428/head
Hyejin Kim 3 years ago committed by GitHub
commit 6fb6391586

@ -0,0 +1,222 @@
# 센서 및 액추에이터(actuator)를 통한 물리적 환경과의 상호작용
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-3.jpg)
> [Nitya Narasimhan](https://github.com/nitya) 의 스케치노트입니다. 이미지를 클릭하여 크게 보세요.
이 수업은 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 에서 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 시리즈의 일부로 제공되었습니다. . 수업은 2개의 비디오로 진행되었습니다. 1시간의 수업과 1시간의 추가 공부 시간을 통해 수업의 내용을 더 깊이 파고들어 질문에 답하고자 합니다.
[![Lesson 3: Interact with the Physical World with Sensors and Actuators](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4)
[![Lesson 3: Interact with the Physical World with Sensors and Actuators - Office hours](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA)
> 🎥 동영상을 보려면 위의 이미지를 클릭하세요
## 강의 전 퀴즈
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5)
## 소개
이 수업은 IoT 장치를 위한 두 가지 중요한 개념인 센서와 액추에이터를 소개한다. 당신은 또한 IoT 프로젝트에 광센서를 추가하고, 조도에 의해 제어되는 LED를 추가하여, 효과적으로 야간 조명을 구축할 수 있습니다.
이 수업에서는 다음을 다룹니다:
* [센서란 무엇인가](#센서란-무엇인가)
* [센서를 사용해보자](#센서를-사용해보자)
* [센서의 종류](#센서의-종류)
* [액추에이터란 무엇인가](#액추에이터란-무엇인가)
* [액추에이터를 사용해보자](#액추에이터를-사용해보자)
* [액추에이터의 종류](#액추에이터의-종류)
## 센서란 무엇인가
센서는 물리적 세계를 감지하는 하드웨어 장치입니다. 즉, 센서는 주변의 하나 이상의 속성을 측정하고 정보를 IoT 장치로 보냅니다. 센서는 대기 온도와 같은 자연적 특성부터 움직임과 같은 물리적 상호 작용까지, 측정할 수 있는 것이 매우 많아 방대한 범위의 장치를 포괄합니다.
일반적인 센서에는 다음이 포함됩니다.
- 온도 센서 - 공기 온도 또는 물에 담그는 곳의 온도를 감지합니다. 애호가들과 개발자들에게, 이것들은 종종 단일 센서에서 기압과 습도와 결합됩니다.
- 버튼 - 버튼을 눌렀을 때 신호가 감지됩니다.
- 광센서 - 광도를 감지하고 특정 색상, 자외선, 적외선 또는 일반적인 가시광선일 수 있습니다.
- 카메라 - 사진을 찍거나 비디오를 스트리밍함으로써 세계의 시각적 표현을 감지합니다.
- 가속도계 - 여러 방향으로의 움직임을 감지합니다.
- 마이크 - 일반적인 소리 수준 또는 방향성 소리를 감지합니다.
✅ 생각해봅시다. 여러분의 휴대전화에는 어떤 센서가 있나요?
모든 센서는 감지하는 모든 것을 IoT 장치로 해석할 수 있는 전기 신호로 변환한다는 한 가지 공통점이 있습니다. 이 전기 신호가 어떻게 해석되는지는 IoT 장치와 통신하는 데 사용되는 통신 프로토콜뿐만 아니라 센서에 따라 다릅니다.
## 센서를 사용해보자
아래의 관련 안내에 따라 IoT 장치에 센서를 추가하십시오.
* [아두이노 - Wio Terminal](wio-terminal-sensor.md)
* [싱글보드 컴퓨터 - Raspberry Pi](pi-sensor.md)
* [싱글보드 컴퓨터 - 가상기기](virtual-device-sensor.md)
## 센서의 종류
센서는 아날로그 센서와 디지털 센서가 있습니다.
### 아날로그 센서
가장 기본적인 센서 중 하나는 아날로그 센서입니다. 이러한 센서는 IoT 장치로부터 전압을 공급받고, 센서 컴포넌트가 전압을 조정하며, 센서로부터 반환되는 전압을 측정하여 센서 값을 제공합니다.
> 🎓전압은 배터리의 +극에서 -극 으로 전기를 이동시키기 위해 한 장소에서 다른 장소로 얼마나 밀리는지를 측정하는 것입니다. 예를 들어, 표준 AA 배터리는 1.5V(V는 볼트 기호)이며, 양극 단자에서 음극 단자로 1.5V의 힘으로 전기를 밀어낼 수 있다. 다른 전기 하드웨어가 작동하려면 다른 전압이 필요합니다. 예를 들어 LED 캔은 2~3V 사이에서 켜지지만 100W 필라멘트 전구는 240V가 필요합니다. 전압에 대한 자세한 내용은 [Wikipedia 에서 Voltage 검색](https://wikipedia.org/wiki/Voltage) 시 확인 가능합니다.
이것의 한 예는 Potentiometer (포텐셔미터)입니다. 이것은 두 위치 사이에서 회전할 수 있고 센서가 회전을 측정하는 다이얼입니다.
![중간 지점에 설정된 potentiometer가 5V를 전송하여 3.8V를 반환합니다.]
(../../../images/potentiometer.png)
IoT 장치는 포텐셔미터에 5V와 같은 전압으로 전기 신호를 보냅니다. 포텐셔미터가 조정되면 반대쪽에서 나오는 전압이 바뀝니다. 앰프의 볼륨 조정기와 같이 0에서 [11](https://wikipedia.org/wiki/Up_to_eleven)로 이동하는 다이얼로 표시된 포텐셔미터가 있다고 가정해 봅시다. 포텐셔미터가 완전히 꺼진 위치(0)에 있으면 0V(0V)가 나옵니다. 최대 ON 위치(11)에 있으면 5V(5V)가 나옵니다.
> 🎓 이것은 지나치게 단순화된 것이며, [Wikipedia에서 potentiometer 검색 시](https://wikipedia.org/wiki/Potentiometer) 포텐셔미터 및 가변 저항기에 대해 더 많은 정보를 얻을 수 있습니다..
센서에서 나오는 전압은 IoT 장치에 의해 읽혀지고, 그 장치는 그것에 반응할 수 있습니다. 센서에 따라 이 전압은 임의 값이거나 표준 장치에 매핑될 수 있습니다. 예를 들어, [서미스터](https://wikipedia.org/wiki/Thermistor) 에 기반한 아날로그 온도 센서는 온도에 따라 저항이 변화합니다. 출력 전압은 코드 계산을 통해 켈빈 단위로, 그에 따라 °C 또는 °F 단위로 변환될 수 있습니다.
✅ 센서가 전송된 전압보다 높은 전압을 반환할 경우(예: 외부 전원 공급 장치에서 나오는 전압) 어떻게 된다고 생각하십니까?
⛔️ 호기심에 실험 해 보진 마십시오.
#### 아날로그에서 디지털로의 변환
IoT는 디지털 장치입니다. 아날로그 값으로는 작동할 수 없고 0과 1에서만 작동합니다. 즉, 아날로그 센서 값을 처리하기 전에 디지털 신호로 변환해야 합니다. 많은 IoT 장치들은 아날로그 입력을 디지털 값 표현으로 변환하는 아날로그-디지털 변환기(ADC)를 가지고 있습니다. 센서는 커넥터 보드를 통해 ADC와 함께 작동할 수도 있습니다. 예를 들어, Raspberry Pi가 있는 seeed Grove ecosystem에서 아날로그 센서는 Pi에 있는 'hat'의 특정 포트에 연결됩니다. 이 포트는 Pi의 GPIO 핀에 연결되어 있습니다. 또한 이 “hat”은 전압을 파이의 GPIO 핀에서 보낼 수 있는 디지털 신호로 변환하기 위한 ADC가 있습니다.
3.3V를 사용하고 1V의 값을 반환하는 IoT 장치에 연결된 아날로그 광 센서가 있다고 가정 해 봅시다. 이 1V는 디지털 세계에서 아무런 의미가 없기 때문에 변환이 필요합니다. 전압은 장치와 센서에 따라 스케일을 사용하여 아날로그 값으로 변환됩니다. 한 가지 예는 0에서 1,023까지의 값을 출력하는 씨드 그로브 광 센서입니다. 3.3V에서 작동하는 이 센서의 경우 1V 출력은 300입니다. IoT 기기는 300을 아날로그 값으로 처리할 수 없기 때문에 300을 Grove hat로 이진법으로 표현한 `0000000100101100`으로 변환됩니다. 그러면 이것은 IoT 장치에 의해 처리될 것 입니다.
✅ 2진법을 모르면 숫자가 0과 1로 어떻게 표현되는지 알아보기 위해 약간의 공부를 추천합니다. [BBC Bitesize introduction to binary lesson](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1)는 이진법을 공부하기 좋은 곳입니다.
코딩의 관점에서 볼 때, 이 모든 것은 보통 센서와 함께 제공되는 라이브러리에 의해 처리되므로, 당신은 이 변환에 대해 스스로 걱정할 필요가 없습니다. Grove 광센서의 경우 파이썬 라이브러리를 사용하여 `light (빛)` 속성을 호출하거나 아두이노 라이브러리를 사용하여 `analogRead` 를 호출하여 300의 값을 얻을 수 있습니다.
### 디지털 센서
아날로그 센서와 같은 디지털 센서는 전압의 변화를 이용하여 주변 세계를 감지합니다. 차이점은 두 개의 상태만 측정하거나 내장된 ADC를 사용하여 디지털 신호를 출력한다는 것입니다. 디지털 센서는 커넥터 보드 또는 IoT 장치 자체에서 ADC를 사용할 필요성을 피하기 위해 점점 더 보편화되고 있습니다.
가장 간단한 디지털 센서는 버튼 또는 스위치입니다. 이것은 켜지거나 꺼지는 두 가지 상태의 센서입니다.
![버튼은 5V로 전송됩니다. 이 스위치를 누르지 않으면 0V가 반환되고, 누르면 5V가 반환됩니다](../../../../images/button.png)
GPIO 핀과 같은 IoT 장치의 핀은 이 신호를 직접 0 또는 1로 측정할 수 있습니다. 전송된 전압이 반환된 전압과 같으면 판독값이 1이고, 그렇지 않으면 판독값이 0입니다. 신호를 변환할 필요가 없습니다. 1 또는 0만 가능합니다.
> 💁 전압은 절대 정확하지 않습니다. 특히 센서의 구성 요소에는 약간의 저항이 있기 때문에 일반적으로 공차가 있습니다. 예를 들어, 라즈베리 파이 상의 GPIO 핀은 3.3V에서 작동하며 1.8V 이상은 1로, 1.8V는 0으로 읽습니다.
* 3.3V가 버튼에 들어갑니다. 버튼이 꺼져 있으므로 0V가 나오고 값이 0입니다.
* 3.3V가 버튼에 들어갑니다. 버튼은 3번으로 되어 있어요.3V가 나오고 값이 1입니다.
더 발전된 디지털 센서는 아날로그 값을 판독한 다음, 온보드 ADC를 사용하여 디지털 신호로 변환합니다. 예를 들어, 디지털 온도 센서는 아날로그 센서와 동일한 방식으로 열전대를 사용하며, 현재 온도에서 열전대의 저항으로 인한 전압 변화를 계속 측정합니다. 아날로그 값을 반환하고 장치나 커넥터 보드에 의존해 디지털 신호로 변환하는 대신 센서에 내장된 ADC가 값을 변환해 IoT 장치에 0과 1의 직렬로 전송합니다. 이러한 0과 1은 1이 최대 전압이고 0이 0v인 버튼에 대한 디지털 신호와 동일한 방식으로 전송됩니다.
![IoT 장치로 전송하기 전에 아날로그 판독값을 0V, 1V를 5V로 하는 이진 데이터로 변환하는 디지털 온도 센서](../../../../images/temperature-as-digital.png)
디지털 데이터를 전송하면 센서가 더욱 복잡해지고 더 자세한 데이터, 심지어 보안 센서를 위해 암호화된 데이터까지 전송할 수 있습니다. 카메라를 생각해봅시다. 카메라는 이미지를 캡처하여 IoT 장치에서 읽을 수 있도록 보통 JPEG와 같은 압축 형식으로 해당 이미지를 전송합니다. 이미지를 캡처하고 전체 이미지 프레임을 프레임별로 전송하거나 압축된 비디오 스트림을 전송하여 비디오를 스트리밍할 수도 있습니다.
## 액추에이터란 무엇인가
액추에이터는 센서의 반대입니다. IoT 장치에서 나오는 전기 신호를 빛이나 소리를 방출하거나 모터를 움직이는 것과 같은 물리적 세계와의 상호 작용으로 변환합니다.
일반적인 액추에이터에는 다음이 포함됩니다 :
* LED - 켜지면 빛이 방출됩니다.
* 스피커 - 기본 부저에서 음악을 재생할 수 있는 오디오 스피커로 전송된 신호에 따라 소리를 냅니다.
* 스테퍼 모터 - 신호를 다이얼 90° 회전과 같이 정의된 회전량으로 변환합니다.
* 릴레이 - 전기 신호에 의해 켜지거나 끌 수 있는 스위치입니다. 그것들은 IoT 장치의 작은 전압이 큰 전압을 켜도록 합니다.
* 화면 - 보다 복잡한 액추에이터로 멀티 세그먼트 디스플레이에 정보를 표시합니다. 화면은 단순한 LED 디스플레이부터 고해상도 비디오 모니터까지 다양합니다.
✅ 생각해봅시다. 당신의 휴대전화에는 어떤 액추에이터가 있습니까?
## 액추에이터를 사용해보자
아래의 관련 안내에 따라 센서에 의해 제어되는 IoT 장치에 작동기를 추가하여 IoT 야간 조명을 만드십시오. 광센서로부터 광도를 모으고, 검출된 광도가 너무 낮을 때 발광하기 위해 LED 형태의 액추에이터를 사용합니다.
![조명 값을 읽어오고 확인 후 LED 제어 시작을 보여주는 할당 흐름도](../../../../images/assignment-1-flow.png)
* [아두이노 - 위오 터미널](wio-terminal-actuator.md)
* [싱글 보드 컴퓨터 - 라즈베리 파이](pi-actuator.md)
* [싱글 보드 컴퓨터 - 가상 ](virtual-device-actuator.md)
## 액추에이터의 종류
센서와 마찬가지로 액추에이터도 아날로그 또는 디지털입니다.
### 아날로그 액추에이터(actuator)
아날로그 액추에이터는 아날로그 신호를 받아 일종의 상호 작용으로 변환하며, 상호 작용은 공급되는 전압에 따라 변화합니다.
한 가지 예는 여러분이 집에 가지고 있을 수 있는 것과 같은 희미한 불빛입니다. 조명에 공급되는 전압의 양에 따라 조명의 밝기가 결정됩니다.
![낮은 전압에서는 희미해지고 높은 전압에서는 밝아지는 조명](../../../../images/dimmable-light.png)
센서와 마찬가지로 실제 IoT 장치는 아날로그가 아닌 디지털 신호에서 작동합니다. 즉, 아날로그 신호를 보내려면 IoT 장치가 직접 IoT 장치 또는 커넥터 보드에 디지털-아날로그 변환기(DAC)가 필요합니다. 그러면 IoT 장치의 0과 1이 액추에이터가 사용할 수 있는 아날로그 전압으로 변환됩니다.
✅ IoT 장치가 액추에이터가 처리할 수 있는 것보다 높은 전압을 전송하면 어떻게 된다고 생각하십니까?
⛔️ 실험 해 보진 마십시오.
### 펄스 폭 변조 (Pulse-Width Modulation)
IoT 장치에서 아날로그 신호로 디지털 신호를 변환하는 또 다른 옵션은 펄스 폭 변조입니다. 이것은 마치 아날로그 신호인 것처럼 작동하는 많은 짧은 디지털 펄스를 보내는 것을 포함합니다.
예를 들어 PWM을 사용하여 모터의 속도를 제어할 수 있습니다.
5V 전원으로 모터를 제어한다고 가정해 보십시오. 모터에 짧은 펄스를 전송하여 전압을 200분의 2초(0.02초) 동안 High(5V)로 전환합니다. 그 시간 동안 당신의 모터는 10분의 1 또는 36° 회전할 수 있습니다. 그런 다음 신호가 200분의 2초(0.02초) 동안 일시 중지되어 낮은 신호(0V)를 전송합니다. 각 ON/OFF 사이클은 0.04초 동안 지속됩니다. 그런 다음 주기가 반복됩니다.
![150rpm에서 모터의 PULE 폭 변조 회전](../../../../images/pwm-motor-150rpm.png)
즉, 1초 동안 모터를 회전시키는 0.02초의 255V 펄스가 있고, 그 후 모터를 회전하지 않는 0.02초의 0.02초의 일시 중지 상태가 있음을 의미합니다. 각 펄스는 모터를 회전의 10분의 1로 회전시킵니다. 즉, 모터가 초당 2.5회전을 완료한다는 의미입니다. 디지털 신호를 사용하여 모터를 초당 2.5회전 또는 [분당 150회](https://wikipedia.org/wiki/Revolutions_per_minute) (비표준 회전 속도 측정)으로 회전했습니다.
```output
초당 25펄스 x 펄스당 0.1회전 = 초당 2.5회전
초당 2.5회전 x 1분에 60초 = 150rpm
```
> 🎓 PWM 신호가 절반 동안 켜져 있고 절반 동안 꺼져 있는 경우를 [50% duty cycle](https://wikipedia.org/wiki/Duty_cycle) 이라고 합니다. 듀티 사이클은 신호가 꺼진 상태와 비교하여 켜진 상태에 있는 시간의 백분율로 측정됩니다.
![75rpm에서 모터의 PULE 폭 변조 회전](../../../../images/pwm-motor-75rpm.png)
펄스 크기를 변경하여 모터 속도를 변경할 수 있습니다. 예를 들어, 동일한 모터를 사용하여 0.04초의 동일한 사이클 시간을 유지할 수 있으며, 온 펄스는 0.01초로 절반으로, 오프 펄스는 0.03초로 증가할 수 있습니다. 초당 펄스 수(25)는 동일하지만 각 펄스의 길이는 절반입니다. 1/2 길이의 펄스는 모터를 20분의 1 회전만 돌리게 하며, 25펄스에서는 초당 1.25회전을 완료하거나 75rpm으로 회전합니다. 디지털 신호의 펄스 속도를 변경함으로써 아날로그 모터 속도를 절반으로 줄였습니다.
```output
초당 25펄스 x 펄스당 0.05회전 = 초당 1.25회전
초당 1.25회 회전 x 1분 동안 60초 = 75rpm
```
✅ 특히 저속 주행 시 모터 회전을 원활하게 유지하려면 어떻게 해야 합니까? 긴 일시 중지를 사용하는 긴 펄스 수를 사용할 것입니까, 아니면 매우 짧은 일시 중지를 사용하는 짧은 펄스 수를 사용할 것입니까?
> 💁 일부 센서는 PWM을 사용하여 아날로그 신호를 디지털 신호로 변환하기도 합니다.
> 🎓 [Wikipedia에서 펄스 폭 변조 검색](https://wikipedia.org/wiki/Pulse-width_modulation) 시 자세한 정보를 얻을 수 있습니다.
### 디지털 액추에이터(actuator)
디지털 센서와 같은 디지털 액추에이터는 고전압 또는 저전압에 의해 제어되는 두 가지 상태를 가지고 있거나 디지털 신호를 아날로그 신호로 변환할 수 있도록 DAC가 내장되어 있습니다.
하나의 간단한 디지털 작동기는 LED입니다. 장치가 1의 디지털 신호를 보내면 LED를 켜는 고전압이 전송됩니다. 0의 디지털 신호가 전송되면 전압이 0V로 떨어지고 LED가 꺼집니다.
![LED는 0V에서 꺼지고 5V에서 켜집니다.](../../../../images/led.png)
✅ 다른 간단한 2-state 액추에이터는 무엇입니까? 한 예로 솔레노이드가 있는데, 이는 도어 볼트를 움직이기 위해 작동하거나 도어를 잠금/잠금 해제하는 등의 작업을 수행할 수 있는 전자석입니다.
화면과 같은 더 발전된 디지털 작동기는 디지털 데이터가 특정 형식으로 전송되어야 합니다. 그들은 보통 그들을 제어하기 위해 정확한 데이터를 더 쉽게 보낼 수 있는 라이브러리와 함께 제공됩니다.
---
## 🚀 도전
이전 두 강의의 과제는 가정, 학교 또는 직장에 있는 가능한 한 많은 IoT 장치를 나열하고 그것들이 마이크로컨트롤러 또는 단일 보드 컴퓨터 또는 심지어 둘의 혼합으로 구축되었는지 결정하는 것이었습니다.
생각해 낸 모든 장치들은 어떤 센서와 액추에이터에 연결되어 있습니까? 이러한 장치에 연결된 각 센서와 액추에이터의 용도는 무엇입니까?
## 복습 퀴즈
[복습 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6)
## 리뷰 & 추가 개별학습
* 전기 및 회로에 대한 정보를 읽어보세요 [ThingLearn](http://thinglearn.jenlooper.com/curriculum/).
* 다양한 유형의 온도 센서에 대한 자세한 내용은 [Seeed Studios Temperature Sensors guide](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/) 를 참조하세요
* LED에 관한 내용은 [Wikipedia LED page](https://wikipedia.org/wiki/Light-emitting_diode) 에서 확인하세요
## 과제
[센서와 액추에이터에 대하여 알아보자](assignment.md)

@ -0,0 +1,17 @@
# 센서와 액추에이터에 대하여 알아보자
## 소개
이 수업에서는 센서와 액추에이터에 대해 설명했습니다. IoT 개발 키트와 함께 사용할 수 있는 센서 하나와 액추에이터 하나를 알아봅시다. 여기에는 다음이 포함됩니다.
* 무슨 일을 하나요?
* 사용되는 전자 장치/하드웨어는 무엇이 있나요?
* 아날로그 장치인가요 디지털장치인가요?
* 입력 또는 측정의 단위 및 범위는 무엇입니까?
## 평가기준(Rubric)
| 기준 | 모범 답안 | 적절함 | 개선이 필요함 |
| -------- | --------- | -------- | ----------------- |
| 센서 설명 | 위에 나열된 4개 섹션에 대한 세부 정보를 포함하여 센서에 대해 설명합니다. | 센서에 대해 설명했지만 위의 섹션 중 2-3개만 제공할 수 있었습니다. | 센서에 대해 설명했지만 위의 섹션 중 1개만 제공할 수 있었습니다. |
| 액추에이터 설명 | 위에 나열된 4개 섹션에 대한 세부 정보를 포함하여 액추에이터에 대해 설명합니다. | 액추에이터에 대해 설명했지만 위의 섹션 중 2-3개만 제공할 수 있었습니다. | 액추에이터에 대해 설명했지만 위의 섹션 중 1개만 제공할 수 있었습니다. |

@ -0,0 +1,116 @@
# 야간 조명 만들기 - 라즈베리 파이
라즈베리 파이에 LED를 추가하여 야간 조명을 만들어봅시다.
## 하드웨어
이 야간 조명에는 액추에이터가 필요합니다.
사용되는 액추에이터는 **LED**로, 전류가 흐를 때 빛을 방출하는 [발광 다이오드](https://wikipedia.org/wiki/Light-emitting_diode) 입니다. LED는 on /off 두 가지 상태를 가진 디지털 액추에이터입니다. 1을 값으로 전송하면 LED가 켜지고 0을 전송하면 꺼집니다. LED는 외부 Grove 액추에이터이며 라즈베리 파이의 Grove Base Hat에 연결해야 합니다
의사 코드에서 야간 조명의 로직은 다음과 같습니다.:
```output
탐지되는 빛의 정도(level)를 확인합니다
빛의 정도가 300 미만일 경우
LED를 켭니다
그렇지 않을 경우
LED를 끕니다
```
### LED 연결하기
Grove LED는 다양한 LED가 포함된 모듈로 제공되므로 색상을 선택할 수 있습니다.
#### 할 일 - LED 연결
LED에 연결 해 봅시다.
![grove LED](../../../../images/grove-led.png)
1. 좋아하는 LED를 선택하고 LED 모듈의 두 구멍에 다리를 삽입합니다.
LED는 발광 다이오드이며, 다이오드는 전류를 한 방향으로만 전달할 수 있는 전자 장치입니다. 즉, LED를 올바른 방향으로 연결해야 합니다. 그렇지 않으면 작동하지 않습니다.
LED 다리 중 하나는 양극 핀이고 다른 하나는 음극 핀입니다. LED는 완벽하게 둥글지 않고 한쪽이 약간 평평합니다. 약간 평평한 면이 음극 핀입니다. LED를 모듈에 연결할 때 둥근 쪽의 핀이 모듈 외부에 +로 표시된 소켓에 연결되고 평평한 쪽이 모듈 중앙에 더 가까운 소켓에 연결되었는지 확인하십시오.
1. LED 모듈에는 밝기를 제어할 수 있는 회전 버튼이 있습니다. 작은 십자 드라이버를 사용하여 시계 반대 방향으로 끝까지 돌립니다.
1. Grove 케이블의 한쪽 끝을 LED 모듈의 소켓에 삽입합니다. 이는 한 방향으로만 돌아갈 것 입니다.
1. Rasberry Pi 전원을 끈 상태에서 Grove 케이블의 다른 쪽 끝을 Pi에 부착된 Grove Base 모자에 D5로 표시된 디지털 소켓에 연결합니다. 이 소켓은 왼쪽에서 두 번째, GPIO 핀 옆에 있는 소켓 줄입니다.
![소켓 D5에 연결된 Grove LED](../../../../images/pi-led.png)
## 야간 조명을 프로그래밍 해봅시다
Grove 조명 센서와 Grove LED를 사용하여 야간 조명 프로그래밍을 진행할 수 있습니다.
### 할 일 - 야간 조명 동작에 대한 프로그래밍을 해 봅시다.
야간 조명에 대한 프로그래밍을 합니다.
1. 라즈베리 파이 전원을 켜고 부팅될 때 까지 기다립니다.
1. 이 할당의 이전 부분에서 만든 VS Code에서 야간 조명 프로젝트를 Pi에서 직접 실행하거나 원격 SSH 확장을 사용하여 연결합니다.
1. 필요한 라이브러리를 가져오려면 아래 코드를 `app.py` 파일에 추가하십시오. 이는 다른`import` 줄 바로 아래 추가되어야 합니다..
```python
from grove.grove_led import GroveLed
```
`from grove.grove_led import GroveLed` 문은 Grove Python 라이브러리에서 `GroveLed` 를 import 한다. 이 라이브러리에는 Grove LED와 상호 작용하는 코드가 있습니다.
1. `light_sensor` 선언 뒤에 다음 코드를 추가하여 LED를 관리하는 클래스의 인스턴스를 만듭니다.
```python
led = GroveLed(5)
```
`led = GroveLed(5)` 코드는 핀 **D5**(LED가 연결된 디지털 Grove 핀)에 연결하는 `GroveLed` 클래스의 인스턴스를 생성합니다.
> 💁 모든 소켓에 고유한 핀 번호가 있습니다. 핀 0, 2, 4, 6은 아날로그 핀이고 핀 5, 16, 18, 22, 24 및 26은 디지털 핀입니다.
1. `while` 루프 내부에 확인용 변수를 추가합니다, `time.sleep` 전에 조명 레벨을 확인하고 LED를 켜거나 끌 수 있습니다.
```python
if light < 300:
led.on()
else:
led.off()
```
이 코드는 감지되는 `빛` 의값을 확인합니다. 이 값이 300 미만인 경우 `GroveLed` 클래스의 `on` 메서드를 호출하여 LED에 디지털 값 1을 전송하고 LED를 켭니다. 조명 값이 300보다 크거나 같으면 꺼짐 방법을 호출하여 디지털 값 0을 LED로 전송하고 LED를 끕니다.
> 💁 이 코드는 `print('Light level:', light)` 라인과 동일한 레벨로 들여써야 하며, while 루프 안에 있어야 합니다!
> 💁 액추에이터로 디지털 값을 전송할 때 0 값은 0V, 1 값은 장치의 최대 전압입니다. Grove 센서 및 액추에이터가 장착된 라즈베리 파이의 경우 1 전압은 3.3V입니다.
1. VS Code Terminal에서 다음을 실행하여 Python 앱을 실행합니다.:
```sh
python3 app.py
```
조명 값이 콘솔에 출력됩니다.
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
1. 조명 센서를 가려도 봅시다. 조명 레벨이 300 이하인 경우 LED가 어떻게 켜지고, 조명 레벨이 300 이상인 경우 LED가 꺼지는지 확인합니다.
> 💁 LED가 동작하지 않는다면 제대로 연결 되어있는지 확인하고 스핀 버튼이 완전히 켜져 있는지 확인 해 보세요
![Light Level 변화에 따라 Pi에 연결된 LED가 켜지고 꺼집니다.](../../../../images/pi-running-assignment-1-1.gif)
> 💁 [code-actuator/pi](code-actuator/pi) 폴더 안에서 이 코드를 찾을 수 있습니다..
😀 여러분이 만든 야간 조명 프로젝트는 성공적으로 동작합니다!

@ -0,0 +1,97 @@
# 야간 조명 만들기 - 라즈베리 파이
이 강의에서 여러분의 라즈베리 파이에 광센서를 적용해봅시다
## 하드웨어
본 강의용 센서는 [광다이오드](https://wikipedia.org/wiki/Photodiode)를 사용하여 빛을 전기신호로 변환하는 **광센서** 입니다. 이는 [lux](https://wikipedia.org/wiki/Lux) 와 같은 표준 측정단위에 매핑되지 않는 0부터 1000까지의 빛의 상대적인 양을 나타내는 정수값을 보내는 아날로그 센서입니다.
광센서는 eternal Grove 센서이며 라즈베리 파이의 Grove base hat에 연결해야 합니다.
### 광센서와 연결해봅시다
광도를 감지하는데 사용되는 Grove 광센서는 라즈베리 파이에 연결해야 합니다.
#### 할 일 - 광센서와 연결 해 봅시다.
광센서와 연결해봅시다.
![Grove 광센서](../../../../images/grove-light-sensor.png)
1. Grove 케이블의 한쪽 끝을 광센서 모듈의 소켓에 삽입합니다. 그것은 한 방향으로만 돌아갈 것입니다.
1. Rasberry Pi 전원을 끈 상태에서 Grove 케이블의 다른 쪽 끝을 Pi에 부착된 Grove Base Hat의 **A0** 라고 표시된 아날로그 소켓에 연결합니다. 이 소켓은 오른쪽에서 두 번째, GPIO 핀 옆에 있는 소켓 열입니다.
![소켓 A0에 연결된 그로브 라이트 센서](../../../../images/pi-light-sensor.png)
## 광센서를 프로그래밍 해 봅시다.
이제 Grove light 센서를 사용하여 장치를 프로그래밍할 수 있습니다.
### 할 일 - 광센서를 프로그래밍한다.
구현 해 봅시다.
1. 라즈베리 파이의 전원은 켜고 부팅 될 때까지 기다립니다.
1. 이 과제의 이전 부분에서 생성한 VS Code에서 야간 조명 프로젝트를 Pi에서 직접 실행하거나 원격 SSH 확장을 사용하여 연결합니다.
1. `app.py` 파일을 열고 이 파일의 모든 코드를 지웁니다.
1. 몇가지 라이브러리 파일을 요청하기 위해 `app.py` 파일에 아래 있는 코드를 추가합니다:
```python
import time
from grove.grove_light_sensor_v1_2 import GroveLightSensor
```
`import time` 은 이 과제 이후에 사용될 `time` 모듈을 import 합니다.
`from grove.grove_light_sensor_v1_2 import GroveLightSensor` 는 Grove Python 라이브러리로부터 `GroveLightSensor` 를 import 합니다. 이 라이브러리는 Grove 광센서와 상호작용 할 수 있는 코드를 가지고 있으며 라즈베리 파이 설정 중에 전역으로 설치되었습니다.
1. 아래 코드를 위에서 작성한 코드 뒤에 추가하여 광센서를 관리하는 클래스의 인스턴스를 만듭니다.
```python
light_sensor = GroveLightSensor(0)
```
`light_sensor = GroveLightSensor(0)`는 핀 **A0**(광센서와 연결되어있는 아날로그 Grove 핀)와 연결되어있는 `GroveLightSensor` class의 인스턴스를 생성합니다.
1. 위에서 작성한 코드 뒤에 무한 루프를 추가하여 광 센서 값을 측정하고 콘솔에 출력합니다 :
```python
while True:
light = light_sensor.light
print('Light level:', light)
```
이는 `GroveLightSensor` 클래스의 `light` 속성을 사용하여 0-1,023의 척도로 현재 빛의 밝기를 판독합니다. 이 속성은 핀에서 아날로그 값을 읽습니다. 이후 이 값이 콘솔에 출력됩니다.
1. 계속 밝기를 확인할 필요가 없으므로 `루프` 끝에 1초의 짧은 절전 시간을 추가한다. 절전 모드는 장치의 전력 소비를 줄여줍니다.
```python
time.sleep(1)
```
1. VS Code의 터미널에서 아래 코드로 Python 앱을 실행 해 봅시다..
```sh
python3 app.py
```
밝기 값이 콘솔에 출력될 것이다. 광센서를 손으로 가려도 보면서 값이 어떻게 변하는지 확인 해 봅시다 :
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
> 💁 [code-sensor/pi](code-sensor/pi) 폴더에서 이 코드를 찾을 수 있습니다.
😀 여러분의 야간 조명 프로그렘에 성공적으로 센서를 적용했습니다!

@ -0,0 +1,79 @@
# 인터넷을 통해 야간 조명을 제어 해봅시다. - 가상 IoT와 Raspberry Pi
IoT 장치는 MQTT를 사용하여 *test.mosquitto.org*와 통신하도록 코딩됩니다. 이는 광센서 판독값과 함께 원격 측정값을 전송하고 LED를 제어하는 명령을 수신하기 위함입니다.
이 강의에서는 여러분의 Raspberry Pi나 가상 IoT 장치에 MQTT broker를 연결하고자 합니다.
## MQTT 사용자 패키지를 설치합니다.
MQTT broker와 통신하기 위해서, 여러분은 MQTT 라이브러리 pip 패키지를 Pi 혹은 사용하시는 가상환경에 설치합니다.
### 작업
pip 패키지를 설치합니다.
1. 야간조명 프로젝트를 VS code에서 열어줍니다.
1. 만약 여러분이 가상 IoT device를 사용하고 있다면 가상환경 터미널이 실행중인지 확인해주세요. 여러분이 Raspberry Pi를 사용하고 있다면 가상환경은 사용하지 않습니다.
1. 아래 코드를 실행하여 MQTT pip 패키지를 설치 해 주세요:
```sh
pip3 install paho-mqtt
```
## 코딩을 진행합니다.
이제 코딩을 진행할 준비가 되었습니다.
### 작업
코드를 작성 해 주세요
1. 아래 코드를 `app.py` 맨 위에 import합니다:
```python
import paho.mqtt.client as mqtt
```
`paho.mqtt.client` 라이브를 사용하여 MQTT와 통신할 수 있습니다.
1. 광센서 및 LED 정의 뒤에 아래 코드를 추가합니다.
```python
id = '<ID>'
client_name = id + 'nightlight_client'
```
`<ID>`를 고유 ID로 교체합니다. 이는 장치 사용자의 이름으로 사용 될 것이며 이후에 이 장치가 publish하고 subscribe하는 항목에 사용됩니다. *test.mosquitto.org*는 public 이며 이 과제를 수행하는 다른 학생들을 포함한 많은 사람들에게 사용됨니다. 고유한 MQTT 사용자 이름과 주제를 사용하면 다른 사용자와 충돌하지 않습니다. 이 ID는 이번 과제 이후에 서버 코드를 생성할 때 또한 필요합니다.
> 💁 고유한ID를 생성하기 위해 [GUIDGen](https://www.guidgen.com) 사이트를 이용할 수 있습니다..
`client_name` 는 broker에서의 MQTT 사용자의 고유한 이름입니다.
1. 아래 코드를 이 새로운 코드 아래에 추가하여 MQTT 사용자 객체를 생성하고 MQTT broker에 연결합니다.:
```python
mqtt_client = mqtt.Client(client_name)
mqtt_client.connect('test.mosquitto.org')
mqtt_client.loop_start()
print("MQTT connected!")
```
이 코드는 사용자 객체를 생성하고, public MQTT broker에 연결하며, subscribe된 topic에 대한 메세지를 수신하는 백그라운드 스레드에서 처리 루프를 실행합니다.
1. 이전 과제에서 실행한 것 과 동일한 방법으로 코드를 실행합니다. 가상 IoT 장치를 사용하는 경우 CouterFit 앱이 실행중인지, 관센서와 LED가 올바른 핀에 생성되었는지 확인해주세요.
```output
(.venv) ➜ nightlight python app.py
MQTT connected!
Light level: 0
Light level: 0
```
> 💁 [code-mqtt/virtual-device](code-mqtt/virtual-device) 폴더나 [code-mqtt/pi](code-mqtt/pi) 폴더에서 코드를 찾을 수 있습니다.
😀 여러분은 여러분의 장치와 MQTT broker를 성공적으로 연결하였습니다.

@ -0,0 +1,223 @@
# Recognize speech with an IoT device
![A sketchnote overview of this lesson](../../../sketchnotes/lesson-21.jpg)
> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version.
This video gives an overview of the Azure speech service, a topic that will be covered in this lesson:
[![How to get started using your Cognitive Services Speech resource from the Microsoft Azure YouTube channel](https://img.youtube.com/vi/iW0Fw0l3mrA/0.jpg)](https://www.youtube.com/watch?v=iW0Fw0l3mrA)
> 🎥 Click the image above to watch a video
## Pre-lecture quiz
[Pre-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/41)
## Introduction
'Alexa, set a 12 minute timer'
'Alexa, timer status'
'Alexa, set a 8 minute timer called steam broccoli'
Smart devices are becoming more and more pervasive. Not just as smart speakers like HomePods, Echos and Google Homes, but embedded in our phones, watches, and even light fittings and thermostats.
> 💁 I have at least 19 devices in my home that have voice assistants, and that's just the ones I know about!
Voice control increases accessibility by allowing folks with limited movement to interact with devices. Whether it is a permanent disability such as being born without arms, to temporary disabilities such as broken arms, or having your hands full of shopping or young children, being able to control our houses from our voice instead of our hands opens up a world of access. Shouting 'Hey Siri, close my garage door' whilst dealing with a baby change and an unruly toddler can be a small but effective improvement on life.
One of the more popular uses for voice assistants is setting timers, especially kitchen timers. Being able to set multiple timers with just your voice is a great help in the kitchen - no need to stop kneading dough, stirring soup, or clean dumpling filling off your hands to use a physical timer.
In this lesson you will learn about building voice recognition into IoT devices. You'll learn about microphones as sensors, how to capture audio from a microphone attached to an IoT device, and how to use AI to convert what is heard into text. Throughout the rest of this project you will build a smart kitchen timer, able to set timers using your voice with multiple languages.
In this lesson we'll cover:
* [Microphones](#마이크)
* [Capture audio from your IoT device](#capture-audio-from-your-iot-device)
* [Speech to text](#speech-to-text)
* [Convert speech to text](#convert-speech-to-text)
## 마이크
마이크는 음파를 전기 신호로 변환하는 아날로그 센서입니다. 공기 중의 진동은 마이크의 구성 요소들을 아주 작은 양으로 움직이게 하고, 이것들은 전기 신호에 작은 변화를 일으킵니다. 이후 이러한 변화는 증폭되어 전기적 출력을 생성합니다.
### 마이크 유형
마이크는 다양한 종류가 있습니다.
* Dynamic - Dynamic 마이크에는 자석이 부착되어있어, 와이어 코일을 통해 움직이며 전류를 생성하는 움직이는 다이어프램이 있습니다. 이것은 대개 전류를 사용하여 와이어 코일에 있는 자석을 움직이는 확성기와는 반대로, 진동판을 움직여 소리를 생성합니다. 즉, 이것은 스피커가 Dynamic 마이크로 사용할 수 있고, dynamic 마이크를 스피커로 사용할 수 있음을 의미합니다. 사용자가 듣거나 말하는 intercom 같은 장치에서 스피커와 마이크의 역할을 동시에 수행할 수 있는 장치는 없습니다.
Dynamic 마이크는 작동하는데 전력이 필요하지 않으며, 전기 신호는 전적으로 마이크에서 생성됩니다.,
![Patti Smith singing into a Shure SM58 (dynamic cardioid type) microphone](../../../../images/dynamic-mic.jpg)
* Ribbon -Ribbon 마이크는 다이어프램 대신 금속 리본이 있다는 점을 제외하면 Dynamic 마이크와 유사합니다. 이 리본은 자기장에서 이동하며 전류를 생성합니다. Dynamic 마이크와 마찬가지로 리본 마이크는 전원이 필요하지 않습니다.
![Edmund Lowe, American actor, standing at radio microphone (labeled for (NBC) Blue Network), holding script, 1942](../../../../images/ribbon-mic.jpg)
* Condenser - Condenser 마이크는 얇은 금속 다이어프램과 고정 금속 백플레이트를 가지고 있습니다. 이 두 가지 모두에 전기가 적용되며 다이어프램이 진동함에 따라 플레이트 사이의 정전기가 변화하여 신호가 생성됩니다. 콘덴서 마이크가 작동하려면 *팬텀 전원*이 필요합니다.
![C451B small-diaphragm condenser microphone by AKG Acoustics](../../../../images/condenser-mic.jpg)
* MEMS - 마이크로 전기 기계 시스템 마이크, 또는 MEMS는 작은 칩에 있는 마이크입니다. 이들은 압력 감지 다이어프램을 실리콘 칩에 새기고, 콘덴서 마이크와 유사하게 작동합니다. 이 마이크들은 아주 작고 회로에 사용 될 수 있습니다.
![A MEMS microphone on a circuit board](../../../../images/mems-microphone.png)
위 이미지에서 **LEFT**라고 표시된 칩은 MEMS 마이크이며 폭이 1mm 미만인 작은 다디어프램이 있습니다.
✅ 생각 해 봅시다 : 컴퓨터, 전화기, 헤드셋 또는 다른 전자기기에서는 어떠한 마이크를 가지고 있는지 조사 해 봅시다.
### Digital audio
오디오는 매우 미세한 정보를 전달하는 아날로그 신호입니다. 이 신호를 디지털로 변환하려면 오디오를 초당 수천번 샘플링 해야합니다.
> 🎓 샘플링이란 오디오 신호를 해당 지점의 신호를 나타내는 디지컬 값으로 변환하는 것 입니다.
![A line chart showing a signal, with discrete points at fixed intervals](../../../../images/sampling.png)
디지털 오디오는 펄스 코드 변조(Pulse Code Modulation, PCM)를 사용하여 샘플링 됩니다. PCM은 신호의 전압을 읽고 정의된 크기를 사용하여 해당 전압에 가장 가까운 이산 값을 선택하는 작업을 포함합니다.
> 💁 PCM은 펄스 폭 변조의 센서 버전 혹은 PWM(PWM은 [lesson 3 of the getting started project](../../../../1-getting-started/lessons/3-sensors-and-actuators/README.md#pulse-width-modulation)에서 다룬 적 있습니다.). PCM은 아날로그 신호를 디지털 신호로 변환하고 PWM은 디지털 신호를 아날로그로 변환합니다.
예를 들어 대부분의 스트리밍 음악 서비스는 16비트 혹은 24비트 오디오를 제공합니다. 즉, 전압을 16비트 정수 또는 24비트 정수로 변환합니다. 16비트 오디오는 -32,768에서 32,767 사이의 숫자로 변환되고, 24비트는 -8,388,608에서 8,388,607 사이의 범위에 있습니다. 비트 수가 많을수록 샘플링 된 결과는 우리가 실제로 귀로 듣는 것과 유사해집니다.
> 💁 종종 LoFi라고 하는 하드 8비트 오디오를 사용할 때가 있습니다. 이것은 8비트만 사용하는 오디오 샘플링으로 범위는 -128에서 127까지입니다. 최초의 컴퓨터 오디오는 하드웨어의 한계로 인해 8비트로 제한되었기 때문에 이것은 레트로 게임에서 자주 볼 수 있습니다.
이러한 샘플은 KHz(초당 수천 개의 판독치) 단위로 잘 정의된 샘플 속도를 사용하여 초당 수천 번 수집됩니다. 스트리밍 음악 서비스는 대부분의 오디오에 48KHz를 사용하지만, 일부 `무손실` 오디오는 최대 96KHz 또는 심지어 192KHz를 사용합니다. 샘플링 속도가 높을수록 오디가 원본에 가깝습니다. 인간이 48KHz 이상의 차이를 구별할 수 있는지에 대한 논란이 있습니다.
✅ 생각 해 봅시다 : 스트리밍 음악 서비스를 사용한다면, 어떤 샘플링 정도와 크기를 사용하나요? CD를 사용할 경우 CD 오디오의 샘플링 비율과 크기는 어떻게 될까요?
오디오 데이터에는 여러가지 다른 형식이 있습니다. 음질을 잃지 않고 작게 만들기 위해서 만들어진 mp3 오디오 데이터에 대하여 들어본 적이 있을 것 입니다. 압축되지 않은 오디오는 종종 WAV 파일로 저장됩니다. 이 파일은 44 바이트릐 헤더 정보와 원시 오디오 데이터를 포합합니다. 헤더에는 샘플링 속도(예: 16KHz의 경우 16000), 샘플링 크기(16비트의 경우 16) 및 채널 수와 같은 정보가 포함됩니다. WAV 파일의 헤더 뒤에 원시 오디오 데이터가 포함됩니다.
> 🎓 채널은 오디오를 구성하는 다양한 오디오 스트림 수를 나타냅니다. 예를 들어, 좌우 구분이 되는 스테레오 오디오의 경우 2개의 채널이 있습니다. 홈 시어터 시스템의 7.1 서라운드 사운드의 경우 8입니다.
### 오디오
오디오 데이터는 상대적으로 큰 값을 가집니다. 압축되지 않은 16비트 오디오를 16KHz(스피치 대 텍스트 모델에서 사용하기에 충분한 속도)로 캡처하려면 오디오의 초당 32KB의 데이터가 필요합니다.
* 16비트는 샘플당 2바이트(1바이트는 8비트)를 의미합니다.
* 16KHz는 초당 16,000개의 샘플입니다.
* 16,000 x 2바이트 = 32,000 bytes/sec.
적은 양의 데이터처럼 느껴질 수 있지만 메모리가 제한된 마이크로 컨트롤러를 사용하는 경우 데이터가 훨씬 더 많게 느껴질 수 있습니다. 예를 들어, Wio Terminal은 192KB의 메모리를 가지고 있으며 프로그램 코드와 변수를 저장해야 합니다. 프로그램 코드의 길이가 짧더라도 5초 이상의 오디오를 캡쳐할 수 없습니다.
마이크로컨트롤러는 SD 카드나 플래시 메모리와 같은 추가 저장소에 액세스할 수 있습니다. 오디오를 캡처하는 IoT 장치를 구축할 때는 추가 저장소가 있어야 할 뿐만 아니라 코드가 마이크에서 캡처한 오디오를 해당 저장소에 직접 기록하고 클라우드로 전송할 때 저장소에서 웹 요청으로 스트리밍해야 합니다. 이렇게 하면 한 번에 전체적인 오디오 데이터 블록을 메모리에 저장하여 메모리 lack을 방지할 수 있습니다.
## Capture audio from your IoT device
Your IoT device can be connected to a microphone to capture audio, ready for conversion to text. It can also be connected to speakers to output audio. In later lessons this will be used to give audio feedback, but it is useful to set up speakers now to test the microphone.
### Task - configure your microphone and speakers
Work through the relevant guide to configure the microphone and speakers for your IoT device:
* [Arduino - Wio Terminal](wio-terminal-microphone.md)
* [Single-board computer - Raspberry Pi](pi-microphone.md)
* [Single-board computer - Virtual device](virtual-device-microphone.md)
### Task - capture audio
Work through the relevant guide to capture audio on your IoT device:
* [Arduino - Wio Terminal](wio-terminal-audio.md)
* [Single-board computer - Raspberry Pi](pi-audio.md)
* [Single-board computer - Virtual device](virtual-device-audio.md)
## Speech to text
Speech to text, or speech recognition, involves using AI to convert words in an audio signal to text.
### Speech recognition models
To convert speech to text, samples from the audio signal are grouped together and fed into a machine learning model based around a Recurrent Neural network (RNN). This is a type of machine learning model that can use previous data to make a decision about incoming data. For example, the RNN could detect one block of audio samples as the sound 'Hel', and when it receives another that it thinks is the sound 'lo', it can combine this with the previous sound, find that 'Hello' is a valid word and select that as the outcome.
ML models always accept data of the same size every time. The image classifier you built in an earlier lesson resizes images to a fixed size and processes them. The same with speech models, they have to process fixed sized audio chunks. The speech models need to be able to combine the outputs of multiple predictions to get the answer, to allow it to distinguish between 'Hi' and 'Highway', or 'flock' and 'floccinaucinihilipilification'.
Speech models are also advanced enough to understand context, and can correct the words they detect as more sounds are processed. For example, if you say "I went to the shops to get two bananas and an apple too", you would use three words that sound the same, but are spelled differently - to, two and too. Speech models are able to understand the context and use the appropriate spelling of the word.
> 💁 Some speech services allow customization to make them work better in noisy environments such as factories, or with industry-specific words such as chemical names. These customizations are trained by providing sample audio and a transcription, and work using transfer learning, the same as how you trained an image classifier using only a few images in an earlier lesson.
### Privacy
When using speech to text in a consumer IoT device, privacy is incredibly important. These devices listen to audio continuously, so as a consumer you don't want everything you say being sent to the cloud and converted to text. Not only will this use a lot of Internet bandwidth, it also has massive privacy implications, especially when some smart device makers randomly select audio for [humans to validate against the text generated to help improve their model](https://www.theverge.com/2019/4/10/18305378/amazon-alexa-ai-voice-assistant-annotation-listen-private-recordings).
You only want your smart device to send audio to the cloud for processing when you are using it, not when it hears audio in your home, audio that could include private meetings or intimate interactions. The way most smart devices work is with a *wake word*, a key phrase such as "Alexa", "Hey Siri", or "OK Google" that causes the device to 'wake up' and listen to what you are saying up until it detects a break in your speech, indicating you have finished talking to the device.
> 🎓 Wake word detection is also referred to as *Keyword spotting* or *Keyword recognition*.
These wake words are detected on the device, not in the cloud. These smart devices have small AI models that run on the device that listen for the wake work, and when it is detected, start streaming the audio to the cloud for recognition. These models are very specialized, and just listen for the wake word.
> 💁 Some tech companies are adding more privacy to their devices and doing some of the speech to text conversion on the device. Apple have announced that as part of their 2021 iOS and macOS updates they will support the speech to text conversion on device, and be able to handle many requests without needing to use the cloud. This is thanks to having powerful processors in their devices that can run ML models.
✅ What do you think are the privacy and ethical implications of storing the audio sent to the cloud? Should this audio be stored, and if so, how? Do you thing the use of recordings for law enforcement is a good trade off for the loss of privacy?
Wake word detection usually uses a technique know an TinyML, that is converting ML models to be able to run on microcontrollers. These models are small in size, and consume very little power to run.
To avoid the complexity of training and using a wake word model, the smart timer you are building in this lesson will use a button to turn on the speech recognition.
> 💁 If you want to try creating a wake word detection model to run on the Wio Terminal or Raspberry Pi, check out this [responding to your voice tutorial by Edge Impulse](https://docs.edgeimpulse.com/docs/responding-to-your-voice). If you want to use your computer to do this, you can try the [get started with Custom Keyword quickstart on the Microsoft docs](https://docs.microsoft.com/azure/cognitive-services/speech-service/keyword-recognition-overview?WT.mc_id=academic-17441-jabenn).
## Convert speech to text
![Speech services logo](../../../images/azure-speech-logo.png)
Just like with image classification in an earlier project, there are pre-built AI services that can take speech as an audio file and convert it to text. Once such service is the Speech Service, part of the Cognitive Services, pre-built AI services you can use in your apps.
### Task - configure a speech AI resource
1. Create a Resource Group for this project called `smart-timer`
1. Use the following command to create a free speech resource:
```sh
az cognitiveservices account create --name smart-timer \
--resource-group smart-timer \
--kind SpeechServices \
--sku F0 \
--yes \
--location <location>
```
Replace `<location>` with the location you used when creating the Resource Group.
1. You will need an API key to access the speech resource from your code. Run the following command to get the key:
```sh
az cognitiveservices account keys list --name smart-timer \
--resource-group smart-timer \
--output table
```
Take a copy of one of the keys.
### Task - convert speech to text
Work through the relevant guide to convert speech to text on your IoT device:
* [Arduino - Wio Terminal](wio-terminal-speech-to-text.md)
* [Single-board computer - Raspberry Pi](pi-speech-to-text.md)
* [Single-board computer - Virtual device](virtual-device-speech-to-text.md)
---
## 🚀 Challenge
Speech recognition has been around for a long time, and is continuously improving. Research the current capabilities and compare how these have evolved over time, including how accurate machine transcriptions are compared to human.
What do you think the future holds for speech recognition?
## Post-lecture quiz
[Post-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/42)
## Review & Self Study
* Read about the different microphone types and how they work on the [what's the difference between dynamic and condenser microphones article on Musician's HQ](https://musicianshq.com/whats-the-difference-between-dynamic-and-condenser-microphones/).
* Read more on the Cognitive Services speech service on the [speech service documentation on Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/speech-service/?WT.mc_id=academic-17441-jabenn)
* Read about keyword spotting on the [keyword recognition documentation on Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/speech-service/keyword-recognition-overview?WT.mc_id=academic-17441-jabenn)
## Assignment
[](assignment.md)

@ -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…
Cancel
Save