Функция преобразования текста в речь на ESP32 становится действительно полезной и может превратить хороший проект встраиваемой электроники в по-настоящему полезный. Независимо от того, создаете ли вы портативное устройство, панель автоматизации, монитор безопасности или образовательный инструмент, внедрение преобразования текста в речь на ESP32, несомненно, сделает ваш проект более доступным и удобным для пользователя.

Ранее на нашем сайте мы рассматривали следующие проекты преобразования текста в речь:
- преобразователь текста в речь на Arduino Uno;
- распознавание речи на Arduino Nano 33 BLE Sense;
- автономное распознавание голоса на ESP32 с использованием Edge Impulse;
- сравнение преобразователей текста в речь для Raspberry Pi - eSpeak, Festival, Google TTS, Pico, PYTTSX3;
- говорящий будильник на Raspberry Pi в стиле "Железного человека".
Все эти проекты были интересными, но они также выявили большую проблему: большинство решений для преобразования текста в речь полагаются на облачные сервисы. Это означает, что могут возникать задержки в интернете, проблемы с надежностью и сложности с настройкой, что крайне неприятно, когда вам нужно, чтобы ваша система работала где угодно и когда угодно. Именно поэтому мы решили создать решение, которое не требует облака. В этом руководстве мы покажем вам, как создать систему преобразования текста в речь на ESP32 в автономном режиме. С помощью библиотеки Talkie и ее аудиоформата Linear Predictive Coding (LPC) плата ESP32 может напрямую преобразовывать текст в речь, используя свой ЦАП (цифро-аналоговый преобразователь). Добавление усилителя PAM8403 и небольшого динамика дает вам полноценную, автономную систему преобразования текста в речь.
В следующих разделах мы рассмотрим весь процесс создания данного проекта: подключение оборудования, настройку словаря, обработку предложений и настройку или расширение параметров речи с помощью библиотеки преобразования текста в речь на основе платы ESP32. К концу этого руководства вы точно поймете, как работает система и как добавить автономную озвучку в свои собственные встроенные проекты, будь то для оповещений, автоматизации, обучающих инструментов или полностью автономных интерактивных устройств.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Усилитель PAM8403. Усиливает выходной аудиосигнал ЦАП. Работает от 5 В, 3 Вт на канал.
- Громкоговоритель (динамик). Воспроизводит слышимую речь. Импеданс 4-8 Ом.
- Макетная плата.
- Соединительные провода.
- USB-кабель.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Для создания этой автономной системы преобразования текста в речь на базе ESP32 требуется минимальное количество недорогих компонентов, которые можно найти в любом магазине электроники.

Как работает система преобразования текста в речь на ESP32 в автономном режиме
Автономная система преобразования текста в речь на ESP32 извлекает предложение из последовательного монитора, разбивает его на отдельные слова, проверяет каждое слово по списку известных слов, а затем произносит их вслух по мере чтения. Это как небольшая автономная система преобразования текста в речь, встроенная в ESP32, которая мгновенно преобразует написанный текст в устную речь, не требуя подключения к интернету или другим сервисам.
Мы использовали библиотеку Talkie, простой инструмент преобразования текста в речь, предназначенный для устройств с небольшим объемом памяти. Talkie сохраняет голосовые записи в формате LPC. Это тип сжатого аудио, который может хранить сотни английских слов. Этот формат использовался в более старых устройствах для преобразования речи, поскольку он занимает очень мало памяти. Это свойство позволяет ему хорошо работать и с ESP32, позволяя ему воспроизводить речь непосредственно с вывода ЦАП без какого-либо дополнительного оборудования. Эта архитектура преобразования текста в речь на ESP32 в автономном режиме обеспечивает быстрое время отклика и надежную работу в средах без доступа к сети, что делает ее идеальной для промышленной автоматизации, образовательных устройств и автономных встраиваемых систем.
Принцип ее работы показан на следующем рисунке.

