From 68a45351934306465f4773f152688c5bcf61cb37 Mon Sep 17 00:00:00 2001 From: Jim Bennett Date: Mon, 28 Jun 2021 17:01:22 -0700 Subject: [PATCH] moving from hub to function (#127) * Adding content * Update en.json * Update README.md * Update TRANSLATIONS.md * Adding lesson tempolates * Fixing code files with each others code in * Update README.md * Adding lesson 16 * Adding virtual camera * Adding Wio Terminal camera capture * Adding wio terminal code * Adding SBC classification to lesson 16 * Adding challenge, review and assignment * Adding images and using new Azure icons * Update README.md * Update iot-reference-architecture.png * Adding structure for JulyOT links * Removing icons * Sketchnotes! * Create lesson-1.png * Starting on lesson 18 * Updated sketch * Adding virtual distance sensor * Adding Wio Terminal image classification * Update README.md * Adding structure for project 6 and wio terminal distance sensor * Adding some of the smart timer stuff * Updating sketchnotes * Adding virtual device speech to text * Adding chapter 21 * Language tweaks * Lesson 22 stuff * Update en.json * Bumping seeed libraries * Adding functions lab to lesson 22 * Almost done with LUIS * Update README.md * Reverting sunlight sensor change Fixes #88 * Structure * Adding speech to text lab for Pi * Adding virtual device text to speech lab * Finishing lesson 23 * Clarifying privacy Fixes #99 * Update README.md * Update hardware.md * Update README.md * Fixing some code samples that were wrong * Adding more on translation * Adding more on translator * Update README.md * Update README.md * Adding public access to the container * First part of retail object detection * More on stock lesson * Tweaks to maps lesson * Update README.md * Update pi-sensor.md * IoT Edge install stuffs * Notes on consumer groups and not running the event monitor at the same time * Assignment for object detector * Memory notes for speech to text * Migrating LUIS to an HTTP trigger * Adding Wio Terminal speech to text * Changing smart timer to functions from hub --- .../lessons/2-deeper-dive/README.md | 1 + .../lessons/1-train-stock-detector/README.md | 6 +- .../1-train-stock-detector/assignment.md | 9 +- .../lessons/1-speech-recognition/README.md | 36 +- .../code-iot-hub/pi/smart-timer/app.py | 93 --- .../virtual-iot-device/smart-timer/app.py | 33 -- .../wio-terminal/smart-timer/include/README | 39 ++ .../wio-terminal/smart-timer/lib/README | 46 ++ .../wio-terminal/smart-timer/platformio.ini | 19 + .../smart-timer/src/flash_writer.h | 60 ++ .../wio-terminal/smart-timer/src/main.cpp | 49 ++ .../wio-terminal/smart-timer/src/mic.h | 248 ++++++++ .../wio-terminal/smart-timer/test/README | 11 + .../code-speech-to-text/pi/smart-timer/app.py | 8 +- .../virtual-iot-device/smart-timer/app.py | 5 +- .../wio-terminal/smart-timer/include/README | 39 ++ .../wio-terminal/smart-timer/lib/README | 46 ++ .../wio-terminal/smart-timer/platformio.ini | 22 + .../wio-terminal/smart-timer/src/config.h | 89 +++ .../smart-timer/src/flash_stream.h | 69 +++ .../smart-timer/src/flash_writer.h | 60 ++ .../wio-terminal/smart-timer/src/main.cpp | 69 +++ .../wio-terminal/smart-timer/src/mic.h | 242 ++++++++ .../smart-timer/src/speech_to_text.h | 102 ++++ .../wio-terminal/smart-timer/test/README | 11 + .../1-speech-recognition/pi-speech-to-text.md | 16 +- .../virtual-device-speech-to-text.md | 8 +- .../wio-terminal-audio.md | 535 +++++++++++++++++- .../wio-terminal-microphone.md | 10 +- .../wio-terminal-speech-to-text.md | 520 ++++++++++++++++- .../2-language-understanding/README.md | 112 +++- .../2-language-understanding/assignment.md | 2 +- .../smart-timer-trigger/local.settings.json | 3 +- .../speech-trigger/__init__.py | 43 -- .../speech-trigger/function.json | 15 - .../text-to-timer/__init__.py | 44 ++ .../text-to-timer/function.json | 20 + .../lessons/3-spoken-feedback/README.md | 29 +- .../functions/smart-timer-trigger/host.json | 15 - .../smart-timer-trigger/local.settings.json | 12 - .../smart-timer-trigger/requirements.txt | 4 - .../speech-trigger/__init__.py | 60 -- .../speech-trigger/function.json | 15 - .../code-timer/pi/smart-timer/app.py | 52 +- .../virtual-iot-device/smart-timer/app.py | 51 +- .../single-board-computer-set-timer.md | 73 ++- README.md | 2 +- images/Diagrams.sketch | Bin 23856950 -> 23900812 bytes images/dmac-adc-buffers.png | Bin 0 -> 44525 bytes 49 files changed, 2600 insertions(+), 453 deletions(-) delete mode 100644 6-consumer/lessons/1-speech-recognition/code-iot-hub/pi/smart-timer/app.py delete mode 100644 6-consumer/lessons/1-speech-recognition/code-iot-hub/virtual-iot-device/smart-timer/app.py create mode 100644 6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/include/README create mode 100644 6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/lib/README create mode 100644 6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/platformio.ini create mode 100644 6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/flash_writer.h create mode 100644 6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/main.cpp create mode 100644 6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/mic.h create mode 100644 6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/test/README create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/include/README create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/lib/README create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/platformio.ini create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/config.h create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/flash_stream.h create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/flash_writer.h create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/main.cpp create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/mic.h create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/speech_to_text.h create mode 100644 6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/test/README delete mode 100644 6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/speech-trigger/__init__.py delete mode 100644 6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/speech-trigger/function.json create mode 100644 6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/text-to-timer/__init__.py create mode 100644 6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/text-to-timer/function.json delete mode 100644 6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/host.json delete mode 100644 6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/local.settings.json delete mode 100644 6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/requirements.txt delete mode 100644 6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/speech-trigger/__init__.py delete mode 100644 6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/speech-trigger/function.json create mode 100644 images/dmac-adc-buffers.png diff --git a/1-getting-started/lessons/2-deeper-dive/README.md b/1-getting-started/lessons/2-deeper-dive/README.md index 175df64..c044759 100644 --- a/1-getting-started/lessons/2-deeper-dive/README.md +++ b/1-getting-started/lessons/2-deeper-dive/README.md @@ -261,6 +261,7 @@ The challenge in the last lesson was to list as many IoT devices as you can that * Read the [Arduino getting started guide](https://www.arduino.cc/en/Guide/Introduction) to understand more about the Arduino platform. * Read the [introduction to the Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) to learn more about Raspberry Pis. +* Learn more on some of the concepts and acronyms in the [What the FAQ are CPUs, MPUs, MCUs, and GPUs article in the Electrical Engineering Journal](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/). ✅ Use these guides, along with the costs shown by following the links in the [hardware guide](../../../hardware.md) to decide on what hardware platform you want to use, or if you would rather use a virtual device. diff --git a/5-retail/lessons/1-train-stock-detector/README.md b/5-retail/lessons/1-train-stock-detector/README.md index ada15c3..7a680a9 100644 --- a/5-retail/lessons/1-train-stock-detector/README.md +++ b/5-retail/lessons/1-train-stock-detector/README.md @@ -111,7 +111,7 @@ You can train an object detector using Custom Vision, in a similar way to how yo ![The settings for the custom vision project with the name set to fruit-quality-detector, no description, the resource set to fruit-quality-detector-training, the project type set to classification, the classification types set to multi class and the domains set to food](../../../images/custom-vision-create-object-detector-project.png) - > 💁 The products on shelves domain is specifically targeted for detecting stock on store shelves. + ✅ The products on shelves domain is specifically targeted for detecting stock on store shelves. Read more on the different domains in the [Select a domian documentation on Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/select-domain?WT.mc_id=academic-17441-jabenn#object-detection) ✅ Take some time to explore the Custom Vision UI for your object detector. @@ -119,7 +119,7 @@ You can train an object detector using Custom Vision, in a similar way to how yo To train your model you will need a set of images containing the objects you want to detect. -1. Gather images that contain the object to detect. You will need at least 15 images containing each object to detect from a variety of different angles and in different lighting conditions, but the more the better. You will also need a few images to test the model. If you are detecting more than one object, you will want some testing images that contain all the objects. +1. Gather images that contain the object to detect. You will need at least 15 images containing each object to detect from a variety of different angles and in different lighting conditions, but the more the better. This object detector uses the *Products on shelves* domain, so try to set up the objects as if they were on a store shelf. You will also need a few images to test the model. If you are detecting more than one object, you will want some testing images that contain all the objects. > 💁 Images with multiple different objects count towards the 15 image minimum for all the objects in the image. @@ -188,4 +188,4 @@ If you have any similar looking items, test it out by adding images of them to y ## Assignment -[](assignment.md) +[Compare domains](assignment.md) diff --git a/5-retail/lessons/1-train-stock-detector/assignment.md b/5-retail/lessons/1-train-stock-detector/assignment.md index da157d5..13c342d 100644 --- a/5-retail/lessons/1-train-stock-detector/assignment.md +++ b/5-retail/lessons/1-train-stock-detector/assignment.md @@ -1,9 +1,14 @@ -# +# Compare domains ## Instructions +When you created your object detector, you had a choice of multiple domains. Compare how well they work for your stock detector, and describe which gives better results. + +To change the domain, select the **Settings** button on the top menu, select a new domain, select the **Save changes** button, then retrain the model. Make sure you test with the new iteration of the model trained with the new domain. + ## Rubric | Criteria | Exemplary | Adequate | Needs Improvement | | -------- | --------- | -------- | ----------------- | -| | | | | +| Train the model with a different domain | Was able to change the domain and re-train the model | Was able to change the domain and re-train the model | Was unable to change the domain or re-train the model | +| Test the model and compare the results | Was able to test the model with different domains, compare results, and describe which is better | Was able to test the model with different domains, but was unable to compare the results and describe which is better | Was unable to test the model with different domains | diff --git a/6-consumer/lessons/1-speech-recognition/README.md b/6-consumer/lessons/1-speech-recognition/README.md index 4bfa8ce..b3c2634 100644 --- a/6-consumer/lessons/1-speech-recognition/README.md +++ b/6-consumer/lessons/1-speech-recognition/README.md @@ -91,6 +91,22 @@ These samples are taken many thousands of times per second, using well-defined s ✅ Do some research: If you use a streaming music service, what sample rate and size does it use? If you use CDs, what is the sample rate and size of CD audio? +There are a number of different formats for audio data. You've probably heard of mp3 files - audio data that is compressed to make it smaller without losing any quality. Uncompressed audio is often stored as a WAV file - this is a file with 44 bytes of header information, followed by raw audio data. The header contains information such as the sample rate (for example 16000 for 16KHz) and sample size (16 for 16-bit), and the number of channels. After the header, the WAV file contains the raw audio data. + +> 🎓 Channels refers to how many different audio streams make up the audio. For example, for stereo audio with left and right, there would be 2 channels. For 7.1 surround sound for a home theater system this would be 8. + +### Audio data size + +Audio data is relatively large. For example, capturing uncompressed 16-bit audio at 16KHz (a good enough rate for use with speech to text model), takes 32KB of data for each second of audio: + +* 16-bit means 2 bytes per sample (1 byte is 8 bits). +* 16KHz is 16,000 samples per second. +* 16,000 x 2 bytes = 32,000 bytes per second. + +This sounds like a small amount of data, but if you are using a microcontroller with limited memory, this can be a lot. For example, the Wio Terminal has 192KB of memory, and that needs to store program code and variables. Even if your program code was tiny, you couldn't capture more than 5 seconds of audio. + +Microcontrollers can access additional storage, such as SD cards or flash memory. When building an IoT device that captures audio you will need to ensure not only you have additional storage, but your code writes the audio captured from your microphone directly to that storage, and when sending it to the cloud, you stream from storage to the web request. That way you can avoid running out of memory by trying to hold the entire block of audio data in memory at once. + ## 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. @@ -186,26 +202,6 @@ Work through the relevant guide to convert speech to text on your IoT device: * [Single-board computer - Raspberry Pi](pi-speech-to-text.md) * [Single-board computer - Virtual device](virtual-device-speech-to-text.md) -### Task - send converted speech to an IoT services - -To use the results of the speech to text conversion, you need to send it to the cloud. There it will be interpreted and responses sent back to the IoT device as commands. - -1. Create a new IoT Hub in the `smart-timer` resource group, and register a new device called `smart-timer`. - -1. Connect your IoT device to this IoT Hub using what you have learned in previous lessons, and send the speech as telemetry. Use a JSON document in this format: - - ```json - { - "speech" : "" - } - ``` - - Where `` is the output from the speech to text call. You only need to send speech that has content, if the call returns an empty string it can be ignored. - -1. Verify that messages are being sent by monitoring the Event Hub compatible endpoint using the `az iot hub monitor-events` command. - -> 💁 You can find this code in the [code-iot-hub/virtual-iot-device](code-iot-hub/virtual-iot-device), [code-iot-hub/pi](code-iot-hub/pi), or [code-iot-hub/wio-terminal](code-iot-hub/wio-terminal) folder. - --- ## 🚀 Challenge diff --git a/6-consumer/lessons/1-speech-recognition/code-iot-hub/pi/smart-timer/app.py b/6-consumer/lessons/1-speech-recognition/code-iot-hub/pi/smart-timer/app.py deleted file mode 100644 index 81c16e6..0000000 --- a/6-consumer/lessons/1-speech-recognition/code-iot-hub/pi/smart-timer/app.py +++ /dev/null @@ -1,93 +0,0 @@ -import io -import json -import pyaudio -import requests -import time -import wave - -from azure.iot.device import IoTHubDeviceClient, Message - -from grove.factory import Factory -button = Factory.getButton('GPIO-HIGH', 5) - -audio = pyaudio.PyAudio() -microphone_card_number = 1 -speaker_card_number = 1 -rate = 48000 - -def capture_audio(): - stream = audio.open(format = pyaudio.paInt16, - rate = rate, - channels = 1, - input_device_index = microphone_card_number, - input = True, - frames_per_buffer = 4096) - - frames = [] - - while button.is_pressed(): - frames.append(stream.read(4096)) - - stream.stop_stream() - stream.close() - - wav_buffer = io.BytesIO() - with wave.open(wav_buffer, 'wb') as wavefile: - wavefile.setnchannels(1) - wavefile.setsampwidth(audio.get_sample_size(pyaudio.paInt16)) - wavefile.setframerate(rate) - wavefile.writeframes(b''.join(frames)) - wav_buffer.seek(0) - - return wav_buffer - -speech_api_key = '' -location = '' -language = '' -connection_string = '' - -device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) - -print('Connecting') -device_client.connect() -print('Connected') - -def get_access_token(): - headers = { - 'Ocp-Apim-Subscription-Key': speech_api_key - } - - token_endpoint = f'https://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken' - response = requests.post(token_endpoint, headers=headers) - return str(response.text) - -def convert_speech_to_text(buffer): - url = f'https://{location}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1' - - headers = { - 'Authorization': 'Bearer ' + get_access_token(), - 'Content-Type': f'audio/wav; codecs=audio/pcm; samplerate={rate}', - 'Accept': 'application/json;text/xml' - } - - params = { - 'language': language - } - - response = requests.post(url, headers=headers, params=params, data=buffer) - response_json = json.loads(response.text) - - if response_json['RecognitionStatus'] == 'Success': - return response_json['DisplayText'] - else: - return '' - -while True: - while not button.is_pressed(): - time.sleep(.1) - - buffer = capture_audio() - text = convert_speech_to_text(buffer) - if len(text) > 0: - message = Message(json.dumps({ 'speech': text })) - device_client.send_message(message) \ No newline at end of file diff --git a/6-consumer/lessons/1-speech-recognition/code-iot-hub/virtual-iot-device/smart-timer/app.py b/6-consumer/lessons/1-speech-recognition/code-iot-hub/virtual-iot-device/smart-timer/app.py deleted file mode 100644 index 2b2f2c2..0000000 --- a/6-consumer/lessons/1-speech-recognition/code-iot-hub/virtual-iot-device/smart-timer/app.py +++ /dev/null @@ -1,33 +0,0 @@ -import json -import time -from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer -from azure.iot.device import IoTHubDeviceClient, Message - -speech_api_key = '' -location = '' -language = '' -connection_string = '' - -device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) - -print('Connecting') -device_client.connect() -print('Connected') - -recognizer_config = SpeechConfig(subscription=speech_api_key, - region=location, - speech_recognition_language=language) - -recognizer = SpeechRecognizer(speech_config=recognizer_config) - -def recognized(args): - if len(args.result.text) > 0: - message = Message(json.dumps({ 'speech': args.result.text })) - device_client.send_message(message) - -recognizer.recognized.connect(recognized) - -recognizer.start_continuous_recognition() - -while True: - time.sleep(1) \ No newline at end of file diff --git a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/include/README b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/lib/README b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/platformio.ini b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/platformio.ini new file mode 100644 index 0000000..c5999f1 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/platformio.ini @@ -0,0 +1,19 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:seeed_wio_terminal] +platform = atmelsam +board = seeed_wio_terminal +framework = arduino +lib_deps = + seeed-studio/Seeed Arduino FS @ 2.0.3 + seeed-studio/Seeed Arduino SFUD @ 2.0.1 +build_flags = + -DSFUD_USING_QSPI diff --git a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/flash_writer.h b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/flash_writer.h new file mode 100644 index 0000000..87fdff2 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/flash_writer.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include + +class FlashWriter +{ +public: + void init() + { + _flash = sfud_get_device_table() + 0; + _sfudBufferSize = _flash->chip.erase_gran; + _sfudBuffer = new byte[_sfudBufferSize]; + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void reset() + { + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void writeSfudBuffer(byte b) + { + _sfudBuffer[_sfudBufferPos++] = b; + if (_sfudBufferPos == _sfudBufferSize) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void flushSfudBuffer() + { + if (_sfudBufferPos > 0) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void writeSfudBuffer(byte *b, size_t len) + { + for (size_t i = 0; i < len; ++i) + { + writeSfudBuffer(b[i]); + } + } + +private: + byte *_sfudBuffer; + size_t _sfudBufferSize; + size_t _sfudBufferPos; + size_t _sfudBufferWritePos; + + const sfud_flash *_flash; +}; \ No newline at end of file diff --git a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/main.cpp b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/main.cpp new file mode 100644 index 0000000..0f77c9b --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/main.cpp @@ -0,0 +1,49 @@ +#include +#include +#include + +#include "mic.h" + +void setup() +{ + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + + while (!(sfud_init() == SFUD_SUCCESS)) + ; + + sfud_qspi_fast_read_enable(sfud_get_device(SFUD_W25Q32_DEVICE_INDEX), 2); + + pinMode(WIO_KEY_C, INPUT_PULLUP); + + mic.init(); + + Serial.println("Ready."); +} + +void processAudio() +{ + +} + +void loop() +{ + if (digitalRead(WIO_KEY_C) == LOW && !mic.isRecording()) + { + Serial.println("Starting recording..."); + mic.startRecording(); + } + + if (!mic.isRecording() && mic.isRecordingReady()) + { + Serial.println("Finished recording"); + + processAudio(); + + mic.reset(); + } +} \ No newline at end of file diff --git a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/mic.h b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/mic.h new file mode 100644 index 0000000..ecdeb41 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/src/mic.h @@ -0,0 +1,248 @@ +#pragma once + +#include + +#include "flash_writer.h" + +#define RATE 16000 +#define SAMPLE_LENGTH_SECONDS 4 +#define SAMPLES RATE * SAMPLE_LENGTH_SECONDS +#define BUFFER_SIZE (SAMPLES * 2) + 44 +#define ADC_BUF_LEN 1600 + +class Mic +{ +public: + Mic() + { + _isRecording = false; + _isRecordingReady = false; + } + + void startRecording() + { + _isRecording = true; + _isRecordingReady = false; + } + + bool isRecording() + { + return _isRecording; + } + + bool isRecordingReady() + { + return _isRecordingReady; + } + + void init() + { + analogReference(AR_INTERNAL2V23); + + _writer.init(); + + initBufferHeader(); + configureDmaAdc(); + } + + void reset() + { + _isRecordingReady = false; + _isRecording = false; + + _writer.reset(); + + initBufferHeader(); + } + + void dmaHandler() + { + static uint8_t count = 0; + static uint16_t idx = 0; + + if (DMAC->Channel[1].CHINTFLAG.bit.SUSP) + { + DMAC->Channel[1].CHCTRLB.reg = DMAC_CHCTRLB_CMD_RESUME; + DMAC->Channel[1].CHINTFLAG.bit.SUSP = 1; + + if (count) + { + audioCallback(_adc_buf_0, ADC_BUF_LEN); + } + else + { + audioCallback(_adc_buf_1, ADC_BUF_LEN); + } + + count = (count + 1) % 2; + } + } + +private: + volatile bool _isRecording; + volatile bool _isRecordingReady; + FlashWriter _writer; + +typedef struct + { + uint16_t btctrl; + uint16_t btcnt; + uint32_t srcaddr; + uint32_t dstaddr; + uint32_t descaddr; + } dmacdescriptor; + + // Globals - DMA and ADC + volatile dmacdescriptor _wrb[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor_section[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor __attribute__((aligned(16))); + + void configureDmaAdc() + { + // Configure DMA to sample from ADC at a regular interval (triggered by timer/counter) + DMAC->BASEADDR.reg = (uint32_t)_descriptor_section; // Specify the location of the descriptors + DMAC->WRBADDR.reg = (uint32_t)_wrb; // Specify the location of the write back descriptors + DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf); // Enable the DMAC peripheral + DMAC->Channel[1].CHCTRLA.reg = DMAC_CHCTRLA_TRIGSRC(TC5_DMAC_ID_OVF) | // Set DMAC to trigger on TC5 timer overflow + DMAC_CHCTRLA_TRIGACT_BURST; // DMAC burst transfer + + _descriptor.descaddr = (uint32_t)&_descriptor_section[1]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_0 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_0 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[0], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + _descriptor.descaddr = (uint32_t)&_descriptor_section[0]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_1 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_1 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[1], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + // Configure NVIC + NVIC_SetPriority(DMAC_1_IRQn, 0); // Set the Nested Vector Interrupt Controller (NVIC) priority for DMAC1 to 0 (highest) + NVIC_EnableIRQ(DMAC_1_IRQn); // Connect DMAC1 to Nested Vector Interrupt Controller (NVIC) + + // Activate the suspend (SUSP) interrupt on DMAC channel 1 + DMAC->Channel[1].CHINTENSET.reg = DMAC_CHINTENSET_SUSP; + + // Configure ADC + ADC1->INPUTCTRL.bit.MUXPOS = ADC_INPUTCTRL_MUXPOS_AIN12_Val; // Set the analog input to ADC0/AIN2 (PB08 - A4 on Metro M4) + while (ADC1->SYNCBUSY.bit.INPUTCTRL) + ; // Wait for synchronization + ADC1->SAMPCTRL.bit.SAMPLEN = 0x00; // Set max Sampling Time Length to half divided ADC clock pulse (2.66us) + while (ADC1->SYNCBUSY.bit.SAMPCTRL) + ; // Wait for synchronization + ADC1->CTRLA.reg = ADC_CTRLA_PRESCALER_DIV128; // Divide Clock ADC GCLK by 128 (48MHz/128 = 375kHz) + ADC1->CTRLB.reg = ADC_CTRLB_RESSEL_12BIT | // Set ADC resolution to 12 bits + ADC_CTRLB_FREERUN; // Set ADC to free run mode + while (ADC1->SYNCBUSY.bit.CTRLB) + ; // Wait for synchronization + ADC1->CTRLA.bit.ENABLE = 1; // Enable the ADC + while (ADC1->SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + ADC1->SWTRIG.bit.START = 1; // Initiate a software trigger to start an ADC conversion + while (ADC1->SYNCBUSY.bit.SWTRIG) + ; // Wait for synchronization + + // Enable DMA channel 1 + DMAC->Channel[1].CHCTRLA.bit.ENABLE = 1; + + // Configure Timer/Counter 5 + GCLK->PCHCTRL[TC5_GCLK_ID].reg = GCLK_PCHCTRL_CHEN | // Enable perhipheral channel for TC5 + GCLK_PCHCTRL_GEN_GCLK1; // Connect generic clock 0 at 48MHz + + TC5->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; // Set TC5 to Match Frequency (MFRQ) mode + TC5->COUNT16.CC[0].reg = 3000 - 1; // Set the trigger to 16 kHz: (4Mhz / 16000) - 1 + while (TC5->COUNT16.SYNCBUSY.bit.CC0) + ; // Wait for synchronization + + // Start Timer/Counter 5 + TC5->COUNT16.CTRLA.bit.ENABLE = 1; // Enable the TC5 timer + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + } + + uint16_t _adc_buf_0[ADC_BUF_LEN]; + uint16_t _adc_buf_1[ADC_BUF_LEN]; + + // WAV files have a header. This struct defines that header + struct wavFileHeader + { + char riff[4]; /* "RIFF" */ + long flength; /* file length in bytes */ + char wave[4]; /* "WAVE" */ + char fmt[4]; /* "fmt " */ + long chunk_size; /* size of FMT chunk in bytes (usually 16) */ + short format_tag; /* 1=PCM, 257=Mu-Law, 258=A-Law, 259=ADPCM */ + short num_chans; /* 1=mono, 2=stereo */ + long srate; /* Sampling rate in samples per second */ + long bytes_per_sec; /* bytes per second = srate*bytes_per_samp */ + short bytes_per_samp; /* 2=16-bit mono, 4=16-bit stereo */ + short bits_per_samp; /* Number of bits per sample */ + char data[4]; /* "data" */ + long dlength; /* data length in bytes (filelength - 44) */ + }; + + void initBufferHeader() + { + wavFileHeader wavh; + + strncpy(wavh.riff, "RIFF", 4); + strncpy(wavh.wave, "WAVE", 4); + strncpy(wavh.fmt, "fmt ", 4); + strncpy(wavh.data, "data", 4); + + wavh.chunk_size = 16; + wavh.format_tag = 1; // PCM + wavh.num_chans = 1; // mono + wavh.srate = RATE; + wavh.bytes_per_sec = (RATE * 1 * 16 * 1) / 8; + wavh.bytes_per_samp = 2; + wavh.bits_per_samp = 16; + wavh.dlength = RATE * 2 * 1 * 16 / 2; + wavh.flength = wavh.dlength + 44; + + _writer.writeSfudBuffer((byte *)&wavh, 44); + } + + void audioCallback(uint16_t *buf, uint32_t buf_len) + { + static uint32_t idx = 44; + + if (_isRecording) + { + for (uint32_t i = 0; i < buf_len; i++) + { + int16_t audio_value = ((int16_t)buf[i] - 2048) * 16; + + _writer.writeSfudBuffer(audio_value & 0xFF); + _writer.writeSfudBuffer((audio_value >> 8) & 0xFF); + } + + idx += buf_len; + + if (idx >= BUFFER_SIZE) + { + _writer.flushSfudBuffer(); + idx = 44; + _isRecording = false; + _isRecordingReady = true; + } + } + } +}; + +Mic mic; + +void DMAC_1_Handler() +{ + mic.dmaHandler(); +} diff --git a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/test/README b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/test/README new file mode 100644 index 0000000..b94d089 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/pi/smart-timer/app.py b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/pi/smart-timer/app.py index 3a56b2f..b3bd252 100644 --- a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/pi/smart-timer/app.py +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/pi/smart-timer/app.py @@ -1,5 +1,4 @@ import io -import json import pyaudio import requests import time @@ -66,17 +65,20 @@ def convert_speech_to_text(buffer): } response = requests.post(url, headers=headers, params=params, data=buffer) - response_json = json.loads(response.text) + response_json = response.json() if response_json['RecognitionStatus'] == 'Success': return response_json['DisplayText'] else: return '' +def process_text(text): + print(text) + while True: while not button.is_pressed(): time.sleep(.1) buffer = capture_audio() text = convert_speech_to_text(buffer) - print(text) \ No newline at end of file + process_text(text) \ No newline at end of file diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/virtual-iot-device/smart-timer/app.py b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/virtual-iot-device/smart-timer/app.py index 6d282ad..4c9ea0a 100644 --- a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/virtual-iot-device/smart-timer/app.py +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/virtual-iot-device/smart-timer/app.py @@ -11,8 +11,11 @@ recognizer_config = SpeechConfig(subscription=speech_api_key, recognizer = SpeechRecognizer(speech_config=recognizer_config) +def process_text(text): + print(text) + def recognized(args): - print(args.result.text) + process_text(args.result.text) recognizer.recognized.connect(recognized) diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/include/README b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/lib/README b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/platformio.ini b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/platformio.ini new file mode 100644 index 0000000..5adbe73 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/platformio.ini @@ -0,0 +1,22 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:seeed_wio_terminal] +platform = atmelsam +board = seeed_wio_terminal +framework = arduino +lib_deps = + seeed-studio/Seeed Arduino FS @ 2.0.3 + seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 + seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 + seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 + seeed-studio/Seeed Arduino RTC @ 2.0.0 + bblanchon/ArduinoJson @ 6.17.3 diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/config.h b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/config.h new file mode 100644 index 0000000..cca25e6 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/config.h @@ -0,0 +1,89 @@ +#pragma once + +#define RATE 16000 +#define SAMPLE_LENGTH_SECONDS 4 +#define SAMPLES RATE * SAMPLE_LENGTH_SECONDS +#define BUFFER_SIZE (SAMPLES * 2) + 44 +#define ADC_BUF_LEN 1600 + +const char *SSID = ""; +const char *PASSWORD = ""; + +const char *SPEECH_API_KEY = ""; +const char *SPEECH_LOCATION = ""; +const char *LANGUAGE = ""; + +const char *TOKEN_URL = "https://%s.api.cognitive.microsoft.com/sts/v1.0/issuetoken"; +const char *SPEECH_URL = "https://%s.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=%s"; + +const char *TOKEN_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQAueRcfuAIek/4tmDg0xQwDANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwNjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBALVGARl56bx3KBUSGuPc4H5uoNFkFH4e7pvTCxRi4j/+z+Xb\r\n" + "wjEz+5CipDOqjx9/jWjskL5dk7PaQkzItidsAAnDCW1leZBOIi68Lff1bjTeZgMY\r\n" + "iwdRd3Y39b/lcGpiuP2d23W95YHkMMT8IlWosYIX0f4kYb62rphyfnAjYb/4Od99\r\n" + "ThnhlAxGtfvSbXcBVIKCYfZgqRvV+5lReUnd1aNjRYVzPOoifgSx2fRyy1+pO1Uz\r\n" + "aMMNnIOE71bVYW0A1hr19w7kOb0KkJXoALTDDj1ukUEDqQuBfBxReL5mXiu1O7WG\r\n" + "0vltg0VZ/SZzctBsdBlx1BkmWYBW261KZgBivrql5ELTKKd8qgtHcLQA5fl6JB0Q\r\n" + "gs5XDaWehN86Gps5JW8ArjGtjcWAIP+X8CQaWfaCnuRm6Bk/03PQWhgdi84qwA0s\r\n" + "sRfFJwHUPTNSnE8EiGVk2frt0u8PG1pwSQsFuNJfcYIHEv1vOzP7uEOuDydsmCjh\r\n" + "lxuoK2n5/2aVR3BMTu+p4+gl8alXoBycyLmj3J/PUgqD8SL5fTCUegGsdia/Sa60\r\n" + "N2oV7vQ17wjMN+LXa2rjj/b4ZlZgXVojDmAjDwIRdDUujQu0RVsJqFLMzSIHpp2C\r\n" + "Zp7mIoLrySay2YYBu7SiNwL95X6He2kS8eefBBHjzwW/9FxGqry57i71c2cDAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQU1cFnOsKjnfR3UltZEjgp5lVou6UwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQB2oWc93fB8esci/8esixj++N22meiGDjgF\r\n" + "+rA2LUK5IOQOgcUSTGKSqF9lYfAxPjrqPjDCUPHCURv+26ad5P/BYtXtbmtxJWu+\r\n" + "cS5BhMDPPeG3oPZwXRHBJFAkY4O4AF7RIAAUW6EzDflUoDHKv83zOiPfYGcpHc9s\r\n" + "kxAInCedk7QSgXvMARjjOqdakor21DTmNIUotxo8kHv5hwRlGhBJwps6fEVi1Bt0\r\n" + "trpM/3wYxlr473WSPUFZPgP1j519kLpWOJ8z09wxay+Br29irPcBYv0GMXlHqThy\r\n" + "8y4m/HyTQeI2IMvMrQnwqPpY+rLIXyviI2vLoI+4xKE4Rn38ZZ8m\r\n" + "-----END CERTIFICATE-----\r\n"; + +const char *SPEECH_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQCq+mxcpjxFFB6jvh98dTFzANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwMTCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBAMedcDrkXufP7pxVm1FHLDNA9IjwHaMoaY8arqqZ4Gff4xyr\r\n" + "RygnavXL7g12MPAx8Q6Dd9hfBzrfWxkF0Br2wIvlvkzW01naNVSkHp+OS3hL3W6n\r\n" + "l/jYvZnVeJXjtsKYcXIf/6WtspcF5awlQ9LZJcjwaH7KoZuK+THpXCMtzD8XNVdm\r\n" + "GW/JI0C/7U/E7evXn9XDio8SYkGSM63aLO5BtLCv092+1d4GGBSQYolRq+7Pd1kR\r\n" + "EkWBPm0ywZ2Vb8GIS5DLrjelEkBnKCyy3B0yQud9dpVsiUeE7F5sY8Me96WVxQcb\r\n" + "OyYdEY/j/9UpDlOG+vA+YgOvBhkKEjiqygVpP8EZoMMijephzg43b5Qi9r5UrvYo\r\n" + "o19oR/8pf4HJNDPF0/FJwFVMW8PmCBLGstin3NE1+NeWTkGt0TzpHjgKyfaDP2tO\r\n" + "4bCk1G7pP2kDFT7SYfc8xbgCkFQ2UCEXsaH/f5YmpLn4YPiNFCeeIida7xnfTvc4\r\n" + "7IxyVccHHq1FzGygOqemrxEETKh8hvDR6eBdrBwmCHVgZrnAqnn93JtGyPLi6+cj\r\n" + "WGVGtMZHwzVvX1HvSFG771sskcEjJxiQNQDQRWHEh3NxvNb7kFlAXnVdRkkvhjpR\r\n" + "GchFhTAzqmwltdWhWDEyCMKC2x/mSZvZtlZGY+g37Y72qHzidwtyW7rBetZJAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQUDyBd16FXlduSzyvQx8J3BM5ygHYwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQAlFvNh7QgXVLAZSsNR2XRmIn9iS8OHFCBA\r\n" + "WxKJoi8YYQafpMTkMqeuzoL3HWb1pYEipsDkhiMnrpfeYZEA7Lz7yqEEtfgHcEBs\r\n" + "K9KcStQGGZRfmWU07hPXHnFz+5gTXqzCE2PBMlRgVUYJiA25mJPXfB00gDvGhtYa\r\n" + "+mENwM9Bq1B9YYLyLjRtUz8cyGsdyTIG/bBM/Q9jcV8JGqMU/UjAdh1pFyTnnHEl\r\n" + "Y59Npi7F87ZqYYJEHJM2LGD+le8VsHjgeWX2CJQko7klXvcizuZvUEDTjHaQcs2J\r\n" + "+kPgfyMIOY1DMJ21NxOJ2xPRC/wAh/hzSBRVtoAnyuxtkZ4VjIOh\r\n" + "-----END CERTIFICATE-----\r\n"; diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/flash_stream.h b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/flash_stream.h new file mode 100644 index 0000000..b841f1d --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/flash_stream.h @@ -0,0 +1,69 @@ +#pragma once + +#include +#include +#include + +#include "config.h" + +class FlashStream : public Stream +{ +public: + FlashStream() + { + _pos = 0; + _flash_address = 0; + _flash = sfud_get_device_table() + 0; + + populateBuffer(); + } + + virtual size_t write(uint8_t val) + { + return 0; + } + + virtual int available() + { + int remaining = BUFFER_SIZE - ((_flash_address - HTTP_TCP_BUFFER_SIZE) + _pos); + int bytes_available = min(HTTP_TCP_BUFFER_SIZE, remaining); + + if (bytes_available == 0) + { + bytes_available = -1; + } + + return bytes_available; + } + + virtual int read() + { + int retVal = _buffer[_pos++]; + + if (_pos == HTTP_TCP_BUFFER_SIZE) + { + populateBuffer(); + } + + return retVal; + } + + virtual int peek() + { + return _buffer[_pos]; + } + +private: + void populateBuffer() + { + sfud_read(_flash, _flash_address, HTTP_TCP_BUFFER_SIZE, _buffer); + _flash_address += HTTP_TCP_BUFFER_SIZE; + _pos = 0; + } + + size_t _pos; + size_t _flash_address; + const sfud_flash *_flash; + + byte _buffer[HTTP_TCP_BUFFER_SIZE]; +}; diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/flash_writer.h b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/flash_writer.h new file mode 100644 index 0000000..87fdff2 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/flash_writer.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include + +class FlashWriter +{ +public: + void init() + { + _flash = sfud_get_device_table() + 0; + _sfudBufferSize = _flash->chip.erase_gran; + _sfudBuffer = new byte[_sfudBufferSize]; + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void reset() + { + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void writeSfudBuffer(byte b) + { + _sfudBuffer[_sfudBufferPos++] = b; + if (_sfudBufferPos == _sfudBufferSize) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void flushSfudBuffer() + { + if (_sfudBufferPos > 0) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void writeSfudBuffer(byte *b, size_t len) + { + for (size_t i = 0; i < len; ++i) + { + writeSfudBuffer(b[i]); + } + } + +private: + byte *_sfudBuffer; + size_t _sfudBufferSize; + size_t _sfudBufferPos; + size_t _sfudBufferWritePos; + + const sfud_flash *_flash; +}; \ No newline at end of file diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/main.cpp b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/main.cpp new file mode 100644 index 0000000..37924a6 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/main.cpp @@ -0,0 +1,69 @@ +#include +#include +#include +#include + +#include "config.h" +#include "mic.h" +#include "speech_to_text.h" + +void connectWiFi() +{ + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); +} + +void setup() +{ + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + + connectWiFi(); + + while (!(sfud_init() == SFUD_SUCCESS)) + ; + + sfud_qspi_fast_read_enable(sfud_get_device(SFUD_W25Q32_DEVICE_INDEX), 2); + + pinMode(WIO_KEY_C, INPUT_PULLUP); + + mic.init(); + + speechToText.init(); + + Serial.println("Ready."); +} + +void processAudio() +{ + String text = speechToText.convertSpeechToText(); + Serial.println(text); +} + +void loop() +{ + if (digitalRead(WIO_KEY_C) == LOW && !mic.isRecording()) + { + Serial.println("Starting recording..."); + mic.startRecording(); + } + + if (!mic.isRecording() && mic.isRecordingReady()) + { + Serial.println("Finished recording"); + + processAudio(); + + mic.reset(); + } +} \ No newline at end of file diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/mic.h b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/mic.h new file mode 100644 index 0000000..5f0815d --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/mic.h @@ -0,0 +1,242 @@ +#pragma once + +#include + +#include "config.h" +#include "flash_writer.h" + +class Mic +{ +public: + Mic() + { + _isRecording = false; + _isRecordingReady = false; + } + + void startRecording() + { + _isRecording = true; + _isRecordingReady = false; + } + + bool isRecording() + { + return _isRecording; + } + + bool isRecordingReady() + { + return _isRecordingReady; + } + + void init() + { + analogReference(AR_INTERNAL2V23); + + _writer.init(); + + initBufferHeader(); + configureDmaAdc(); + } + + void reset() + { + _isRecordingReady = false; + _isRecording = false; + + _writer.reset(); + + initBufferHeader(); + } + + void dmaHandler() + { + static uint8_t count = 0; + + if (DMAC->Channel[1].CHINTFLAG.bit.SUSP) + { + DMAC->Channel[1].CHCTRLB.reg = DMAC_CHCTRLB_CMD_RESUME; + DMAC->Channel[1].CHINTFLAG.bit.SUSP = 1; + + if (count) + { + audioCallback(_adc_buf_0, ADC_BUF_LEN); + } + else + { + audioCallback(_adc_buf_1, ADC_BUF_LEN); + } + + count = (count + 1) % 2; + } + } + +private: + volatile bool _isRecording; + volatile bool _isRecordingReady; + FlashWriter _writer; + +typedef struct + { + uint16_t btctrl; + uint16_t btcnt; + uint32_t srcaddr; + uint32_t dstaddr; + uint32_t descaddr; + } dmacdescriptor; + + // Globals - DMA and ADC + volatile dmacdescriptor _wrb[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor_section[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor __attribute__((aligned(16))); + + void configureDmaAdc() + { + // Configure DMA to sample from ADC at a regular interval (triggered by timer/counter) + DMAC->BASEADDR.reg = (uint32_t)_descriptor_section; // Specify the location of the descriptors + DMAC->WRBADDR.reg = (uint32_t)_wrb; // Specify the location of the write back descriptors + DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf); // Enable the DMAC peripheral + DMAC->Channel[1].CHCTRLA.reg = DMAC_CHCTRLA_TRIGSRC(TC5_DMAC_ID_OVF) | // Set DMAC to trigger on TC5 timer overflow + DMAC_CHCTRLA_TRIGACT_BURST; // DMAC burst transfer + + _descriptor.descaddr = (uint32_t)&_descriptor_section[1]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_0 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_0 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[0], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + _descriptor.descaddr = (uint32_t)&_descriptor_section[0]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_1 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_1 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[1], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + // Configure NVIC + NVIC_SetPriority(DMAC_1_IRQn, 0); // Set the Nested Vector Interrupt Controller (NVIC) priority for DMAC1 to 0 (highest) + NVIC_EnableIRQ(DMAC_1_IRQn); // Connect DMAC1 to Nested Vector Interrupt Controller (NVIC) + + // Activate the suspend (SUSP) interrupt on DMAC channel 1 + DMAC->Channel[1].CHINTENSET.reg = DMAC_CHINTENSET_SUSP; + + // Configure ADC + ADC1->INPUTCTRL.bit.MUXPOS = ADC_INPUTCTRL_MUXPOS_AIN12_Val; // Set the analog input to ADC0/AIN2 (PB08 - A4 on Metro M4) + while (ADC1->SYNCBUSY.bit.INPUTCTRL) + ; // Wait for synchronization + ADC1->SAMPCTRL.bit.SAMPLEN = 0x00; // Set max Sampling Time Length to half divided ADC clock pulse (2.66us) + while (ADC1->SYNCBUSY.bit.SAMPCTRL) + ; // Wait for synchronization + ADC1->CTRLA.reg = ADC_CTRLA_PRESCALER_DIV128; // Divide Clock ADC GCLK by 128 (48MHz/128 = 375kHz) + ADC1->CTRLB.reg = ADC_CTRLB_RESSEL_12BIT | // Set ADC resolution to 12 bits + ADC_CTRLB_FREERUN; // Set ADC to free run mode + while (ADC1->SYNCBUSY.bit.CTRLB) + ; // Wait for synchronization + ADC1->CTRLA.bit.ENABLE = 1; // Enable the ADC + while (ADC1->SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + ADC1->SWTRIG.bit.START = 1; // Initiate a software trigger to start an ADC conversion + while (ADC1->SYNCBUSY.bit.SWTRIG) + ; // Wait for synchronization + + // Enable DMA channel 1 + DMAC->Channel[1].CHCTRLA.bit.ENABLE = 1; + + // Configure Timer/Counter 5 + GCLK->PCHCTRL[TC5_GCLK_ID].reg = GCLK_PCHCTRL_CHEN | // Enable perhipheral channel for TC5 + GCLK_PCHCTRL_GEN_GCLK1; // Connect generic clock 0 at 48MHz + + TC5->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; // Set TC5 to Match Frequency (MFRQ) mode + TC5->COUNT16.CC[0].reg = 3000 - 1; // Set the trigger to 16 kHz: (4Mhz / 16000) - 1 + while (TC5->COUNT16.SYNCBUSY.bit.CC0) + ; // Wait for synchronization + + // Start Timer/Counter 5 + TC5->COUNT16.CTRLA.bit.ENABLE = 1; // Enable the TC5 timer + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + } + + uint16_t _adc_buf_0[ADC_BUF_LEN]; + uint16_t _adc_buf_1[ADC_BUF_LEN]; + + // WAV files have a header. This struct defines that header + struct wavFileHeader + { + char riff[4]; /* "RIFF" */ + long flength; /* file length in bytes */ + char wave[4]; /* "WAVE" */ + char fmt[4]; /* "fmt " */ + long chunk_size; /* size of FMT chunk in bytes (usually 16) */ + short format_tag; /* 1=PCM, 257=Mu-Law, 258=A-Law, 259=ADPCM */ + short num_chans; /* 1=mono, 2=stereo */ + long srate; /* Sampling rate in samples per second */ + long bytes_per_sec; /* bytes per second = srate*bytes_per_samp */ + short bytes_per_samp; /* 2=16-bit mono, 4=16-bit stereo */ + short bits_per_samp; /* Number of bits per sample */ + char data[4]; /* "data" */ + long dlength; /* data length in bytes (filelength - 44) */ + }; + + void initBufferHeader() + { + wavFileHeader wavh; + + strncpy(wavh.riff, "RIFF", 4); + strncpy(wavh.wave, "WAVE", 4); + strncpy(wavh.fmt, "fmt ", 4); + strncpy(wavh.data, "data", 4); + + wavh.chunk_size = 16; + wavh.format_tag = 1; // PCM + wavh.num_chans = 1; // mono + wavh.srate = RATE; + wavh.bytes_per_sec = (RATE * 1 * 16 * 1) / 8; + wavh.bytes_per_samp = 2; + wavh.bits_per_samp = 16; + wavh.dlength = RATE * 2 * 1 * 16 / 2; + wavh.flength = wavh.dlength + 44; + + _writer.writeSfudBuffer((byte *)&wavh, 44); + } + + void audioCallback(uint16_t *buf, uint32_t buf_len) + { + static uint32_t idx = 44; + + if (_isRecording) + { + for (uint32_t i = 0; i < buf_len; i++) + { + int16_t audio_value = ((int16_t)buf[i] - 2048) * 16; + + _writer.writeSfudBuffer(audio_value & 0xFF); + _writer.writeSfudBuffer((audio_value >> 8) & 0xFF); + } + + idx += buf_len; + + if (idx >= BUFFER_SIZE) + { + _writer.flushSfudBuffer(); + idx = 44; + _isRecording = false; + _isRecordingReady = true; + } + } + } +}; + +Mic mic; + +void DMAC_1_Handler() +{ + mic.dmaHandler(); +} diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/speech_to_text.h b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/speech_to_text.h new file mode 100644 index 0000000..a7ce075 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/speech_to_text.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include +#include +#include + +#include "config.h" +#include "flash_stream.h" + +class SpeechToText +{ +public: + void init() + { + _token_client.setCACert(TOKEN_CERTIFICATE); + _speech_client.setCACert(SPEECH_CERTIFICATE); + _access_token = getAccessToken(); + } + + String convertSpeechToText() + { + char url[128]; + sprintf(url, SPEECH_URL, SPEECH_LOCATION, LANGUAGE); + + HTTPClient httpClient; + httpClient.begin(_speech_client, url); + + httpClient.addHeader("Authorization", String("Bearer ") + _access_token); + httpClient.addHeader("Content-Type", String("audio/wav; codecs=audio/pcm; samplerate=") + String(RATE)); + httpClient.addHeader("Accept", "application/json;text/xml"); + + Serial.println("Sending speech..."); + + FlashStream stream; + int httpResponseCode = httpClient.sendRequest("POST", &stream, BUFFER_SIZE); + + Serial.println("Speech sent!"); + + String text = ""; + + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + text = obj["DisplayText"].as(); + } + else if (httpResponseCode == 401) + { + Serial.println("Access token expired, trying again with a new token"); + _access_token = getAccessToken(); + return convertSpeechToText(); + } + else + { + Serial.print("Failed to convert text to speech - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + + return text; + } + +private: + String getAccessToken() + { + char url[128]; + sprintf(url, TOKEN_URL, SPEECH_LOCATION); + + HTTPClient httpClient; + httpClient.begin(_token_client, url); + + httpClient.addHeader("Ocp-Apim-Subscription-Key", SPEECH_API_KEY); + int httpResultCode = httpClient.POST("{}"); + + if (httpResultCode != 200) + { + Serial.println("Error getting access token, trying again..."); + delay(10000); + return getAccessToken(); + } + + Serial.println("Got access token."); + String result = httpClient.getString(); + + httpClient.end(); + + return result; + } + + WiFiClientSecure _token_client; + WiFiClientSecure _speech_client; + String _access_token; +}; + +SpeechToText speechToText; diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/test/README b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/test/README new file mode 100644 index 0000000..b94d089 --- /dev/null +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/6-consumer/lessons/1-speech-recognition/pi-speech-to-text.md b/6-consumer/lessons/1-speech-recognition/pi-speech-to-text.md index 5e9eac9..1f18f11 100644 --- a/6-consumer/lessons/1-speech-recognition/pi-speech-to-text.md +++ b/6-consumer/lessons/1-speech-recognition/pi-speech-to-text.md @@ -12,11 +12,10 @@ The audio can be sent to the speech service using the REST API. To use the speec 1. Remove the `play_audio` function. This is no longer needed as you don't want a smart timer to repeat back to you what you said. -1. Add the following imports to the top of the `app.py` file: +1. Add the following import to the top of the `app.py` file: ```python import requests - import json ``` 1. Add the following code above the `while True` loop to declare some settings for the speech service: @@ -74,7 +73,7 @@ The audio can be sent to the speech service using the REST API. To use the speec ```python response = requests.post(url, headers=headers, params=params, data=buffer) - response_json = json.loads(response.text) + response_json = response.json() if response_json['RecognitionStatus'] == 'Success': return response_json['DisplayText'] @@ -84,11 +83,18 @@ The audio can be sent to the speech service using the REST API. To use the speec This calls the URL and decodes the JSON value that comes in the response. The `RecognitionStatus` value in the response indicates if the call was able to extract speech into text successfully, and if this is `Success` then the text is returned from the function, otherwise an empty string is returned. -1. Finally replace the call to `play_audio` in the `while True` loop with a call to the `convert_speech_to_text` function, as well as printing the text to the console: +1. Above the `while True:` loop, define a function to process the text returned from the speech to text service. This function will just print the text to the console for now. + + ```python + def process_text(text): + print(text) + ``` + +1. Finally replace the call to `play_audio` in the `while True` loop with a call to the `convert_speech_to_text` function, passing the text to the `process_text` function: ```python text = convert_speech_to_text(buffer) - print(text) + process_text(text) ``` 1. Run the code. Press the button and speak into the microphone. Release the button when you are done, and the audio will be converted to text and printed to the console. diff --git a/6-consumer/lessons/1-speech-recognition/virtual-device-speech-to-text.md b/6-consumer/lessons/1-speech-recognition/virtual-device-speech-to-text.md index 8ec5b8a..5aaf102 100644 --- a/6-consumer/lessons/1-speech-recognition/virtual-device-speech-to-text.md +++ b/6-consumer/lessons/1-speech-recognition/virtual-device-speech-to-text.md @@ -32,6 +32,7 @@ On Windows, Linux, and macOS, the speech services Python SDK can be used to list 1. Add the following imports to the `app,py` file: ```python + import requests import time from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer ``` @@ -62,11 +63,14 @@ On Windows, Linux, and macOS, the speech services Python SDK can be used to list recognizer = SpeechRecognizer(speech_config=recognizer_config) ``` -1. The speech recognizer runs on a background thread, listening for audio and converting any speech in it to text. You can get the text using a callback function - a function you define and pass to the recognizer. Every time speech is detected, the callback is called. Add the following code to define a callback that prints the text to the console, and pass this callback to the recognizer: +1. The speech recognizer runs on a background thread, listening for audio and converting any speech in it to text. You can get the text using a callback function - a function you define and pass to the recognizer. Every time speech is detected, the callback is called. Add the following code to define a callback, and pass this callback to the recognizer, as well as defining a function to process the text, writing it to the consoled: ```python + def process_text(text): + print(text) + def recognized(args): - print(args.result.text) + process_text(args.result.text) recognizer.recognized.connect(recognized) ``` diff --git a/6-consumer/lessons/1-speech-recognition/wio-terminal-audio.md b/6-consumer/lessons/1-speech-recognition/wio-terminal-audio.md index 9c643d6..aca2922 100644 --- a/6-consumer/lessons/1-speech-recognition/wio-terminal-audio.md +++ b/6-consumer/lessons/1-speech-recognition/wio-terminal-audio.md @@ -1,3 +1,536 @@ # Capture audio - Wio Terminal -Coming soon! +In this part of the lesson, you will write code to capture audio on your Wio Terminal. Audio capture will be controlled by one of the buttons on the top of the Wio Terminal. + +## Program the device to capture audio + +You can capture audio from the microphone using C++ code. The Wio Terminal only has 192KB of RAM, not enough to capture more than a couple of seconds of audio. It also has 4MB of flash memory, so this can be used instead, saving captured audio to the flash memory. + +The built-in microphone captures an analog signal, which gets converted to a digital signal that the Wio Terminal can use. When capturing audio, the data needs to be captured at the correct time - for example to capture audio at 16KHz, the audio needs to be captured exactly 16,000 times per second, with equal intervals between each sample. Rather than use your code to do this, you can use the direct memory access controller (DMAC). This is circuitry that can capture a signal from somewhere and write to memory, without interrupting your code running on the processor. + +✅ Read more on DMA on the [direct memory access page on Wikipedia](https://wikipedia.org/wiki/Direct_memory_access). + +![Audio from the mic goes to an ADC then to the DMAC. This writes to one buffer. When this buffer is full, it is processed and the DMAC writes to a second buffer](../../../images/dmac-adc-buffers.png) + +The DMAC can capture audio from the ADC at fixed intervals, such as at 16,000 times a second for 16KHz audio. It can write this captured data to a pre-allocated memory buffer, and when this is full, make it available to your code to process. Using this memory can delay capturing audio, but you can set up multiple buffers. The DMAC writes to buffer 1, then when it's full, notifies your code to proces buffer 1, whilst the DMAC writes to buffer 2. When buffer 2 is full, it notifies your code, and goes back to writing to buffer 1. That way as long as you process each buffer in less time that it takes to fill one, you will not lose any data. + +Once each buffer has been captured, it can be written to the flash memory. Flash memory needs to be written to using defined addresses, specifying where to write and how large to write, similar to updating an array of bytes in memory. Flash memory has granularity, meaning erase and writing operations rely not only on being of a fixed size, but aligning to that size. For example, if the granularity is 4096 bytes and you request an erase at address 4200, it could erase all the data from address 4096 to 8192. This means when you write the audio data to flash memory, it has to be in chunks of the correct size. + +### Task - configure flash memory + +1. Create a brand new Wio Terminal project using PlatformIO. Call this project `smart-timer`. Add code in the `setup` function to configure the serial port. + +1. Add the following library dependencies to the `platformio.ini` file to provide access to the flash memory: + + ```ini + lib_deps = + seeed-studio/Seeed Arduino FS @ 2.0.3 + seeed-studio/Seeed Arduino SFUD @ 2.0.1 + ``` + +1. Open the `main.cpp` file and add the following include directive for the flash memory library to the top of the file: + + ```cpp + #include + #include + ``` + + > 🎓 SFUD stands for Serial Flash Universal Driver, and is a library designed to work with all flash memory chips + +1. In the `setup` function, add the following code to set up the flash storage library: + + ```cpp + while (!(sfud_init() == SFUD_SUCCESS)) + ; + + sfud_qspi_fast_read_enable(sfud_get_device(SFUD_W25Q32_DEVICE_INDEX), 2); + ``` + + This loops until the SFUD library is initialized, then turns on fast reads. The built-in flash memory can be accessed using a Queued Serial Peripheral Interface (QSPI), a type of SPI controller that allows continuous access via a queue with minimal processor usage. This makes it faster to read and write to flash memory. + +1. Create a new file in the `src` folder called `flash_writer.h`. + +1. Add the following to the top of this file: + + ```cpp + #pragma once + + #include + #include + ``` + + This includes some needed header files, including the header file for the SFUD library to interact with flash memory + +1. Define a class in this new header file called `FlashWriter`: + + ```cpp + class FlashWriter + { + public: + + private: + }; + ``` + +1. In the `private` section, add the following code: + + ```cpp + byte *_sfudBuffer; + size_t _sfudBufferSize; + size_t _sfudBufferPos; + size_t _sfudBufferWritePos; + + const sfud_flash *_flash; + ``` + + This defines some fields for the buffer to use to store data before writing it to the flash memory. There is a byte array, `_sfudBuffer`, to write data to, and when this is full, the data is written to flash memory. The `_sfudBufferPos` field stores the current location to write to in this buffer, and `_sfudBufferWritePos` stores the location in flash memory to write to. `_flash` is a pointer the flash memory to write to - some microcontrollers have multiple flash memory chips. + +1. Add the following method to the `public` section to initialize this class: + + ```cpp + void init() + { + _flash = sfud_get_device_table() + 0; + _sfudBufferSize = _flash->chip.erase_gran; + _sfudBuffer = new byte[_sfudBufferSize]; + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + ``` + + This configures the flash memory on teh Wio Terminal to write to, and sets up the buffers based off the grain size of the flash memory. This is in an `init` method, rather than a constructor as this needs to be called after the flash memory has been set up in the `setup` function. + +1. Add the following code to the `public` section: + + ```cpp + void writeSfudBuffer(byte b) + { + _sfudBuffer[_sfudBufferPos++] = b; + if (_sfudBufferPos == _sfudBufferSize) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void writeSfudBuffer(byte *b, size_t len) + { + for (size_t i = 0; i < len; ++i) + { + writeSfudBuffer(b[i]); + } + } + + void flushSfudBuffer() + { + if (_sfudBufferPos > 0) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + ``` + + This code defines methods to write bytes to the flash storage system. It works by writing to an in-memory buffer that is the right size for the flash memory, and when this is full, this is written to the flash memory, erasing any existing data at that location. There is also a `flushSfudBuffer` to write an incomplete buffer, as the data being captured won't be exact multiples of the grain size, so the end part of the data needs to be written. + + > 💁 The end part of the data will write additional unwanted data, but this is ok as only the data needed will be read. + +### Task - set up audio capture + +1. Create a new file in the `src` folder called `config.h`. + +1. Add the following to the top of this file: + + ```cpp + #pragma once + + #define RATE 16000 + #define SAMPLE_LENGTH_SECONDS 4 + #define SAMPLES RATE * SAMPLE_LENGTH_SECONDS + #define BUFFER_SIZE (SAMPLES * 2) + 44 + #define ADC_BUF_LEN 1600 + ``` + + This code sets up some constants for the audio capture. + + | Constant | Value | Description | + | --------------------- | -----: | - | + | RATE | 16000 | The sample rate for the audio. !6,000 is 16KHz | + | SAMPLE_LENGTH_SECONDS | 4 | The length of audio to capture. This is set to 4 seconds. To record longer audio, increase this. | + | SAMPLES | 64000 | The total number of audio samples that will be captured. Set to the sample rate * the number of seconds | + | BUFFER_SIZE | 128044 | The size of the audio buffer to capture. Audio will be captured as a WAV file, which is 44 bytes of header, then 128,000 bytes of audio date (each sample is 2 bytes) | + | ADC_BUF_LEN | 1600 | The size of the buffers to use to capture audio from the DMAC | + + > 💁 If you find 4 seconds is too short to request a timer, you can increase the `SAMPLE_LENGTH_SECONDS` value, and all the other values will recalculate. + +1. Create a new file in the `src` folder called `mic.h`. + +1. Add the following to the top of this file: + + ```cpp + #pragma once + + #include + + #include "config.h" + #include "flash_writer.h" + ``` + + This includes some needed header files, including the `config.h` and `FlashWriter` header files. + +1. Add the following to define a `Mic` class that can capture from the microphone: + + ```cpp + class Mic + { + public: + Mic() + { + _isRecording = false; + _isRecordingReady = false; + } + + void startRecording() + { + _isRecording = true; + _isRecordingReady = false; + } + + bool isRecording() + { + return _isRecording; + } + + bool isRecordingReady() + { + return _isRecordingReady; + } + + private: + volatile bool _isRecording; + volatile bool _isRecordingReady; + FlashWriter _writer; + }; + + Mic mic; + ``` + + This class currently only has a couple of fields to track if recording has started, and if a recording is ready to be used. When the DMAC is set up, it continuously writes to memory buffers, so the `_isRecording` flag determines if these should be processed or ignored. The `_isRecordingReady` flag will be set when the required 4 seconds of audio has been captured. The `_writer` field is used to save the audio data to flash memory. + + A global variable is then declared for an instance of the `Mic` class. + +1. Add the following code to the `private` section of the `Mic` class: + + ```cpp + typedef struct + { + uint16_t btctrl; + uint16_t btcnt; + uint32_t srcaddr; + uint32_t dstaddr; + uint32_t descaddr; + } dmacdescriptor; + + // Globals - DMA and ADC + volatile dmacdescriptor _wrb[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor_section[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor __attribute__((aligned(16))); + + void configureDmaAdc() + { + // Configure DMA to sample from ADC at a regular interval (triggered by timer/counter) + DMAC->BASEADDR.reg = (uint32_t)_descriptor_section; // Specify the location of the descriptors + DMAC->WRBADDR.reg = (uint32_t)_wrb; // Specify the location of the write back descriptors + DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf); // Enable the DMAC peripheral + DMAC->Channel[1].CHCTRLA.reg = DMAC_CHCTRLA_TRIGSRC(TC5_DMAC_ID_OVF) | // Set DMAC to trigger on TC5 timer overflow + DMAC_CHCTRLA_TRIGACT_BURST; // DMAC burst transfer + + _descriptor.descaddr = (uint32_t)&_descriptor_section[1]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_0 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_0 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[0], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + _descriptor.descaddr = (uint32_t)&_descriptor_section[0]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_1 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_1 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[1], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + // Configure NVIC + NVIC_SetPriority(DMAC_1_IRQn, 0); // Set the Nested Vector Interrupt Controller (NVIC) priority for DMAC1 to 0 (highest) + NVIC_EnableIRQ(DMAC_1_IRQn); // Connect DMAC1 to Nested Vector Interrupt Controller (NVIC) + + // Activate the suspend (SUSP) interrupt on DMAC channel 1 + DMAC->Channel[1].CHINTENSET.reg = DMAC_CHINTENSET_SUSP; + + // Configure ADC + ADC1->INPUTCTRL.bit.MUXPOS = ADC_INPUTCTRL_MUXPOS_AIN12_Val; // Set the analog input to ADC0/AIN2 (PB08 - A4 on Metro M4) + while (ADC1->SYNCBUSY.bit.INPUTCTRL) + ; // Wait for synchronization + ADC1->SAMPCTRL.bit.SAMPLEN = 0x00; // Set max Sampling Time Length to half divided ADC clock pulse (2.66us) + while (ADC1->SYNCBUSY.bit.SAMPCTRL) + ; // Wait for synchronization + ADC1->CTRLA.reg = ADC_CTRLA_PRESCALER_DIV128; // Divide Clock ADC GCLK by 128 (48MHz/128 = 375kHz) + ADC1->CTRLB.reg = ADC_CTRLB_RESSEL_12BIT | // Set ADC resolution to 12 bits + ADC_CTRLB_FREERUN; // Set ADC to free run mode + while (ADC1->SYNCBUSY.bit.CTRLB) + ; // Wait for synchronization + ADC1->CTRLA.bit.ENABLE = 1; // Enable the ADC + while (ADC1->SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + ADC1->SWTRIG.bit.START = 1; // Initiate a software trigger to start an ADC conversion + while (ADC1->SYNCBUSY.bit.SWTRIG) + ; // Wait for synchronization + + // Enable DMA channel 1 + DMAC->Channel[1].CHCTRLA.bit.ENABLE = 1; + + // Configure Timer/Counter 5 + GCLK->PCHCTRL[TC5_GCLK_ID].reg = GCLK_PCHCTRL_CHEN | // Enable perhipheral channel for TC5 + GCLK_PCHCTRL_GEN_GCLK1; // Connect generic clock 0 at 48MHz + + TC5->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; // Set TC5 to Match Frequency (MFRQ) mode + TC5->COUNT16.CC[0].reg = 3000 - 1; // Set the trigger to 16 kHz: (4Mhz / 16000) - 1 + while (TC5->COUNT16.SYNCBUSY.bit.CC0) + ; // Wait for synchronization + + // Start Timer/Counter 5 + TC5->COUNT16.CTRLA.bit.ENABLE = 1; // Enable the TC5 timer + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + } + + uint16_t _adc_buf_0[ADC_BUF_LEN]; + uint16_t _adc_buf_1[ADC_BUF_LEN]; + ``` + + This code defines a `configureDmaAdc` method that configures the DMAC, connecting it to the ADC and setting it to populate two different alternating buffers, `_adc_buf_0` and `_adc_buf_0`. + + > 💁 One of the downsides of microcontroller development is the complexity of the code needed to interact with hardware, as your code runs at a very low level interacting with hardware directly. This code is more complex than what you would write for a single-board computer or desktop computer as there is no operating system to help. There are some libraries available that can simplify this, but there is still a lot of complexity. + +1. Below this, add the following code: + + ```cpp + // WAV files have a header. This struct defines that header + struct wavFileHeader + { + char riff[4]; /* "RIFF" */ + long flength; /* file length in bytes */ + char wave[4]; /* "WAVE" */ + char fmt[4]; /* "fmt " */ + long chunk_size; /* size of FMT chunk in bytes (usually 16) */ + short format_tag; /* 1=PCM, 257=Mu-Law, 258=A-Law, 259=ADPCM */ + short num_chans; /* 1=mono, 2=stereo */ + long srate; /* Sampling rate in samples per second */ + long bytes_per_sec; /* bytes per second = srate*bytes_per_samp */ + short bytes_per_samp; /* 2=16-bit mono, 4=16-bit stereo */ + short bits_per_samp; /* Number of bits per sample */ + char data[4]; /* "data" */ + long dlength; /* data length in bytes (filelength - 44) */ + }; + + void initBufferHeader() + { + wavFileHeader wavh; + + strncpy(wavh.riff, "RIFF", 4); + strncpy(wavh.wave, "WAVE", 4); + strncpy(wavh.fmt, "fmt ", 4); + strncpy(wavh.data, "data", 4); + + wavh.chunk_size = 16; + wavh.format_tag = 1; // PCM + wavh.num_chans = 1; // mono + wavh.srate = RATE; + wavh.bytes_per_sec = (RATE * 1 * 16 * 1) / 8; + wavh.bytes_per_samp = 2; + wavh.bits_per_samp = 16; + wavh.dlength = RATE * 2 * 1 * 16 / 2; + wavh.flength = wavh.dlength + 44; + + _writer.writeSfudBuffer((byte *)&wavh, 44); + } + ``` + + This code defines the WAV header as a struct that takes up 44 bytes of memory. It writes details to it about the audio file rate, size, and number of channels. This header is then written to the flash memory + +1. Below this code, add the following to declare a method to be called when the audio buffers are ready to process: + + ```cpp + void audioCallback(uint16_t *buf, uint32_t buf_len) + { + static uint32_t idx = 44; + + if (_isRecording) + { + for (uint32_t i = 0; i < buf_len; i++) + { + int16_t audio_value = ((int16_t)buf[i] - 2048) * 16; + + _writer.writeSfudBuffer(audio_value & 0xFF); + _writer.writeSfudBuffer((audio_value >> 8) & 0xFF); + } + + idx += buf_len; + + if (idx >= BUFFER_SIZE) + { + _writer.flushSfudBuffer(); + idx = 44; + _isRecording = false; + _isRecordingReady = true; + } + } + } + ``` + + The audio buffers are arrays of 16-bit integers containing the audio from the ADC. The ADC returns 12-bit unsigned values (0-1023), so these need to be converted to 16-bit signed values, and then converted into 2 bytes to be stored as raw binary data. + + These bytes are written to the flash memory buffers. The write starts at index 44 - this is the offset from the 44 bytes written as the WAV file header. Once all the bytes needed for the required audio length have been captured, the remaing data is written to the flash memory. + +1. In the `public` section of the `Mic` class, add the following code: + + ```cpp + void dmaHandler() + { + static uint8_t count = 0; + + if (DMAC->Channel[1].CHINTFLAG.bit.SUSP) + { + DMAC->Channel[1].CHCTRLB.reg = DMAC_CHCTRLB_CMD_RESUME; + DMAC->Channel[1].CHINTFLAG.bit.SUSP = 1; + + if (count) + { + audioCallback(_adc_buf_0, ADC_BUF_LEN); + } + else + { + audioCallback(_adc_buf_1, ADC_BUF_LEN); + } + + count = (count + 1) % 2; + } + } + ``` + + This code will be called by the DMAC to tell your code to process the buffers. It checks that there is data to process, and calls the `audioCallback` method with the relevant buffer. + +1. Outside the class, after the `Mic mic;` declaration, add the following code: + + ```cpp + void DMAC_1_Handler() + { + mic.dmaHandler(); + } + ``` + + The `DMAC_1_Handler` will be called by the DMAC when there the buffers are ready to process. This function is found by name, so just needs to exist to be called. + +1. Add the following two methods to the `public` section of the `Mic` class: + + ```cpp + void init() + { + analogReference(AR_INTERNAL2V23); + + _writer.init(); + + initBufferHeader(); + configureDmaAdc(); + } + + void reset() + { + _isRecordingReady = false; + _isRecording = false; + + _writer.reset(); + + initBufferHeader(); + } + ``` + + The `init` method contain code to initialize the `Mic` class. This method sets the correct voltage for the Mic pin, sets up the flash memory writer, writes the WAV file header, and configures the DMAC. The `reset` method resets the flash memory and re-writes the header after the audio has been captured and used. + +### Task - capture audio + +1. In the `main.cpp` file, and an include directive for the `mic.h` header file: + + ```cpp + #include "mic.h" + ``` + +1. In the `setup` function, initialize the C button. Audio capture will start when this button is pressed, and continue for 4 seconds: + + ```cpp + pinMode(WIO_KEY_C, INPUT_PULLUP); + ``` + +1. Below this, initialize the microphone, then print to the console that audio is ready to be captured: + + ```cpp + mic.init(); + + Serial.println("Ready."); + ``` + +1. Above the `loop` function, define a function to process the captured audio. For now this does nothing, but later in this lesson it will send the speech to be converted to text: + + ```cpp + void processAudio() + { + + } + ``` + +1. Add the following to the `loop` function: + + ```cpp + void loop() + { + if (digitalRead(WIO_KEY_C) == LOW && !mic.isRecording()) + { + Serial.println("Starting recording..."); + mic.startRecording(); + } + + if (!mic.isRecording() && mic.isRecordingReady()) + { + Serial.println("Finished recording"); + + processAudio(); + + mic.reset(); + } + } + ``` + + This code checks hte C button, and if this is pressed and recording hasn't started, then the `_isRecording` field of the `Mic` class is set to true. This will cause the `audioCallback` method of the `Mic` class to store audio until 4 seconds has been captured. Once 4 seconds of audio has been captured, the `_isRecording` field is set to false, and the `_isRecordingReady` field is set to true. This is then checked in the `loop` function, and when true the `processAudio` function is called, then the mic class is reset. + +1. Build this code, upload it to your Wio Terminal and test it out through the serial monitor. Press the C button (the one on the left-hand side, closest to the power switch), and speak. 4 seconds of audio will be captured. + + ```output + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Ready. + Starting recording... + Finished recording + ``` + +> 💁 You can find this code in the [code-record/wio-terminal](code-record/wio-terminal) folder. + +😀 Your audio recording program was a success! diff --git a/6-consumer/lessons/1-speech-recognition/wio-terminal-microphone.md b/6-consumer/lessons/1-speech-recognition/wio-terminal-microphone.md index 1e9bb93..4212f41 100644 --- a/6-consumer/lessons/1-speech-recognition/wio-terminal-microphone.md +++ b/6-consumer/lessons/1-speech-recognition/wio-terminal-microphone.md @@ -1,3 +1,11 @@ # Configure your microphone and speakers - Wio Terminal -Coming soon! +In this part of the lesson, you will add and speakers to your Wio Terminal. The Wio Terminal already has a microphone built-in, and this can be used to capture speech. + +## Hardware + +Coming soon + +### Task - connect speakers + +Coming soon diff --git a/6-consumer/lessons/1-speech-recognition/wio-terminal-speech-to-text.md b/6-consumer/lessons/1-speech-recognition/wio-terminal-speech-to-text.md index e89f1ca..a1e2cdd 100644 --- a/6-consumer/lessons/1-speech-recognition/wio-terminal-speech-to-text.md +++ b/6-consumer/lessons/1-speech-recognition/wio-terminal-speech-to-text.md @@ -1,3 +1,521 @@ # Speech to text - Wio Terminal -Coming soon! +In this part of the lesson, you will write code to convert speech in the captured audio to text using the speech service. + +## Send the audio to the speech service + +The audio can be sent to the speech service using the REST API. To use the speech service, first you need to request an access token, then use that token to access the REST API. These access tokens expire after 10 minutes, so your code should request them on a regular basis to ensure they are always up to date. + +### Task - get an access token + +1. Open the `smart-timer` project if it's not already open. + +1. Add the following library dependencies to the `platformio.ini` file to access WiFi and handle JSON: + + ```ini + seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 + seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 + seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 + seeed-studio/Seeed Arduino RTC @ 2.0.0 + bblanchon/ArduinoJson @ 6.17.3 + ``` + +1. Add the following code to the `config.h` header file: + + ```cpp + const char *SSID = ""; + const char *PASSWORD = ""; + + const char *SPEECH_API_KEY = ""; + const char *SPEECH_LOCATION = ""; + const char *LANGUAGE = ""; + + const char *TOKEN_URL = "https://%s.api.cognitive.microsoft.com/sts/v1.0/issuetoken"; + ``` + + Replace `` and `` with the relevant values for your WiFi. + + Replace `` with the API key for your speech service resource. Replace `` with the location you used when you created the speech service resource. + + Replace `` with the locale name for language you will be speaking in, for example `en-GB` for English, or `zn-HK` for Cantonese. You can find a list of the supported languages and their locale names in the [Language and voice support documentation on Microsoft docs](https://docs.microsoft.com/azure/cognitive-services/speech-service/language-support?WT.mc_id=academic-17441-jabenn#speech-to-text). + + The `TOKEN_URL` constant is the URL of the token issuer without the location. This will be combined with the location later to get the full URL. + +1. Just like connecting to Custom Vision, you will need to use an HTTPS connection to connect to the token issuing service. To the end of `config.h`, add the following code: + + ```cpp + const char *TOKEN_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQAueRcfuAIek/4tmDg0xQwDANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwNjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBALVGARl56bx3KBUSGuPc4H5uoNFkFH4e7pvTCxRi4j/+z+Xb\r\n" + "wjEz+5CipDOqjx9/jWjskL5dk7PaQkzItidsAAnDCW1leZBOIi68Lff1bjTeZgMY\r\n" + "iwdRd3Y39b/lcGpiuP2d23W95YHkMMT8IlWosYIX0f4kYb62rphyfnAjYb/4Od99\r\n" + "ThnhlAxGtfvSbXcBVIKCYfZgqRvV+5lReUnd1aNjRYVzPOoifgSx2fRyy1+pO1Uz\r\n" + "aMMNnIOE71bVYW0A1hr19w7kOb0KkJXoALTDDj1ukUEDqQuBfBxReL5mXiu1O7WG\r\n" + "0vltg0VZ/SZzctBsdBlx1BkmWYBW261KZgBivrql5ELTKKd8qgtHcLQA5fl6JB0Q\r\n" + "gs5XDaWehN86Gps5JW8ArjGtjcWAIP+X8CQaWfaCnuRm6Bk/03PQWhgdi84qwA0s\r\n" + "sRfFJwHUPTNSnE8EiGVk2frt0u8PG1pwSQsFuNJfcYIHEv1vOzP7uEOuDydsmCjh\r\n" + "lxuoK2n5/2aVR3BMTu+p4+gl8alXoBycyLmj3J/PUgqD8SL5fTCUegGsdia/Sa60\r\n" + "N2oV7vQ17wjMN+LXa2rjj/b4ZlZgXVojDmAjDwIRdDUujQu0RVsJqFLMzSIHpp2C\r\n" + "Zp7mIoLrySay2YYBu7SiNwL95X6He2kS8eefBBHjzwW/9FxGqry57i71c2cDAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQU1cFnOsKjnfR3UltZEjgp5lVou6UwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQB2oWc93fB8esci/8esixj++N22meiGDjgF\r\n" + "+rA2LUK5IOQOgcUSTGKSqF9lYfAxPjrqPjDCUPHCURv+26ad5P/BYtXtbmtxJWu+\r\n" + "cS5BhMDPPeG3oPZwXRHBJFAkY4O4AF7RIAAUW6EzDflUoDHKv83zOiPfYGcpHc9s\r\n" + "kxAInCedk7QSgXvMARjjOqdakor21DTmNIUotxo8kHv5hwRlGhBJwps6fEVi1Bt0\r\n" + "trpM/3wYxlr473WSPUFZPgP1j519kLpWOJ8z09wxay+Br29irPcBYv0GMXlHqThy\r\n" + "8y4m/HyTQeI2IMvMrQnwqPpY+rLIXyviI2vLoI+4xKE4Rn38ZZ8m\r\n" + "-----END CERTIFICATE-----\r\n"; + ``` + + This is the same certificate you used when connecting to Custom Vision. + +1. Add an include for the WiFi header file and the config header file to the top of the `main.cpp` file: + + ```cpp + #include + + #include "config.h" + ``` + +1. Add code to connect to WiFi in `main.cpp` above the `setup` function: + + ```cpp + void connectWiFi() + { + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); + } + ``` + +1. Call this function from the `setup` function after the serial connection has been established: + + ```cpp + connectWiFi(); + ``` + +1. Create a new header file in the `src` folder called `speech_to_text.h`. In this header file, add the following code: + + ```cpp + #pragma once + + #include + #include + #include + #include + + #include "config.h" + #include "mic.h" + + class SpeechToText + { + public: + + private: + + }; + + SpeechToText speechToText; + ``` + + This includes some necessary header files for an HTTP connection, configuration and the `mic.h` header file, and defines a class called `SpeechToText`, before declaring an instance of that class that can be used later. + +1. Add the following 2 fields to the `private` section of this class: + + ```cpp + WiFiClientSecure _token_client; + String _access_token; + ``` + + The `_token_client` is a WiFi Client that uses HTTPS and will be used to get the access token. This token will then be stored in `_access_token`. + +1. Add the following method to the `private` section: + + ```cpp + String getAccessToken() + { + char url[128]; + sprintf(url, TOKEN_URL, SPEECH_LOCATION); + + HTTPClient httpClient; + httpClient.begin(_token_client, url); + + httpClient.addHeader("Ocp-Apim-Subscription-Key", SPEECH_API_KEY); + int httpResultCode = httpClient.POST("{}"); + + if (httpResultCode != 200) + { + Serial.println("Error getting access token, trying again..."); + delay(10000); + return getAccessToken(); + } + + Serial.println("Got access token."); + String result = httpClient.getString(); + + httpClient.end(); + + return result; + } + ``` + + This code builds the URL for the token issuer API using the location of the speech resource. It then creates an `HTTPClient` to make the web request, setting it up to use the WiFi client configured with the token endpoints certificate. It sets the API key as a header for the call. It then makes a POST request to get the certificate, retrying if it gets any errors. Finally the access token is returned. + +1. To the `public` section, add an `init` method that sets up the token client: + + ```cpp + void init() + { + _token_client.setCACert(TOKEN_CERTIFICATE); + _access_token = getAccessToken(); + } + ``` + + This sets the certificate on the WiFi client, then gets the access token. + +1. In `main.cpp`, add this new header file to the include directives: + + ```cpp + #include "speech_to_text.h" + ``` + +1. Initialize the `SpeechToText` class at the end of the `setup` function, after the `mic.init` call but before `Ready` is written to the serial monitor: + + ```cpp + speechToText.init(); + ``` + +### Task - read audio from flash memory + +1. In an earlier part of this lesson, the audio was recorded to the flash memory. This audio will need to be sent to the Speech Services REST API, so it needs to be read from the flash memory. It can't be loaded into an in-memory buffer as it would be too large. The `HTTPClient` class that makes REST calls can stream data using an Arduino Stream - a class that can load data in small chunks, sending the chunks one at a time as part of the request. Every time you call `read` on a stream it returns the next block of data. An Arduino stream can be created that can read from the flash memory. Create a new file called `flash_stream.h` in the `src` folder, and add the following code to it: + + ```cpp + #pragma once + + #include + #include + #include + + #include "config.h" + + class FlashStream : public Stream + { + public: + virtual size_t write(uint8_t val) + { + } + + virtual int available() + { + } + + virtual int read() + { + } + + virtual int peek() + { + } + private: + + }; + ``` + + This declares the `FlashStream` class, deriving from the Arduino `Stream` class. This is an abstract class - derived classes have to implement a few methods before the class can be instantiated, and these methods are defined in this class. + + ✅ Read more on Arduino Streams in the [Arduino Stream documentation](https://www.arduino.cc/reference/en/language/functions/communication/stream/) + +1. Add the following fields to the `private` section: + + ```cpp + size_t _pos; + size_t _flash_address; + const sfud_flash *_flash; + + byte _buffer[HTTP_TCP_BUFFER_SIZE]; + ``` + + This defines a temporary buffer to store data read from the flash memory, along with fields to store the current position when reading from the buffer, the current address to read from the flash memory, and the flash memory device. + +1. In the `private` section, add the following method: + + ```cpp + void populateBuffer() + { + sfud_read(_flash, _flash_address, HTTP_TCP_BUFFER_SIZE, _buffer); + _flash_address += HTTP_TCP_BUFFER_SIZE; + _pos = 0; + } + ``` + + This code reads from the flash memory at the current address and stores the data in a buffer. It then increments the address, so the next call reads the next block of memory. The buffer is sized based on the largest chunk that the `HTTPClient` will send to the REST API at one time. + + > 💁 Erasing flash memory has to be done using the grain size, reading on the other hand does not. + +1. In the `public` section of this class, add a constructor: + + ```cpp + FlashStream() + { + _pos = 0; + _flash_address = 0; + _flash = sfud_get_device_table() + 0; + + populateBuffer(); + } + ``` + + This constructor sets up all the fields to start reading from the start of the flash memory block, and loads the first chunk of data into the buffer. + +1. Implement the `write` method. This stream will only read data, so this can do nothing and return 0: + + ```cpp + virtual size_t write(uint8_t val) + { + return 0; + } + ``` + +1. Implement the `peek` method. This returns the data at the current position without moving the stream along. Calling `peek` multiple times will always return the same data as long as no data is read from the stream. + + ```cpp + virtual int peek() + { + return _buffer[_pos]; + } + ``` + +1. Implement the `available` function. This returns how many bytes can be read from the stream, or -1 if the stream is complete. For this class, the maximum available will be no more than the HTTPClient's chunk size. When this stream is used in the HTTP client it calls this function to see how much data is available, then requests that much data to send to the REST API. We don't want each chunk to be more than the HTTP clients chunk size, so if more than that is available, the chunk size is returned. If less, then what is available is returned. Once all the data has been streamed, -1 is returned. + + ```cpp + virtual int available() + { + int remaining = BUFFER_SIZE - ((_flash_address - HTTP_TCP_BUFFER_SIZE) + _pos); + int bytes_available = min(HTTP_TCP_BUFFER_SIZE, remaining); + + if (bytes_available == 0) + { + bytes_available = -1; + } + + return bytes_available; + } + ``` + +1. Implement the `read` method to return the next byte from the buffer, incrementing the position. If the position exceeds the size of the buffer, it populates the buffer with the next block from the flash memory and resets the position. + + ```cpp + virtual int read() + { + int retVal = _buffer[_pos++]; + + if (_pos == HTTP_TCP_BUFFER_SIZE) + { + populateBuffer(); + } + + return retVal; + } + ``` + +1. In the `speech_to_text.h` header file, add an include directive for this new header file: + + ```cpp + #include "flash_stream.h" + ``` + +### Task - convert the speech to text + +1. The speech can be converted to text by sending the audio to the Speech Service via a REST API. This REST API has a different certificate to the token issuer, so add the following code to the `config.h` header file to define this certificate: + + ```cpp + const char *SPEECH_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQCq+mxcpjxFFB6jvh98dTFzANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwMTCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBAMedcDrkXufP7pxVm1FHLDNA9IjwHaMoaY8arqqZ4Gff4xyr\r\n" + "RygnavXL7g12MPAx8Q6Dd9hfBzrfWxkF0Br2wIvlvkzW01naNVSkHp+OS3hL3W6n\r\n" + "l/jYvZnVeJXjtsKYcXIf/6WtspcF5awlQ9LZJcjwaH7KoZuK+THpXCMtzD8XNVdm\r\n" + "GW/JI0C/7U/E7evXn9XDio8SYkGSM63aLO5BtLCv092+1d4GGBSQYolRq+7Pd1kR\r\n" + "EkWBPm0ywZ2Vb8GIS5DLrjelEkBnKCyy3B0yQud9dpVsiUeE7F5sY8Me96WVxQcb\r\n" + "OyYdEY/j/9UpDlOG+vA+YgOvBhkKEjiqygVpP8EZoMMijephzg43b5Qi9r5UrvYo\r\n" + "o19oR/8pf4HJNDPF0/FJwFVMW8PmCBLGstin3NE1+NeWTkGt0TzpHjgKyfaDP2tO\r\n" + "4bCk1G7pP2kDFT7SYfc8xbgCkFQ2UCEXsaH/f5YmpLn4YPiNFCeeIida7xnfTvc4\r\n" + "7IxyVccHHq1FzGygOqemrxEETKh8hvDR6eBdrBwmCHVgZrnAqnn93JtGyPLi6+cj\r\n" + "WGVGtMZHwzVvX1HvSFG771sskcEjJxiQNQDQRWHEh3NxvNb7kFlAXnVdRkkvhjpR\r\n" + "GchFhTAzqmwltdWhWDEyCMKC2x/mSZvZtlZGY+g37Y72qHzidwtyW7rBetZJAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQUDyBd16FXlduSzyvQx8J3BM5ygHYwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQAlFvNh7QgXVLAZSsNR2XRmIn9iS8OHFCBA\r\n" + "WxKJoi8YYQafpMTkMqeuzoL3HWb1pYEipsDkhiMnrpfeYZEA7Lz7yqEEtfgHcEBs\r\n" + "K9KcStQGGZRfmWU07hPXHnFz+5gTXqzCE2PBMlRgVUYJiA25mJPXfB00gDvGhtYa\r\n" + "+mENwM9Bq1B9YYLyLjRtUz8cyGsdyTIG/bBM/Q9jcV8JGqMU/UjAdh1pFyTnnHEl\r\n" + "Y59Npi7F87ZqYYJEHJM2LGD+le8VsHjgeWX2CJQko7klXvcizuZvUEDTjHaQcs2J\r\n" + "+kPgfyMIOY1DMJ21NxOJ2xPRC/wAh/hzSBRVtoAnyuxtkZ4VjIOh\r\n" + "-----END CERTIFICATE-----\r\n"; + ``` + +1. Add a constant to this file for the speech URL without the location. This will be combined with the location and language later to get the full URL. + + ```cpp + const char *SPEECH_URL = "https://%s.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=%s"; + ``` + +1. In the `speech_to_text.h` header file, in the `private` section of the `SpeechToText` class, define a field for a WiFi Client using the speech certificate: + + ```cpp + WiFiClientSecure _speech_client; + ``` + +1. In the `init` method, set the certificate on this WiFi Client: + + ```cpp + _speech_client.setCACert(SPEECH_CERTIFICATE); + ``` + +1. Add the following code to the `public` section of the `SpeechToText` class to define a method to convert speech to text: + + ```cpp + String convertSpeechToText() + { + + } + ``` + +1. Add the following code to this method to create an HTTP client using the WiFi client configured with the speech certificate, and using the speech URL set with the location and language: + + ```cpp + char url[128]; + sprintf(url, SPEECH_URL, SPEECH_LOCATION, LANGUAGE); + + HTTPClient httpClient; + httpClient.begin(_speech_client, url); + ``` + +1. Some headers need to be set on the connection: + + ```cpp + httpClient.addHeader("Authorization", String("Bearer ") + _access_token); + httpClient.addHeader("Content-Type", String("audio/wav; codecs=audio/pcm; samplerate=") + String(RATE)); + httpClient.addHeader("Accept", "application/json;text/xml"); + ``` + + This sets headers for the authorization using the access token, the audio format using the sample rate, and sets that the client expects the result as JSON. + +1. After this, add the following code to make the REST API call: + + ```cpp + Serial.println("Sending speech..."); + + FlashStream stream; + int httpResponseCode = httpClient.sendRequest("POST", &stream, BUFFER_SIZE); + + Serial.println("Speech sent!"); + ``` + + This creates a `FlashStream` and uses it to stream data to the REST API. + +1. Below this, add the following code: + + ```cpp + String text = ""; + + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + text = obj["DisplayText"].as(); + } + else if (httpResponseCode == 401) + { + Serial.println("Access token expired, trying again with a new token"); + _access_token = getAccessToken(); + return convertSpeechToText(); + } + else + { + Serial.print("Failed to convert text to speech - error "); + Serial.println(httpResponseCode); + } + ``` + + This code checks the response code. + + If it is 200, the code for success, then the result is retrieved, decoded from JSON, and the `DisplayText` property is set into the `text` variable. This is the property that the text version of the speech is returned in. + + If the response code is 401, then the access token has expired (these tokens only last 10 minutes). A new access token is requested, and the call is made again. + + Otherwise, an error is sent to the serial monitor, and the `text` is left blank. + +1. Add the following code to the end of this method to close the HTTP client and return the text: + + ```cpp + httpClient.end(); + + return text; + ``` + +1. In `main.cpp` call this new `convertSpeechToText` method in the `processAudio` function, then log out the speech to the serial monitor: + + ```cpp + String text = speechToText.convertSpeechToText(); + Serial.println(text); + ``` + +1. Build this code, upload it to your Wio Terminal and test it out through the serial monitor. Press the C button (the one on the left-hand side, closest to the power switch), and speak. 4 seconds of audio will be captured, then converted to text. + + ```output + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Connecting to WiFi.. + Connected! + Got access token. + Ready. + Starting recording... + Finished recording + Sending speech... + Speech sent! + {"RecognitionStatus":"Success","DisplayText":"Set a 2 minute and 27 second timer.","Offset":4700000,"Duration":35300000} + Set a 2 minute and 27 second timer. + ``` + +> 💁 You can find this code in the [code-speech-to-text/wio-terminal](code-speech-to-text/wio-terminal) folder. + +😀 Your speech to text program was a success! diff --git a/6-consumer/lessons/2-language-understanding/README.md b/6-consumer/lessons/2-language-understanding/README.md index 29f99ae..a217a0c 100644 --- a/6-consumer/lessons/2-language-understanding/README.md +++ b/6-consumer/lessons/2-language-understanding/README.md @@ -256,22 +256,38 @@ To use this model from code, you need to publish it. When publishing from LUIS, ## Use the language understanding model -Once published, the LUIS model can be called from code. In the last lesson you sent the recognized speech to an IoT Hub, and you can use serverless code to respond to this and understand what was sent. +Once published, the LUIS model can be called from code. In previous lessons, you have used an IoT Hub to handle communication with cloud services, sending telemetry and listening for commands. This is very asynchronous - once telemetry is sent your code doesn't wait for a response, and if the cloud service is down, you wouldn't know. + +For a smart timer, we want a response straight away, so we can tell the user that a timer is set, or alert them that the cloud services are unavailable. To do this, our IoT device will call a web endpoint directly, instead of relying on an IoT Hub. + +Rather than calling LUIS from the IoT device, you can use serverless code with a different type of trigger - an HTTP trigger. This allows your function app to listen for REST requests, and respond to them. This function will be a REST endpoint your device can call. + +> 💁 Although you can call LUIS directly from your IoT device, it's better to use something like serverless code. This way when of you want to change the LUIS app that you call, for example when you train a better model or train a model in a different language, you only have to update your cloud code, not re-deploy code to potentially thousands or millions of IoT device. ### Task - create a serverless functions app -1. Create an Azure Functions app called `smart-timer-trigger`. +1. Create an Azure Functions app called `smart-timer-trigger`, and open this in VS Code + +1. Add an HTTP trigger to this app called `speech-trigger` using the following command from inside the VS Code terminal: + + ```sh + func new --name text-to-timer --template "HTTP trigger" + ``` -1. Add an IoT Hub event trigger to this app called `speech-trigger`. + This will crate an HTTP trigger called `text-to-timer`. -1. Set the Event Hub compatible endpoint connection string for your IoT Hub in the `local.settings.json` file, and use the key for that entry in the `function.json` file. +1. Test the HTTP trigger by running the functions app. When it runs you will see the endpoint listed in the output: -1. Use the Azurite app as a local storage emulator. + ```output + Functions: + + text-to-timer: [GET,POST] http://localhost:7071/api/text-to-timer + ``` -1. Run your functions app and your IoT device to ensure speech is arriving at the IoT Hub. + Test this by loading the [http://localhost:7071/api/text-to-timer](http://localhost:7071/api/text-to-timer) URL in your browser. ```output - Python EventHub trigger processed an event: {"speech": "Set a 3 minute timer."} + This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response. ``` ### Task - use the language understanding model @@ -288,6 +304,12 @@ Once published, the LUIS model can be called from code. In the last lesson you s pip install -r requirements.txt ``` + > 💁 If you get errors, you may need to upgrade pip with the following command: + > + > ```sh + > pip install --upgrade pip + > ``` + 1. Add new entries to the `local.settings.json` file for your LUIS API Key, Endpoint URL, and App ID from the **MANAGE** tab of the LUIS portal: ```JSON @@ -313,7 +335,7 @@ Once published, the LUIS model can be called from code. In the last lesson you s This imports some system libraries, as well as the libraries to interact with LUIS. -1. In the `main` method, before it loops through all the events, add the following code: +1. Delete the contents of the `main` method, and add the following code: ```python luis_key = os.environ['LUIS_KEY'] @@ -326,14 +348,18 @@ Once published, the LUIS model can be called from code. In the last lesson you s This loads the values you added to the `local.settings.json` file for your LUIS app, creates a credentials object with your API key, then creates a LUIS client object to interact with your LUIS app. -1. Predictions are requested from LUIS by sending a prediction request - a JSON document containing the text to predict. Create this with the following code inside the `for event in events` loop: +1. This HTTP trigger will be called passing the text to understand as an HTTP parameter. These are key/value pairs sent as part of the URL. For this app, the key will be `text` and the value will be the text to understand. The following code extracts the value from the HTTP request, and logs it to the console. Add this code to the `main` function: ```python - event_body = json.loads(event.get_body().decode('utf-8')) - prediction_request = { 'query' : event_body['speech'] } + text = req.params.get('text') + logging.info(f'Request - {text}') ``` - This code extracts the speech that was sent to the IoT Hub and uses it to build the prediction request. +1. Predictions are requested from LUIS by sending a prediction request - a JSON document containing the text to predict. Create this with the following code: + + ```python + prediction_request = { 'query' : text } + ``` 1. This request can then be sent to LUIS, using the staging slot that your app was published to: @@ -373,7 +399,7 @@ Once published, the LUIS model can be called from code. In the last lesson you s * *"Set a 30 second timer"* - this will have one number, `30`, and one time unit, `second` so the single number will match the single time unit. * *"Set a 2 minute and 30 second timer"* - this will have two numbers, `2` and `30`, and two time units, `minute` and `second` so the first number will be for the first time unit (2 minutes), and the second number for the second time unit (30 seconds). - The following code gets the count of items in the number entities, and uses that to extract the first item from each array, then the second and so on: + The following code gets the count of items in the number entities, and uses that to extract the first item from each array, then the second and so on. Add this inside the `if` block. ```python for i in range(0, len(numbers)): @@ -397,24 +423,69 @@ Once published, the LUIS model can be called from code. In the last lesson you s total_seconds += number ``` -1. Finally, outside this loop through the entities, log the total time for the timer: +1. Outside this loop through the entities, log the total time for the timer: ```python logging.info(f'Timer required for {total_seconds} seconds') ``` -1. Run the function app and speak into your IoT device. You will see the total time for the timer in the function app output: +1. The number of seconds needs to be returned from the function as an HTTP response. At the end of the `if` block, add the following: + + ```python + payload = { + 'seconds': total_seconds + } + return func.HttpResponse(json.dumps(payload), status_code=200) + ``` + + This code creates a payload containing the total number of seconds for the timer, converts it to a JSON string and returns it as an HTTP result with a status code of 200, which means the call was successful. + +1. Finally, outside the `if` block, handle if the intent was not recognized by returning an error code: + + ```python + return func.HttpResponse(status_code=404) + ``` + + 404 is the status code for *not found*. + +1. Run the function app and test it out by passing text to the URL. URLs cannot contain spaces, so you will need to encode spaces in a way that URLs can use. The encoding for a space is `%20`, so replace all the spaces in the text with `%20`. For example, to test "Set a 2 minutes 27 second timer", use the following URL: + + [http://localhost:7071/api/text-to-timer?text=Set%20a%202%20minutes%2027%20second%20timer](http://localhost:7071/api/text-to-timer?text=Set%20a%202%20minutes%2027%20second%20timer) ```output - [2021-06-16T01:38:33.316Z] Executing 'Functions.speech-trigger' (Reason='(null)', Id=39720c37-b9f1-47a9-b213-3650b4d0b034) - [2021-06-16T01:38:33.329Z] Trigger Details: PartionId: 0, Offset: 3144-3144, EnqueueTimeUtc: 2021-06-16T01:38:32.7970000Z-2021-06-16T01:38:32.7970000Z, SequenceNumber: 8-8, Count: 1 - [2021-06-16T01:38:33.605Z] Python EventHub trigger processed an event: {"speech": "Set a four minute 17 second timer."} - [2021-06-16T01:38:35.076Z] Timer required for 257 seconds - [2021-06-16T01:38:35.128Z] Executed 'Functions.speech-trigger' (Succeeded, Id=39720c37-b9f1-47a9-b213-3650b4d0b034, Duration=1894ms) + Functions: + + text-to-timer: [GET,POST] http://localhost:7071/api/text-to-timer + + For detailed output, run func with --verbose flag. + [2021-06-26T19:45:14.502Z] Worker process started and initialized. + [2021-06-26T19:45:19.338Z] Host lock lease acquired by instance ID '000000000000000000000000951CAE4E'. + [2021-06-26T19:45:52.059Z] Executing 'Functions.text-to-timer' (Reason='This function was programmatically called via the host APIs.', Id=f68bfb90-30e4-47a5-99da-126b66218e81) + [2021-06-26T19:45:53.577Z] Timer required for 147 seconds + [2021-06-26T19:45:53.746Z] Executed 'Functions.text-to-timer' (Succeeded, Id=f68bfb90-30e4-47a5-99da-126b66218e81, Duration=1750ms) ``` > 💁 You can find this code in the [code/functions](code/functions) folder. +### Task - make your function available to your IoT device + +1. For your IoT device to call your REST endpoint, it will need to know the URL. When you accessed it earlier, you used `localhost`, which is a shortcut to access REST endpoints on your local machine. To allow you IoT device to get access, you need to either: + + * Publish the Functions app - follow the instructions in earlier lessons to publish your functions app to the cloud. Once published, the URL will be `http://.azurewebsites.net/api/text-to-timer`, where `` will be the name of your functions app. + * Run the functions app locally, and access using the IP address - you can get the IP address of your computer on your local network, and use that to build the URL. + + Find your IP address: + + * On Windows 10, follow the [Find your IP address guide](https://support.microsoft.com/windows/find-your-ip-address-f21a9bbc-c582-55cd-35e0-73431160a1b9?WT.mc_id=academic-17441-jabenn) + * On macOS, follow the [How to find you IP address on a Mac guide](https://www.hellotech.com/guide/for/how-to-find-ip-address-on-mac) + * On linux, follow the section on finding your private IP address in the [How to find your IP address in Linux guide](https://opensource.com/article/18/5/how-find-ip-address-linux) + + Once you have your IP address, you will able to access the function at `http://:7071/api/text-to-timer`, where `` will be your IP address, for example `http://192.168.1.10:7071/api/text-to-timer`. + + > 💁 This will only work if your IoT device is on the same network as your computer. + +1. Test the endpoint by accessing it using your browser. + --- ## 🚀 Challenge @@ -429,6 +500,7 @@ There are many ways to request the same thing, such as setting a timer. Think of * Read more about LUIS and it's capabilities on the [Language Understanding (LUIS) documentation page on Microsoft docs](https://docs.microsoft.com/azure/cognitive-services/luis/?WT.mc_id=academic-17441-jabenn) * Read more about language understanding on the [Natural-language understanding page on Wikipedia](https://wikipedia.org/wiki/Natural-language_understanding) +* Read more on HTTP triggers in the [Azure Functions HTTP trigger documentation on Microsoft docs](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=python&WT.mc_id=academic-17441-jabenn) ## Assignment diff --git a/6-consumer/lessons/2-language-understanding/assignment.md b/6-consumer/lessons/2-language-understanding/assignment.md index f3c5e30..acfdd3a 100644 --- a/6-consumer/lessons/2-language-understanding/assignment.md +++ b/6-consumer/lessons/2-language-understanding/assignment.md @@ -4,7 +4,7 @@ So far in this lesson you have trained a model to understand setting a timer. Another useful feature is cancelling a timer - maybe your bread is ready and can be taken out of the oven before the timer is elapsed. -Add a new intent to your LUIS app to cancel the timer. It won't need any entities, but will need some example sentences. Handle this in your serverless code if it is the top intent, logging that the intent was recognized. +Add a new intent to your LUIS app to cancel the timer. It won't need any entities, but will need some example sentences. Handle this in your serverless code if it is the top intent, logging that the intent was recognized and returning an appropriate response. ## Rubric diff --git a/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/local.settings.json b/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/local.settings.json index abde93a..ee6b34c 100644 --- a/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/local.settings.json +++ b/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/local.settings.json @@ -2,8 +2,7 @@ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "python", - "AzureWebJobsStorage": "UseDevelopmentStorage=true", - "IOT_HUB_CONNECTION_STRING": "", + "AzureWebJobsStorage": "", "LUIS_KEY": "", "LUIS_ENDPOINT_URL": "", "LUIS_APP_ID": "" diff --git a/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/speech-trigger/__init__.py b/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/speech-trigger/__init__.py deleted file mode 100644 index 1b9f3ac..0000000 --- a/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/speech-trigger/__init__.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import List -import logging - -import azure.functions as func - -import json -import os -from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient -from msrest.authentication import CognitiveServicesCredentials - -def main(events: List[func.EventHubEvent]): - luis_key = os.environ['LUIS_KEY'] - endpoint_url = os.environ['LUIS_ENDPOINT_URL'] - app_id = os.environ['LUIS_APP_ID'] - - credentials = CognitiveServicesCredentials(luis_key) - client = LUISRuntimeClient(endpoint=endpoint_url, credentials=credentials) - - for event in events: - logging.info('Python EventHub trigger processed an event: %s', - event.get_body().decode('utf-8')) - - event_body = json.loads(event.get_body().decode('utf-8')) - prediction_request = { 'query' : event_body['speech'] } - - prediction_response = client.prediction.get_slot_prediction(app_id, 'Staging', prediction_request) - - if prediction_response.prediction.top_intent == 'set timer': - numbers = prediction_response.prediction.entities['number'] - time_units = prediction_response.prediction.entities['time unit'] - total_seconds = 0 - - for i in range(0, len(numbers)): - number = numbers[i] - time_unit = time_units[i][0] - - if time_unit == 'minute': - total_seconds += number * 60 - else: - total_seconds += number - - logging.info(f'Timer required for {total_seconds} seconds') - diff --git a/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/speech-trigger/function.json b/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/speech-trigger/function.json deleted file mode 100644 index 0117bdf..0000000 --- a/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/speech-trigger/function.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "scriptFile": "__init__.py", - "bindings": [ - { - "type": "eventHubTrigger", - "name": "events", - "direction": "in", - "eventHubName": "samples-workitems", - "connection": "IOT_HUB_CONNECTION_STRING", - "cardinality": "many", - "consumerGroup": "$Default", - "dataType": "binary" - } - ] -} \ No newline at end of file diff --git a/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/text-to-timer/__init__.py b/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/text-to-timer/__init__.py new file mode 100644 index 0000000..84d0df4 --- /dev/null +++ b/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/text-to-timer/__init__.py @@ -0,0 +1,44 @@ +import logging + +import azure.functions as func +import json +import os +from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient +from msrest.authentication import CognitiveServicesCredentials + + +def main(req: func.HttpRequest) -> func.HttpResponse: + luis_key = os.environ['LUIS_KEY'] + endpoint_url = os.environ['LUIS_ENDPOINT_URL'] + app_id = os.environ['LUIS_APP_ID'] + + credentials = CognitiveServicesCredentials(luis_key) + client = LUISRuntimeClient(endpoint=endpoint_url, credentials=credentials) + + text = req.params.get('text') + prediction_request = { 'query' : text } + + prediction_response = client.prediction.get_slot_prediction(app_id, 'Staging', prediction_request) + + if prediction_response.prediction.top_intent == 'set timer': + numbers = prediction_response.prediction.entities['number'] + time_units = prediction_response.prediction.entities['time unit'] + total_seconds = 0 + + for i in range(0, len(numbers)): + number = numbers[i] + time_unit = time_units[i][0] + + if time_unit == 'minute': + total_seconds += number * 60 + else: + total_seconds += number + + logging.info(f'Timer required for {total_seconds} seconds') + + payload = { + 'seconds': total_seconds + } + return func.HttpResponse(json.dumps(payload), status_code=200) + + return func.HttpResponse(status_code=404) \ No newline at end of file diff --git a/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/text-to-timer/function.json b/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/text-to-timer/function.json new file mode 100644 index 0000000..d901965 --- /dev/null +++ b/6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger/text-to-timer/function.json @@ -0,0 +1,20 @@ +{ + "scriptFile": "__init__.py", + "bindings": [ + { + "authLevel": "function", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "$return" + } + ] +} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/README.md b/6-consumer/lessons/3-spoken-feedback/README.md index 9fecc41..ef17d4c 100644 --- a/6-consumer/lessons/3-spoken-feedback/README.md +++ b/6-consumer/lessons/3-spoken-feedback/README.md @@ -72,34 +72,11 @@ These large ML models are being trained to combine all three steps into end-to-e ## Set the timer -The timer can be set by sending a command from the serverless code, instructing the IoT device to set the timer. This command will contain the time in seconds till the timer needs to go off. +To set the timer, your IoT device needs to call the REST endpoint you created using serverless code, then use the resulting number of seconds to set a timer. -### Task - set the timer using a command +### Task - call the serverless function to get the timer time -1. In your serverless code, add code to send a direct method request to your IoT device - - > ⚠️ You can refer to [the instructions for sending direct method requests in lesson 5 of the farm project if needed](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#send-direct-method-requests-from-serverless-code). - - You will need to set up the connection string for the IoT Hub with the service policy (*NOT* the device) in your `local.settings.json` file and add the `azure-iot-hub` pip package to your `requirements.txt` file. The device ID can be extracted from the event. - -1. The direct method you send needs to be called `set-timer`, and will need to send the length of the timer as a JSON property called `seconds`. Use the following code to build the `CloudToDeviceMethod` using the `total_seconds` calculated from the data extracted by LUIS: - - ```python - payload = { - 'seconds': total_seconds - } - direct_method = CloudToDeviceMethod(method_name='set-timer', payload=json.dumps(payload)) - ``` - -> 💁 You can find this code in the [code-command/functions](code-command/functions) folder. - -### Task - respond to the command on the IoT device - -1. On your IoT device, respond to the command. - - > ⚠️ You can refer to [the instructions for handling direct method requests from IoT devices in lesson 4 of the farm project if needed](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud#task---connect-your-iot-device-to-the-cloud). - -1. Work through the relevant guide to set a timer for the required time: +Follow the relevant guide to call the REST endpoint from your IoT device and set a timer for the required time: * [Arduino - Wio Terminal](wio-terminal-set-timer.md) * [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-set-timer.md) diff --git a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/host.json b/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/host.json deleted file mode 100644 index 291065f..0000000 --- a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/host.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0", - "logging": { - "applicationInsights": { - "samplingSettings": { - "isEnabled": true, - "excludedTypes": "Request" - } - } - }, - "extensionBundle": { - "id": "Microsoft.Azure.Functions.ExtensionBundle", - "version": "[2.*, 3.0.0)" - } -} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/local.settings.json b/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/local.settings.json deleted file mode 100644 index 8b5b956..0000000 --- a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/local.settings.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "IsEncrypted": false, - "Values": { - "FUNCTIONS_WORKER_RUNTIME": "python", - "AzureWebJobsStorage": "UseDevelopmentStorage=true", - "IOT_HUB_CONNECTION_STRING": "", - "LUIS_KEY": "", - "LUIS_ENDPOINT_URL": "", - "LUIS_APP_ID": "", - "REGISTRY_MANAGER_CONNECTION_STRING": "" - } -} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/requirements.txt b/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/requirements.txt deleted file mode 100644 index d0405a3..0000000 --- a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Do not include azure-functions-worker as it may conflict with the Azure Functions platform - -azure-functions -azure-cognitiveservices-language-luis \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/speech-trigger/__init__.py b/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/speech-trigger/__init__.py deleted file mode 100644 index be8e5ee..0000000 --- a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/speech-trigger/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -from typing import List -import logging - -import azure.functions as func - -import json -import os -from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient -from msrest.authentication import CognitiveServicesCredentials - -from azure.iot.hub import IoTHubRegistryManager -from azure.iot.hub.models import CloudToDeviceMethod - -def main(events: List[func.EventHubEvent]): - luis_key = os.environ['LUIS_KEY'] - endpoint_url = os.environ['LUIS_ENDPOINT_URL'] - app_id = os.environ['LUIS_APP_ID'] - registry_manager_connection_string = os.environ['REGISTRY_MANAGER_CONNECTION_STRING'] - - credentials = CognitiveServicesCredentials(luis_key) - client = LUISRuntimeClient(endpoint=endpoint_url, credentials=credentials) - - for event in events: - logging.info('Python EventHub trigger processed an event: %s', - event.get_body().decode('utf-8')) - - device_id = event.iothub_metadata['connection-device-id'] - - event_body = json.loads(event.get_body().decode('utf-8')) - prediction_request = { 'query' : event_body['speech'] } - - prediction_response = client.prediction.get_slot_prediction(app_id, 'Staging', prediction_request) - - if prediction_response.prediction.top_intent == 'set timer': - numbers = prediction_response.prediction.entities['number'] - time_units = prediction_response.prediction.entities['time unit'] - total_seconds = 0 - - for i in range(0, len(numbers)): - number = numbers[i] - time_unit = time_units[i][0] - - if time_unit == 'minute': - total_seconds += number * 60 - else: - total_seconds += number - - logging.info(f'Timer required for {total_seconds} seconds') - - payload = { - 'seconds': total_seconds - } - direct_method = CloudToDeviceMethod(method_name='set-timer', payload=json.dumps(payload)) - - registry_manager_connection_string = os.environ['REGISTRY_MANAGER_CONNECTION_STRING'] - registry_manager = IoTHubRegistryManager(registry_manager_connection_string) - - registry_manager.invoke_device_method(device_id, direct_method) - - diff --git a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/speech-trigger/function.json b/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/speech-trigger/function.json deleted file mode 100644 index 0117bdf..0000000 --- a/6-consumer/lessons/3-spoken-feedback/code-command/functions/smart-timer-trigger/speech-trigger/function.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "scriptFile": "__init__.py", - "bindings": [ - { - "type": "eventHubTrigger", - "name": "events", - "direction": "in", - "eventHubName": "samples-workitems", - "connection": "IOT_HUB_CONNECTION_STRING", - "cardinality": "many", - "consumerGroup": "$Default", - "dataType": "binary" - } - ] -} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/pi/smart-timer/app.py b/6-consumer/lessons/3-spoken-feedback/code-timer/pi/smart-timer/app.py index afef5b7..4744056 100644 --- a/6-consumer/lessons/3-spoken-feedback/code-timer/pi/smart-timer/app.py +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/pi/smart-timer/app.py @@ -1,12 +1,9 @@ import io -import json import pyaudio import requests +import threading import time import wave -import threading - -from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse from grove.factory import Factory button = Factory.getButton('GPIO-HIGH', 5) @@ -45,13 +42,6 @@ def capture_audio(): speech_api_key = '' location = '' language = '' -connection_string = '' - -device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) - -print('Connecting') -device_client.connect() -print('Connected') def get_access_token(): headers = { @@ -76,13 +66,28 @@ def convert_speech_to_text(buffer): } response = requests.post(url, headers=headers, params=params, data=buffer) - response_json = json.loads(response.text) + response_json = response.json() if response_json['RecognitionStatus'] == 'Success': return response_json['DisplayText'] else: return '' +def get_timer_time(text): + url = '' + + params = { + 'text': text + } + + response = requests.post(url, params=params) + + if response.status_code != 200: + return 0 + + payload = response.json() + return payload['seconds'] + def say(text): print(text) @@ -98,6 +103,7 @@ def announce_timer(minutes, seconds): def create_timer(total_seconds): minutes, seconds = divmod(total_seconds, 60) threading.Timer(total_seconds, announce_timer, args=[minutes, seconds]).start() + announcement = '' if minutes > 0: announcement += f'{minutes} minute ' @@ -106,17 +112,12 @@ def create_timer(total_seconds): announcement += 'timer started.' say(announcement) -def handle_method_request(request): - if request.name == 'set-timer': - payload = json.loads(request.payload) - seconds = payload['seconds'] - if seconds > 0: - create_timer(payload['seconds']) - - method_response = MethodResponse.create_from_method_request(request, 200) - device_client.send_method_response(method_response) - -device_client.on_method_request_received = handle_method_request +def process_text(text): + print(text) + + seconds = get_timer_time(text) + if seconds > 0: + create_timer(seconds) while True: while not button.is_pressed(): @@ -124,7 +125,4 @@ while True: buffer = capture_audio() text = convert_speech_to_text(buffer) - if len(text) > 0: - print(text) - message = Message(json.dumps({ 'speech': text })) - device_client.send_message(message) \ No newline at end of file + process_text(text) \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/virtual-iot-device/smart-timer/app.py b/6-consumer/lessons/3-spoken-feedback/code-timer/virtual-iot-device/smart-timer/app.py index 8d45eaf..0b20fd8 100644 --- a/6-consumer/lessons/3-spoken-feedback/code-timer/virtual-iot-device/smart-timer/app.py +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/virtual-iot-device/smart-timer/app.py @@ -1,19 +1,11 @@ -import json +import requests import threading import time from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer -from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse speech_api_key = '' location = '' language = '' -connection_string = '' - -device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) - -print('Connecting') -device_client.connect() -print('Connected') recognizer_config = SpeechConfig(subscription=speech_api_key, region=location, @@ -21,19 +13,25 @@ recognizer_config = SpeechConfig(subscription=speech_api_key, recognizer = SpeechRecognizer(speech_config=recognizer_config) -def recognized(args): - if len(args.result.text) > 0: - message = Message(json.dumps({ 'speech': args.result.text })) - device_client.send_message(message) +def get_timer_time(text): + url = '' -recognizer.recognized.connect(recognized) + params = { + 'text': text + } -recognizer.start_continuous_recognition() + response = requests.post(url, params=params) + + if response.status_code != 200: + return 0 + + payload = response.json() + return payload['seconds'] def say(text): print(text) -def announce_timer(minutes, seconds): +def announce_timer(minutes, seconds): announcement = 'Times up on your ' if minutes > 0: announcement += f'{minutes} minute ' @@ -45,6 +43,7 @@ def announce_timer(minutes, seconds): def create_timer(total_seconds): minutes, seconds = divmod(total_seconds, 60) threading.Timer(total_seconds, announce_timer, args=[minutes, seconds]).start() + announcement = '' if minutes > 0: announcement += f'{minutes} minute ' @@ -53,17 +52,19 @@ def create_timer(total_seconds): announcement += 'timer started.' say(announcement) -def handle_method_request(request): - if request.name == 'set-timer': - payload = json.loads(request.payload) - seconds = payload['seconds'] - if seconds > 0: - create_timer(payload['seconds']) +def process_text(text): + print(text) + + seconds = get_timer_time(text) + if seconds > 0: + create_timer(seconds) - method_response = MethodResponse.create_from_method_request(request, 200) - device_client.send_method_response(method_response) +def recognized(args): + process_text(args.result.text) -device_client.on_method_request_received = handle_method_request +recognizer.recognized.connect(recognized) + +recognizer.start_continuous_recognition() while True: time.sleep(1) \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md b/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md index 5f11422..72b0a6b 100644 --- a/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md +++ b/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md @@ -4,21 +4,59 @@ In this part of the lesson, you will set a timer on your virtual IoT device or R ## Set a timer -The command sent from the serverless function contains the time for the timer in seconds as the payload. This time can be used to set a timer. +The text that comes back from the speech to text call needs to be sent to your serverless code to be processed by LUIS, getting back the number of seconds for the timer. This number of seconds can be used to set a timer. Timers can be set using the Python `threading.Timer` class. This class takes a delay time and a function, and after the delay time, the function is executed. -### Task - set a timer +### Task - send the text to the serverless function 1. Open the `smart-timer` project in VS Code, and ensure the virtual environment is loaded in the terminal if you are using a virtual IoT device. +1. Above the `process_text` function, declare a function called `get_timer_time` to call the REST endpoint you created: + + ```python + def get_timer_time(text): + ``` + +1. Add the following code to this function to define the URL to call: + + ```python + url = '' + ``` + + Replace `` with the URL of your rest endpoint that you built in the last lesson, either on your computer or in the cloud. + +1. Add the following code to set the text as a parameter on the URL and make the API call: + + ```python + params = { + 'text': text + } + + response = requests.post(url, params=params) + ``` + +1. Below this, retrieve the `seconds` from the response payload, returning 0 if the call failed: + + ```python + if response.status_code != 200: + return 0 + + payload = response.json() + return payload['seconds'] + ``` + + Successful HTTP calls return a status code in the 200 range, and your serverless code returns 200 if the text was processed and recognized as the set timer intent. + +### Task - set a timer on a background thread + 1. Add the following import statement at the top of the file to import the threading Python library: ```python import threading ``` -1. Above the `handle_method_request` function that handles the method request, add a function to speak a response. Fow now this will just write to the console, but later in this lesson this will speak the text. +1. Above the `process_text` function, add a function to speak a response. Fow now this will just write to the console, but later in this lesson this will speak the text. ```python def say(text): @@ -43,9 +81,9 @@ Timers can be set using the Python `threading.Timer` class. This class takes a d 1. Below this, add the following `create_timer` function to create a timer: ```python - def create_timer(seconds): - minutes, seconds = divmod(seconds, 60) - threading.Timer(seconds, announce_timer, args=[minutes, seconds]).start() + def create_timer(total_seconds): + minutes, seconds = divmod(total_seconds, 60) + threading.Timer(total_seconds, announce_timer, args=[minutes, seconds]).start() ``` This function takes the total number of seconds for the timer that will be sent in the command, and converts this to minutes and seconds. It then creates and starts a timer object using the total number of seconds, passing in the `announce_timer` function and a list containing the minutes and seconds. When the timer elapses, it will call the `announce_timer` function, and pass the contents of this list as the parameters - so the first item in the list gets passes as the `minutes` parameter, and the second item as the `seconds` parameter. @@ -64,32 +102,23 @@ Timers can be set using the Python `threading.Timer` class. This class takes a d Again, this only includes the time unit that has a value. This sentence is then sent to the `say` function. -1. At the start of the `handle_method_request` function, add the following code to check that the `set-timer` direct method was requested: - - ```python - if request.name == 'set-timer': - ``` - -1. Inside this `if` statement, extract the timer time in seconds from the payload and use this to create a timer: +1. Add the following to the end of the `process_text` function to get the time for the timer from the text, then create the timer: ```python - payload = json.loads(request.payload) - seconds = payload['seconds'] + seconds = get_timer_time(text) if seconds > 0: - create_timer(payload['seconds']) + create_timer(seconds) ``` - The timer is only created if the number of seconds is greater than 0 + The timer is only created if the number of seconds is greater than 0. 1. Run the app, and ensure the function app is also running. Set some timers, and the output will show the timer being set, and then will show when it elapses: ```output pi@raspberrypi:~/smart-timer $ python3 app.py - Connecting - Connected - Set a one minute 4 second timer. - 1 minute 4 second timer started. - Times up on your 1 minute 4 second timer. + Set a two minute 27 second timer. + 2 minute 27 second timer started. + Times up on your 2 minute 27 second timer. ``` > 💁 You can find this code in the [code-timer/pi](code-timer/pi) or [code-timer/virtual-iot-device](code-timer/virtual-iot-device) folder. diff --git a/README.md b/README.md index 4b890e2..aa5e02c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The projects cover the journey of food from farm to table. This includes farming **Hearty thanks to our authors [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), and our sketchnote artist [Nitya Narasimhan](https://github.com/nitya).** -**Thanks as well to our team of [Microsoft Learn Student Ambassadors](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn) who have been reviewing and translating this curriculum - [Aditya Garg](https://github.com/AdityaGarg00), [Aryan Jain](https://www.linkedin.com/in/aryan-jain-47a4a1145/), [Bhavesh Suneja](https://github.com/EliteWarrior315), [Lateefah Bello](https://www.linkedin.com/in/lateefah-bello/), [Manvi Jha](https://github.com/Severus-Matthew), [Mireille Tan](https://www.linkedin.com/in/mireille-tan-a4834819a/), [Mohammad Iftekher (Iftu) Ebne Jalal](https://github.com/Iftu119), [Priyanshu Srivastav](https://www.linkedin.com/in/priyanshu-srivastav-b067241ba), [Thanmai Gowducheruvu](https://github.com/innovation-platform), and [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).** +**Thanks as well to our team of [Microsoft Learn Student Ambassadors](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn) who have been reviewing and translating this curriculum - [Aditya Garg](https://github.com/AdityaGarg00), [Arpita Das](https://github.com/Arpiiitaaa), [Aryan Jain](https://www.linkedin.com/in/aryan-jain-47a4a1145/), [Bhavesh Suneja](https://github.com/EliteWarrior315), [Lateefah Bello](https://www.linkedin.com/in/lateefah-bello/), [Manvi Jha](https://github.com/Severus-Matthew), [Mireille Tan](https://www.linkedin.com/in/mireille-tan-a4834819a/), [Mohammad Iftekher (Iftu) Ebne Jalal](https://github.com/Iftu119), [Priyanshu Srivastav](https://www.linkedin.com/in/priyanshu-srivastav-b067241ba), [Thanmai Gowducheruvu](https://github.com/innovation-platform), and [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).** > **Teachers**, we have [included some suggestions](for-teachers.md) on how to use this curriculum. If you would like to create your own lessons, we have also included a [lesson template](lesson-template/README.md). diff --git a/images/Diagrams.sketch b/images/Diagrams.sketch index 1bf0842de458ac92a7d9d3e7670cae8dd25f81f6..44f09f1f6b5caf22e17a184e42d9c4ee1f9a6ab2 100644 GIT binary patch delta 168546 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 S^nmnEq%SqeU9<0hJ~CsZO4 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 e2_DAp6gdjnJ1$VdLF2UVh9_PRJy?5^2-}-v> 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 jlNA%uPjfG>W0f0TKR8aRSI^N5iX3j1j!O3yap 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ø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 Ks-36l5c(fu^`5Q( literal 0 HcmV?d00001