Сгенерированный аудиосигнал передается через один из выводов ЦАП. Поскольку это маломощный аналоговый сигнал, он поступает на усилитель PAM8403, который усиливает сигнал настолько, чтобы он мог работать с обычным динамиком. Это создает небольшую систему преобразования текста в речь, которая не требует подключения к интернету или большой вычислительной мощности. Такие системы преобразования текста в речь отлично подходят для голосовых оповещений, сообщений о состоянии и инструктивной обратной связи. Поскольку все работает локально, система преобразования текста в речь на ESP32 быстро реагирует и надежно работает даже в местах, где нет интернета или ограничен доступ к сети.
Схема обработки аудиосигнала
Ниже описан процесс обработки аудиосигналов при преобразовании текста в речь на ESP32:
∗ Ввод текста: пользователь вводит предложение через последовательный монитор.
∗ Разбор слов: ESP32 разбивает предложение на отдельные слова.
∗ Сопоставление словарного запаса: каждое слово сопоставляется с массивами данных LPC.
∗ Вывод ЦАП: каждый сопоставленный кадр LPC генерирует аналоговый звук на GPIO25.
∗ Усиление: модуль PAM8403 усиливает сигнал для вывода на динамик.
∗ Воспроизведение звука: динамик воспроизводит разборчивую речь.
Основные характеристики офлайн-конвертера текста в речь на ESP32
⇒ Полностью автономный вывод речи.
Вся обработка происходит непосредственно на ESP32, поэтому вам не требуется подключение к интернету или какие-либо внешние сервисы. Система быстро реагирует и остается надежной даже при отсутствии сети.
⇒Очень простые требования к оборудованию.
Для сборки требуется только ESP32, небольшой усилитель PAM8403 и стандартный динамик. Здесь нет сложных аудиопроцессоров или замысловатых схем, что делает конструкцию простой в сборке и экономичной.
⇒Легковесный речевой движок LPC.
Библиотека Talkie использует кодирование LPC, что позволяет сохранять речевые данные небольшими и простыми в обработке. Качество звука не отличается высокой точностью, но оно достаточно четкое для оповещений, инструкций или коротких сообщений.
⇒Легко добавить больше слов.
Если вы хотите, чтобы система произносила больше слов, просто добавьте новые записи LPC в файл словаря. Пока данные LPC присутствуют, ESP32 может произносить слова без необходимости внесения каких-либо изменений в код.
⇒Простая настройка для начинающих.
Подключение простое, а код легко понять. Человек с базовым опытом работы с Arduino или ESP32 сможет быстро настроить устройство и внести небольшие корректировки без особых трудностей.
⇒Подходит для оповещений и простой автоматизации.
Эта система идеально подходит для проектов, требующих голосовых уведомлений или быстрой звуковой обратной связи, таких как будильники, панели управления, учебные пособия или другие небольшие встроенные устройства с голосовым управлением.
Схема подключения ESP32 к PAM8403
Для преобразования текста в речь на ESP32 нам потребуется аудиоусилитель PAM8403 и динамик, как упоминалось ранее. На приведенной ниже схеме показано, как подключить модуль аудиоусилителя PAM8403 к ESP32.

ESP32 имеет два вывода ЦАП (GPIO25 и GPIO26). В этом проекте мы используем GPIO25 для вывода аудиосигнала.
В таблице ниже указаны контакты подключения ESP32 и модуля усилителя PAM8403. Для корректной реализации преобразования текста в речь с использованием ESP32 следуйте этой таблице подключения.
| Контакт ESP32 | Контакт PAM8403 | Описание |
| GPIO25 | R (Правый аудиовход) | Аудиосигнал (выход ЦАП) |
| 5V | VCC | Обеспечивает питание модуля усилителя |
| GND | GND | Общий провод (земля) |
На выводе GPIO25 отображается аналоговый сигнал, генерируемый речевым процессором LPC. Затем микросхема PAM8403 усиливает этот сигнал до уровня обычной речи
Соединения PAM8403 и динамика
В таблице ниже показано расположение контактов PAM8403 относительно динамика.
| Контакт PAM8403 | Динамик |
| Р+ | Speaker + |
| Р− | Speaker − |
Схема проекта на макетной плате показана на следующем рисунке.

Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В программной части мы будем использовать среду разработки Arduino IDE вместе с библиотекой Talkie для чтения текста из последовательного монитора и преобразования его в аудиовыход.
|
1 2 3 |
Including Libraries #include <Talkie.h> #include "Vocab_US_Large.h" |
Talkie — это основная библиотека, которая обрабатывает LPC-аудио. Она включает в себя функции для чтения LPC-кадров, их декодирования и генерации итоговой звуковой волны через вывод ЦАП GPIO.
Вы можете скачать библиотеку Talkie здесь, на GitHub: https://github.com/ArminJo/Talkie
"Vocab_US_Large.h" — это файл словаря, содержащий предопределенные массивы речевых сигналов LPC.
Инициализация объекта Talkie
|
1 |
Talkie voice; |
Объект voice выступает в роли механизма воспроизведения. Каждый раз, когда вы вызываете функцию voice.say(...), ESP32 выдает последовательность кадров LPC в качестве выходных данных, представляющих произнесенные слова.
Структура сопоставления слов
Структура WordMap создает простой словарь, связывающий ключевое слово в тексте (введенное вами слово) с определенным массивом LPC, содержащим аудиоданные этого слова.
|
1 2 3 4 |
struct WordMap { const char* text; const unsigned char* lpc; }; |
Например:
|
1 |
{"ONE", sp2_ONE}, |
Это означает, что при вводе "ONE" система извлекает данные LPC, хранящиеся в sp2_ONE.
Это сопоставление важно, потому что библиотека сама по себе не преобразует текст в фонемы. Она использует только предопределенные массивы LPC.
Словарный массив
|
1 2 3 4 |
WordMap words[] = { {"ZERO", sp2_ZERO}, ... }; |
Этот массив содержит все слова, которые может произнести ваша система, что является основной частью функции преобразования текста в речь на ESP32. Если вы введете слово, которого нет в этом списке, ESP32 сообщит, что не может произнести это слово.
Массив может быть довольно большим, и добавление большего количества слов делает вашу библиотеку преобразования текста в речь для ESP32 лучше и полезнее для реальных проектов. Когда вы набираете «ONE», система преобразования текста в речь ESP32 извлекает данные из sp2_ONE. Библиотека преобразования текста в речь ESP32 не генерирует фонемы динамически — она воспроизводит только предопределенные массивы LPC.
Функция поиска слов и воспроизведения
Эта функция выполняет сопоставление текста и речи без учета регистра с использованием ESP32.
|
1 2 3 4 5 6 7 8 9 10 |
void speakWord(const char* w) { for (int i = 0; i < wordCount; i++) { if (strcasecmp(w, words[i].text) == 0) { voice.say(words[i].lpc); return; } } Serial.print("Word not found in vocab: "); Serial.println(w); } |
Эта функция сравнивает введенное вами слово с каждой записью в словаре, игнорируя заглавные и строчные буквы. Если найдено совпадение, она использует функцию voice.say() для воспроизведения аудиофайла LPC.
Если совпадений нет, отображается предупреждающее сообщение. Это поможет вам определить пропущенные слова в словаре.
Обработка последовательного ввода
В функции setup():
|
1 2 |
Serial.begin(9600); Serial.println("Type your sentence in capital letters..."); |
ESP32 ожидает ввода данных от пользователя через последовательный монитор.
Логика разбора предложений
В функции loop():
|
1 2 3 |
String line = Serial.readStringUntil('\n'); line.trim(); line.toUpperCase(); |
Эта программа считывает целое предложение, удаляет лишние пробелы и преобразует его в верхний регистр в соответствии со словарным форматом.
Предложение обрабатывается по одному символу за раз:
|
1 2 3 4 5 6 7 |
for (int i = 0; i <= line.length(); i++) { if (i == line.length() || line[i] == ' ') { String w = line.substring(start, i); speakWord(w.c_str()); start = i + 1; } } |
При обнаружении пробела или конца строки, устройство берет текущее слово и воспроизводит его. Таким образом, ESP32 произносит каждое слово предложения по отдельности. При обнаружении слова оно извлекает текущее слово и воспроизводит его, используя библиотеку преобразования текста в речь ESP32, создавая естественный ход предложения.
Тестирование работы проекта
После загрузки кода откройте последовательный монитор и установите скорость передачи данных на 9600 бод. Введите, например, следующее:
|
1 2 3 |
START MACHINE CHECK TEMPERATURE POWER ALERT |
Затем нажмите Enter.
ESP32 считывает всё предложение, разбивает его на отдельные слова и пытается произнести каждое из них, используя систему сопоставления словарного запаса. Если слово есть в словаре, вы услышите его чётко через динамик в рамках процесса преобразования текста в речь ESP32. Если слово не найдено, в мониторе последовательного порта отображается сообщение “Word not found in vocab” («Слово не найдено в словаре»), что помогает вам найти пропущенные слова в вашем словаре и при необходимости обновить библиотеку преобразования текста в речь для ESP32.


Устранение неполадок
В следующей таблице показаны возможные неполадки в работе проекта и способы их устранения.
Часто задаваемые вопросы по преобразованию текста в речь на
ESP32
⇥ 1. Может ли эта система озвучивать любое слово, которое я захочу?
Нет, система может озвучивать только те слова, которые уже содержат данные LPC в файле словаря. Библиотека Talkie не создает речь на лету; она просто воспроизводит предварительно записанные речевые кадры из памяти. Вы можете добавить больше слов только в том случае, если доступны массивы LPC, что является обычным для системы преобразования текста в речь на ESP32. Если слова нет в файле, ESP32 не сможет самостоятельно сформировать речь.
⇥ 2. Почему голос звучит как робот?
Библиотека Talkie использует линейное предиктивное кодирование (LPC), метод сжатия речи, который впервые был применен в более старых цифровых системах связи. LPC подходит для небольших устройств, но часто создает звук, который кажется искусственным или роботизированным. Это распространенная проблема в библиотеке синтеза речи ESP32; экономия памяти важнее, чем достижение очень естественного звучания.
⇥ 3. Можно ли подключиться напрямую к динамику без усилителя?
Технически, вывод ЦАП ESP32 может воспроизводить звук, но громкость будет низкой, а прямое подключение может перегрузить или повредить вывод ЦАП. Поэтому для безопасного и надежного получения выходного сигнала в любых проектах преобразования текста в речь на ESP32 необходимо использовать модуль PAM8403.
⇥ 4. Какие контакты ЦАП можно использовать?
ESP32 имеет два контакта, которые можно использовать для ЦАП: GPIO25 и GPIO26 . Оба этих контакта могут выдавать аналоговые аудиосигналы. В этом руководстве мы используем GPIO25 для единообразия, но если для вашей конфигурации требуется другая конфигурация контактов, вы можете использовать GPIO26 .
⇥ 5. Работает ли это с ESP8266?
ESP8266 совместим с библиотекой Talkie. Изначально библиотека была разработана для работы с платами ESP32, но платы ESP8266 также могут эффективно её поддерживать.
⇥ 6. Можно ли использовать более крупные колонки?
Да. Усилитель PAM8403 может питать многие небольшие и средние колонки, сопротивление которых обычно составляет от 4 до 8 Ом. Если вы используете более крупные колонки, им может потребоваться большая мощность, поэтому убедитесь, что ваша проводка и источник питания подходят для их установки.
Заключение
В этом подробном руководстве показано, как система преобразования текста в речь ESP32, в сочетании с библиотекой Talkie и форматом аудиофайлов LPC, обеспечивает простые, но эффективные возможности вывода голоса. Система преобразования текста в речь ESP32 не зависит от облачных сервисов, что позволяет осуществлять полное или частичное воспроизведение речи в условиях ограниченной памяти или плохого интернет-соединения. Хотя использование библиотеки ESP32 TTS может звучать несколько роботизированно, автономная работа и низкое потребление памяти обеспечивают возможность использования везде, где требуется аудиообратная связь в реальном времени. Независимо от того, является ли вашей целью система оповещения, обучающий инструмент или панель автоматизации, преобразование текста в речь с помощью ESP32 обеспечивает максимальную ценность для пользователя в проектах со встроенными системами.
Этот проект демонстрирует, что ESP32 может генерировать звук из предварительно записанных данных LPC и простой программной библиотеки. Использование библиотеки Talkie превращает устройство в практичное решение для преобразования текста в речь для небольших проектов и систем, обеспечивая голосовой вывод без необходимости использования облачного синтезатора речи. Вся система остается компактной, доступной и полностью автономной. Поскольку она использует минимальное количество оборудования и не требует подключения к интернету, она хорошо работает даже в удаленных или промышленных условиях.
Полный код программы
Его также вместе со схемой можно скачать по следующей ссылке.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
/* * Project Title: ESP32 based Text to Speech offline converter */ #include <Talkie.h> #include "Vocab_US_Large.h" // Include the vocab you want Talkie voice; // Minimal mapping: text → LPC array struct WordMap { const char* text; const unsigned char* lpc; }; // Only include words actually in your LPC vocab WordMap words[] = { {"ZERO", sp2_ZERO}, {"ONE", sp2_ONE}, {"TWO", sp2_TWO}, {"THREE", sp2_THREE}, {"FOUR", sp2_FOUR}, {"FIVE", sp2_FIVE}, {"SIX", sp2_SIX}, {"SEVEN", sp2_SEVEN}, {"EIGHT", sp2_EIGHT}, {"NINE", sp2_NINE}, {"TEN", sp2_TEN}, {"ELEVEN", sp2_ELEVEN}, {"TWELVE", sp2_TWELVE}, {"TWENTY", sp2_TWENTY}, {"HUNDRED", sp2_HUNDRED}, {"THOUSAND", sp2_THOUSAND}, {"THIR", sp2_THIR_}, {"FIF", sp2_FIF_}, {"TEEN", sp2__TEEN}, // Letters {"A", sp2_A}, {"B", sp2_B}, {"C", sp2_C}, {"D", sp2_D}, {"E", sp2_E}, {"F", sp2_F}, {"G", sp2_G}, {"H", sp2_H}, {"I", sp2_I}, {"J", sp2_J}, {"K", sp2_K}, {"L", sp2_L}, {"M", sp2_M}, {"N", sp2_N}, {"O", sp2_O}, {"P", sp2_P}, {"Q", sp2_Q}, {"R", sp2_R}, {"S", sp2_S}, {"T", sp2_T}, {"U", sp2_U}, {"V", sp2_V}, {"W", sp2_W}, {"X", sp2_X}, {"Y", sp2_Y}, {"Z", sp2_Z}, // Phonetic alphabet {"ALPHA", sp2_ALPHA}, {"BRAVO", sp2_BRAVO}, {"CHARLIE", sp2_CHARLIE}, {"DELTA", sp2_DELTA}, {"ECHO", sp2_ECHO}, {"FOXTROT", sp2_FOXTROT}, {"GOLF", sp2_GOLF}, {"HENRY", sp2_HENRY}, {"INDIA", sp2_INDIA}, {"JULIET", sp2_JULIET}, {"KILO", sp2_KILO}, {"LIMA", sp2_LIMA}, {"MIKE", sp2_MIKE}, {"NOVEMBER", sp2_NOVEMBER}, {"OSCAR", sp2_OSCAR}, {"PAPA", sp2_PAPA}, {"QUEBEC", sp2_QUEBEC}, {"ROMEO", sp2_ROMEO}, {"SIERRA", sp2_SIERRA}, {"TANGO", sp2_TANGO}, {"UNIFORM", sp2_UNIFORM}, {"VICTOR", sp2_VICTOR}, {"WHISKY", sp2_WHISKY}, {"XRAY", sp2_XRAY}, {"YANKEE", sp2_YANKEE}, {"ZULU", sp2_ZULU}, // Common words {"THE", sp2_THE}, {"WATTS", sp2_WATTS}, {"METER", sp2_METER}, {"DANGER", sp2_DANGER}, {"PRESSURE", sp2_PRESSURE}, {"CHANGE", sp2_CHANGE}, {"MINUS", sp2_MINUS}, {"NOT", sp2_NOT}, {"START", sp2_START}, {"LINE", sp2_LINE}, {"OFF", sp2_OFF}, {"TIME", sp2_TIME}, {"AUTOMATIC", sp2_AUTOMATIC}, {"WEIGHT", sp2_WEIGHT}, {"SMOKE", sp2_SMOKE}, {"ABORT", sp2_ABORT}, {"CALL", sp2_CALL}, {"CYCLE", sp2_CYCLE}, {"DISPLAY", sp2_DISPLAY}, {"EQUAL", sp2_EQUAL}, {"FAST", sp2_FAST}, {"ABOUT", sp2_ABOUT}, {"GO", sp2_GO}, {"INCH", sp2_INCH}, {"LOW", sp2_LOW}, {"MOTOR", sp2_MOTOR}, {"OPEN", sp2_OPEN}, {"PERCENT", sp2_PERCENT}, {"PROBE", sp2_PROBE}, {"READY", sp2_READY}, {"SET", sp2_SET}, {"SPEED", sp2_SPEED}, {"UNDER", sp2_UNDER}, {"OPERATOR", sp2_OPERATOR}, {"AMPS", sp2_AMPS}, {"MEGA", sp2_MEGA}, {"PICO", sp2_PICO}, {"FIRE", sp2_FIRE}, {"POWER", sp2_POWER}, {"COMPLETE", sp2_COMPLETE}, {"REPAIR", sp2_REPAIR}, {"TEMPERATURE", sp2_TEMPERATURE}, {"STOP", sp2_STOP}, {"MACHINE", sp2_MACHINE}, {"ON", sp2_ON}, {"CONTROL", sp2_CONTROL}, {"ELECTRICIAN", sp2_ELECTRICIAN}, {"AT", sp2_AT}, {"RED", sp2_RED}, {"ALL", sp2_ALL}, {"CANCEL", sp2_CANCEL}, {"PHASE", sp2_PHASE}, {"NOR", sp2_NOR}, {"EXIT", sp2_EXIT}, {"FLOW", sp2_FLOW}, {"GAUGE", sp2_GAUGE}, {"GREEN", sp2_GREEN}, {"INSPECTOR", sp2_INSPECTOR}, {"MANUAL", sp2_MANUAL}, {"MOVE", sp2_MOVE}, {"OVER", sp2_OVER}, {"PLUS", sp2_PLUS}, {"PULL", sp2_PULL}, {"REPEAT", sp2_REPEAT}, {"SHUT", sp2_SHUT}, {"TEST", sp2_TEST}, {"VOLTS", sp2_VOLTS}, {"GALLONS", sp2_GALLONS}, {"HERTZ", sp2_HERTZ}, {"MICRO", sp2_MICRO}, {"OHMS", sp2_OHMS}, {"AREA", sp2_AREA}, {"AND", sp2_AND}, {"CIRCUIT", sp2_CIRCUIT}, {"CONNECT", sp2_CONNECT}, {"SECONDS", sp2_SECONDS}, {"UNIT", sp2_UNIT}, {"TIMER", sp2_TIMER}, {"UP", sp2_UP}, {"IS", sp2_IS}, {"ALERT", sp2_ALERT}, {"ADJUST", sp2_ADJUST}, {"BETWEEN", sp2_BETWEEN}, {"MINUTES", sp2_MINUTES}, {"BUTTON", sp2_BUTTON}, {"CLOCK", sp2_CLOCK}, {"DEVICE", sp2_DEVICE}, {"EAST", sp2_EAST}, {"FAIL", sp2_FAIL}, {"FREQUENCY", sp2_FREQUENCY}, {"GATE", sp2_GATE}, {"HIGH", sp2_HIGH}, {"INTRUDER", sp2_INTRUDER}, {"MEASURE", sp2_MEASURE}, {"NORTH", sp2_NORTH}, {"PASS", sp2_PASS}, {"POSITION", sp2_POSITION}, {"PUSH", sp2_PUSH}, {"RIGHT", sp2_RIGHT}, {"SLOW", sp2_SLOW}, {"TOOL", sp2_TOOL}, {"WEST", sp2_WEST}, {"FARAD", sp2_FARAD}, {"MILLI", sp2_MILLI}, {"CAUTION", sp2_CAUTION}, {"LIGHT", sp2_LIGHT}, {"CHECK", sp2_CHECK}, {"DEGREES", sp2_DEGREES}, {"SERVICE", sp2_SERVICE}, {"SWITCH", sp2_SWITCH}, {"VALVE", sp2_VALVE}, {"VAL", sp2_VAL}, {"NUMBER", sp2_NUMBER}, {"OUT", sp2_OUT}, {"POINT", sp2_POINT}, {"BREAK", sp2_BREAK}, {"HOURS", sp2_HOURS}, {"CALIBRATE", sp2_CALIBRATE}, {"CRANE", sp2_CRANE}, {"DIRECTION", sp2_DIRECTION}, {"ENTER", sp2_ENTER}, {"FEET", sp2_FEET}, {"FROM", sp2_FROM}, {"GAP", sp2_GAP}, {"HOLD", sp2_HOLD}, {"LEFT", sp2_LEFT}, {"MILL", sp2_MILL}, {"UH", sp2_UH}, {"PAST", sp2_PAST}, {"PRESS", sp2_PRESS}, {"RANGE", sp2_RANGE}, {"SAFE", sp2_SAFE}, {"SOUTH", sp2_SOUTH}, {"TURN", sp2_TURN}, {"YELLOW", sp2_YELLOW}, {"YELLOW", sp2_YELLOW}, }; const int wordCount = sizeof(words) / sizeof(words[0]); void speakWord(const char* w) { for (int i = 0; i < wordCount; i++) { if (strcasecmp(w, words[i].text) == 0) { voice.say(words[i].lpc); return; } } Serial.print("Word not found in vocab: "); Serial.println(w); } void setup() { Serial.begin(9600); Serial.println("Type your sentence in capital letters. Example: HELLO WORLD"); } void loop() { if (Serial.available() > 0) { String line = Serial.readStringUntil('\n'); line.trim(); line.toUpperCase(); // Split sentence into words int start = 0; for (int i = 0; i <= line.length(); i++) { if (i == line.length() || line[i] == ' ') { String w = line.substring(start, i); speakWord(w.c_str()); start = i + 1; } } } } |





