Распознавание речи на STM32F4-Discovery

image
В этой статье я хочу рассказать о том, как можно распознавать речь на микроконтроллере, используя отладочную плату STM32F4-Discovery. Поскольку распознавание речи — достаточно сложная задача даже для компьютера, то в данном случае оно проводится при помощи сервиса Google. Распознавание речи таким способом может пригодится в разных задачах, например в одном из устройств «умного дома».

Отладочная плата STM32F4-Discovery заметно отличается от нередко упоминаемой в статьях отладочной платы STM32-Discovery. На ней установлен микроконтроллер STM32F407VGT6, использующий архитектуру Cortex-M4F, имеющий 1 MB Flash и 192 KB RAM. Контроллер способен работать с тактовой частотой 168 МГц.

На отладочной плате установлен аудио-ЦАП со встроенным усилителем (его выход соединен с разъемом для наушников) и цифровой MEMS-микрофон, благодаря чему на базе STM32F4-Discovery можно легко изготовить устройство, работающее со звуком.

Распознавание речи с использованием Google Voice Search описано здесь: Статья.
Для того, чтобы распознать какую-либо сказанную фразу с использованием микроконтроллера, нужно выполнить ряд действий:

Записать звук в память контроллера.
Произвести кодирование звука.
Установить соединение с сервером Google.
Отправить на сервер POST-запрос и закодированные аудиоданные.
Принять ответ от сервера.

Запись голоса
Поскольку на плате уже есть цифровой микрофон, записывать звук будем с его помощью. В данном случае это PDM-микрофон. Он имеет только два сигнальных вывода — тактирование и данные. При наличии сигнала тактирования, на выходе данных микрофона появляется сигнал, закодированный при помощи PDM модуляции (подробнее о ней рассказано в Википедии: Pulse-density modulation). На STM32F4-Discovery микрофон соединен с SPI/I2S — для приема данных с микрофона достаточно сконфигурировать I2S на прием данных, и по прерыванию от I2S считывать из регистра полученные данные. Эти данные сохраняются в память контроллера, и после того, как будет записано достаточное количество данных, производится их фильтрация, результатом которой являются несколько семплов аудиоданных.
Работа с микрофоном описана в документе AN3998 от ST — там объясняется принцип действия микрофона, особенности его подключения и описывается работа с функцией фильтрации.

На сайте ST среди различных примеров для платы есть пример работы со звуком, вот только он достаточно навороченный — в примере показано, как воспроизводить звук из памяти контролера и с подключенной к плате USB-флешки. Так же демонстрируется запись звука на флешку. Код для воспроизведения и записи звука я брал именно оттуда. Вот только в этом коде оказалось немало ошибок и недоделок — вероятно, пример писали в спешке.

Кодирование записанного звука
Описания работы с сервисом распознавания речи уже не раз приводились в интернете. Во всех случаях авторы используют аудиокодек FLAC, так как в Google используют нестандартное кодирование Speex данных.
Это видно из кода браузера Chromium: Код, отвечающий за запись звука.
В описании POST запроса указывается, что тип данных — «audio/x-speex-with-header-byte».
Вот только на STM32 не удастся закодировать данные в формат FLAC — нет таких библиотек. А вот код Speex портирован на STM32, поэтому для кодирования я использовал именно этот кодек. Из кода Chromium довольно легко понять, в чем заключается модификация кодека — перед началом каждого фрейма закодированных аудиоданных вставляется дополнительный байт, равный длине фрейма в байтах.

Запись и кодирование звука идут одновременно — с использованием двойной буферизации: в то время, пока в один из буферов записываются 160 семплов аудиоданных, данные из другого буфера кодируются в формат Speex. Закодированные данные сохраняются в памяти контроллера. Запись идет в течении 2 секунд, в результате чего формируются 2100 байт закодированных аудиоданных. Частота дискретизации — 8 кГц.

Связь с сервером Google
image
Для соединения с интернетом используется отладочная плата с WIFI модулем — RN-XV. На ней установлен WIFI-модуль RN-171 (снизу платы), антенна, 3 сетодиода и штыревые разъемы. Связь с модулем идет через UART, так что для работы с ним достаточно 4 проводов. Стоимость платы в sparkfun, откуда я его заказывал — 35$. Сам WIFI — модуль стоит 30$. Подробнее о модуле можно прочитать на сайте sparkfun: RN-XV WiFly Module.

Для того того, чтобы передать данные на сервер, нужно подключится к нему по протоколу TCP, а затем передать запрос такого вида:

POST http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU HTTP/1.1@#Content-type: audio/x-speex-with-header-byte; rate=8000@#Connection: close@#Content-length: 2100@#@#

Символы @# программа заменяет на CRLF. После передачи запроса нужно отправить на сервер 2100 байт закодированных аудиоданных. Получив все данные, сервер производит распознавание речи, и передает распознанную строку вместе с дополнительной информацией, после чего соединение с сервером закрывается.

После того, как ответ сервера принят, программа выделяет из него распознанную строку и выводит ее через другой UART микроконтроллера. Данные из этого UART передаются на компьютер в терминал, в окне которого и появляется распознанная фраза. После этого контролер готов в запуску записи новой фразы.

Получившаяся конструкция выглядит так:
image

А вот как она работает:


Обновление:

Уже после того, как я выложил статью, я смог реализовать запуск записи при появлении громкого звука (в том числе и речи). Для этого программа постоянно ведет запись и кодирование звука. Закодированные данные помещаются в массив. После достижения его конца, данные начинают помещаться в его начало. В то же время программа постоянно проверяет, не появился ли громкий звук. При его появлении программа сохраняет значение указателя записи и ведет запись в течение 2 секунд. После остановки записи, программа копирует данные в другой буфер. Так как известно, в какой момент появился звук, можно брать данные незадолго до этого. Таким образом, первые звуки слова не теряются.

Видео работы VAD:


Программа написана в IAR.
Программа позволяет воспроизводить записанную фразу, перед тем как отправить ее на сервер. Для этого достаточно раскомментировать некоторые строки в функции main.

В приложенном архиве несколько проектов:
my_audio_test — записывает и сразу же воспроизводит звук с микрофона.
speex_out — воспроизводит звук в формате Speex, хранящийся в Flash памяти контроллера.
speex_rec — записывает и кодирует звук при помощи Speex в течение 2 секунд, после чего воспроизводит запись.
speech_wifi — сам проект распознавания речи, в этом проекте используется WIFI.
speech_wifi_vad — проект распознавания речи с VAD, в этом проекте используется WIFI.

www.dropbox.com/s/xke5rq8lzi980x5/NEW_VOICE.zip?dl=0
Метки:
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 86
  • 0
    Шикарно, для умного дома делаете?
    • +1
      Умный дом пока только в перспективе. Просто было интересно, как будет выглядеть распознавание речи при помощи микроконтроллера.
      • –1
        Хм… интересное решение, но куда более интересным было бы сделать без участия интернета а своими силами на МК, что система не была зависима от интернета.
        • +3
          Успехов :).
          • +2
            Есть делать систему под конкретного человека, то это достаточно легко, надо просто записать набор команд и делать сравнение записанной команды и того что слышим сейчас, если смотреть на применение системы относительно умного дома.

            p.s. а за что минусы то?
            • +2
              Минусы — за бред. Просто представьте на минутку, сколько нужно проделать работы и изучить матана, чтобы упихать распознавание речи на МК в одиночку. Это как собрать самолёт у себя в гараже из деталей со свалки (:
              • 0
                Простите но если мы говорим не об полноценном распозновании речи а о распозновании команд то тут хватит теории вероятности со 2 или 3 курса университета.
                Работы тут на 1 день, качественный МК, запись команд на память, при произношении команды сравнение того что получили с вариантами команд и при заданной вероятности выполнение команды. При количестве команд в рамках разумного времени и мощности Мк потребуется не много.
                • 0
                  Если бы все было так просто, то мы бы уже давно с бытовой техникой разговаривали.
                  • 0
                    Разговор дело со всем другое, там требуется огромный словарь, что и вызывает основную сложность, ваш вариант очень интересный и я не спорю что это очень хороший результат я лишь говорю то что по моему без использования интернета было бы интересней.

                    И мой вариант требует большой и длительной настройки под каждого человека что в рамках серийного производство не позволительно.
                • 0
                  для прототипа хватит качественного инженерного решения использующее сервис распознавания, но дальнейший шаг подразумевает локальное решение на случай если например инета не будет.
                • +1
                  Как вариант — при первом включении попросить хозяина обучить устройство. В фильме «Двухсотлетний человек» насколько я помню было что-то подобное.
                  • –1
                    Ага. А к инструкции приложить трехтомник «Войны и мира», сборник собраний сочинений Солженицына и пару-тройку желтушных книжонок…
                    И научить МК работать 64-битными адресами и поддерживать оперативку на DDR3. И работать с жестким диском.
                    • 0
                      достаточно раза 3 повторить команду, а дальше как написали выше матан, но есть ошибка, для заданных команд и действий и не слов и букв подойдет стандартная теория вероятности которая на 2 или 3 курсе университета, и большой мощности МК не потребуется
                      • –1
                        Мы, вообще-то, о распознавании речи говорим, а не о двух-трех командах…
                        • –1
                          Вообще то о распозновании речи к умному дому, т.е распозвании команд для системы и о разумном количестве команд это ну до 1000 где то. а не 2 или 3
                          • 0
                            Вы хотите 1000 команд записать сами? И где их все хранить?
                            • 0
                              Количество команд пользователь сам сможет выбрать, а хранить на SD карте
                            • 0
                              1000 команд — это уже не 2-3. Здесь простой «слепок» не подойдет: слишком много информации хранить придется. Так что, либо пилить полноценную распознавалку, либо сохранять все на объемной флешке и не пенять устройство за «тугодумство».
                              • +1
                                обьемная флешка не потребуется я думаю что команда будет весить больше сотни кбайт, а если ввести умный поиск то он будет не долгий)

                                Да Мк потребуется приличный 8 битные AVR не подойдут на Cortex M3 я думаю, спокойно можно сделать)

                                Вообще спор меня за интриговал, и я подумываю реализовать это) ну или пробовать) но боюсь не скоро смогу… завал на работе) как сделаю отпишусь)
                                • 0
                                  Умный поиск — это как?
                                • 0
                                  А словарь откуда будете брать? Или предлагаете для каждого слова «слепок» хранить?
          • +2
            А ведь вместо кнопки можно сделать пороговый детектор…
            • 0
              Я же указал в статье — уже пробовал сделать детектор голоса. Кроме того, детектор будет на любой шум срабатывать.
            • 0
              Если я правильно вас понял, то не на весь шум будет срабатывать, после отправки запроса, вы получаете данные такие как, % распознания и вы можете отсеивать посторонние и не распознанные звуки.
              • 0
                Значение точности распознавания действительно передается. Только из-за шума возможно большое количество лишних запросов, при этом во время передачи запроса и ожидания ответа запись невозможна.
                При этом главная проблема детектора звука — первые звуки слова теряются.
                • 0
                  Я делал алгоритм на запись звука используя технологию Google и добился записи звука и первых звуков.Могу поделиться, если требуется, но вы я думаю и так знаете как это сделать.
                  • 0
                    Я все-таки смог реализовать голосовую активацию, поэтому обновил пост.
                  • 0
                    Как вариант, можно анализировать уровни сигнала с микрофона и время.
                    Например если был высокий уровень в течении 100мс, а потом низкий уровень 500мс, то это просто помеха или был сигнал более 100мс, а потом пауза 800мс, то из сигнала вычитаю 800мс и отправляю его на конвертирование.
                • 0
                  Забавная игрушка.

                  Почему-то мне кажется, что эта плата может распознавать звук и сама, без гугла. 168МГц + элементы DSP — это нешуточная вычислительная мощность.
                  • +1
                    Думаю, что максимум голосовые команды, да и то после предварительной записи.
                    • 0
                      Минимум придётся портировать существующий софт с сорцами, если таковой имеется. Причём, DSP здесь не сильно поможет: тут больше не обработка сигнала будет грузить ядро, а алгоритм распознавания. Ну, а если софта нет, тогда лучше запастись зубами — грызть гранит науки придётся долго и усердно.
                      • 0
                        В реальном времени — очень вряд ли.
                        И потом, написать самому софт нереально, а существующий должен крутиться на какой-то оси.
                      • 0
                        Интересно, спасибо.
                        Особенно пригодятся примеры, т.к. такая плата имеется, но ничего серьёзного именно на F4 не собирал. Просто дороговаты контроллеры сами по себе.

                        И вопрос: почему не использовали имеющийся там Ethernet? А то модуль дороже самой платы выходит.
                        • +2
                          Эзернет там неполный. К нему еще надо допаивать PHY и в коде поддержки TCP разбираться.
                        • 0
                          Для построения «умного дома», в той части, где нужно распознавать речевые команды, можно воспользоваться вот такой штуковиной — EasyVR (Multi-language speech recognition module with serial interface)
                          www.tigal.com/product/1770
                          Можно запрограммировать платку на 32 голосовые команды.
                          • 0
                            Платка дороже модуля wifi стоит, только модуль тренировать не надо, и сам по себе wifi в устройстве очень полезен — например, для связи с остальными частями «умного дома».
                          • 0
                            Попробовал speech api.
                            Фраза «accessing google speech api» распозналась как «texas in google speech be».
                            Я бы не стал в свой дом засовывать такую штуку… А то ещё включит плиту вместо телевизора.
                            • +1
                              Так а чеж вы с ним на не родном языке говорите, попробуйте на русском, процент успешного распознования значительно улучшится.
                              • 0
                                Хм, а ссылочку не дадите? Я только english нашёл.
                                • 0
                                  Вроде как вот тут про переключение языка написано.
                            • +3
                              Увидев в названии статьи довольно мощный DSP, подумал, что обнаружу в ней реализацию собственно распознавания.
                              168 мегагерц DSP жмут чужим кодеком и распознаются чужим ПО на облачном сервере, ну ладно… Но передавать данные через привешенную на проводах платку уарт-усб, имея на борту USB-контроллер, это, простите, моветон.
                              • 0
                                *простите, следует читать "168 мегагерц DSP жмут аудиоданные чужим кодеком, которые распознаются чужим ПО"
                                • +3
                                  Но-но, не пинайте так автора. Во-первых, ковырять и отлаживать USB или UART — две большие разницы (вы в курсе, я думаю). Во-вторых, для прототипа и проекта «для поиграться» результат всё равно хороший.

                                  Да, я тоже ожидал увидеть матан и прочие потроха алгоритма распознавания… Ну что ж поделать, я автора прекрасно понимаю: я сам недавно начал писать драйвер SD-карт, но потом подзабросил, ибо дофига рутины и отладки (и вообще это нудятина), а выхлоп мизерный — можно взять готовый шмат чужого говнокода, который уже работает, а свой писать да отлаживать никаких мотивации и времени не хватает.

                                  Впрочем, я когда-нибудь к своему драйверу вернусь, и надеюсь, что автор когда-нибудь зафигачит распознавание на самом МК. Это будет настоящий подвиг (:
                                  • 0
                                    прикольно, а я такой драйвер для sd карточек как раз только что закончил более-менее :)
                                    • +1
                                      Делитесь сорцами. Если они не привязаны к железу, я бы на STM32 с радостью потестил, да и вообще можно совместно пилить проект, если там осталось что-то (:
                                      Я, кстати, исключительно по спекам драйвер пилю (SD Specifications Part 1 Physical Layer Simplified Specification Version 3.01).
                                      • +1
                                        Да, я как раз по официальным спекам и сделал. Делаю это для STM32F217.
                                        Из примеров, которые можно найти в инете толкового ничего не нашёл. Сделал сам, нормально детектируются/инициализируются и читаются/пишутся карты SDSC и SDHC — у меня тут их горсть целая (правда 8 гиг всего самая «большая»). Скоро вот раздобуду 64 гиг и проверю что у такой SDXC карточки записано в регистрах CSD & SCR…
                                        Возможно нужно будет немного подкрутить тайминги, меня вообще сильно удивило насколько карточки различаются по скорости — FTL кое-где вообще плохо реализован.
                                        Да, чуть не забыл, всё это у меня для шины SPI, есть в планах сделать нормальный SDIO 4-х пиновый чтоб выжимать максимум скорости и ещё задействовать DMA чтобы проц не грузить.
                                        Мне интересно если бы кто-то потестил на разных картах — может что ещё поправить надо будет.
                                  • 0
                                    По поводу UART — это очень быстрое и простое решение. Использовать встроенный USB я умею, вот только не известно, как прерывания от USB (а при наличии соединения с компьютером они есть всегда), будут влиять на работу программы, в частности на запись сигнала.
                                    По поводу распознавания на контроллере — в свое время экспериментировал с распознаванием голосовых команд при помощи голосового движка от Micosoft. Запускалось оно на Pentium 133 MHz под win2k (А ведь это помощней контроллера будет — там и математический сопроцессор, и ОЗУ много, и диск есть). Движок приходилось более получаса обучать, перед началом распознавания надо было указать, какие команды будут ожидаться. И все равно распознавание работало некачественно, очень часто определялось не то слово.
                                    • 0
                                      Так это и есть то, что делает проект интересным и отличающимся от тонн подобных игрушек.
                                      Использовать DMA для считывания сигнала с микрофона, например. Описать ваше решение.
                                      Это и придало бы весу статье.
                                      Куда интереснее прочесть про реализацию распознавания, пусть и не такого качественного, как у гугла, чем сотую вариацию на тему «послать данные всемогущему облаку».

                                      Между прочим, есть проект распознавания на АВРке — некачественное, конечно, на уровне команд а не распознавания слов, но все же. На 16-мгц 8-бит АВРке. А тут целый ДСП. Интересно поглядеть на то, как он справится с такими задачами.
                                      • 0
                                        Да, справедливости ради замечу — с практической точки зрения ваша реализация (за исключением USB, это все-таки нужно любыми способами привести в норму, чтобы избавиться от переходника) наверняка куда более ценна, нежели свои велосипеды по распознаванию — потому что, все таки, мелкой ДСП плате тягаться с гугловскими серверами и алгоритмами бессмысленно. И в используемом продукте я бы сам выбрал такой же вариант, потому что важен результат. Так что девайс у вас хороший (только USB прикрутите =) )

                                        А вот статья, конечно, была бы более интересна про реализацию распознавания, очень уж хочется почитать отзывы тех, кто эту DSPшку пощупал с этой точки зрения.

                                        Да, а вы не касались правового вопроса? Допустим вот вы решите производить свою систему умного дома (гипотетическая ситуация) — что в этом случае говорит гугл относительно использования своего сервиса, это приемлемо?
                                        • 0
                                          Правовой вопрос совершенно не рассматривал, так как даже и в мыслях не было что-то продавать. Кроме того, Google может в любой момент изменить протокол связи, так что устройство можно применять только на свой страх и риск.

                                          По правде сказать, UART используется только для демонстрации работы контроллера — во время программирования и отладки я использовал semihosting, а UART — USB преобразователь я активно использовал при отладке работы WIFI-модуля — только так можно наблюдать, как идет процесс обмена данными с контроллером.

                                          USB — это хорошо, но без компьютера бессмысленно. Если я буду делать устройство, действительно являющееся частью умного дома, то компьютера там не будет, и весь код для USB придется выкинуть.
                                          Если уж кому-то и нужны примеры для работы с USB на STM32F4, то можно посмотреть здесь:
                                          Ссылка.

                                          Между прочим, в этом проекте ресурсы контроллера достаточно активно используются — кодирование звука при помощи Speex требует большого числа операций, да и памяти тоже требуется немало, поскольку только кодек использует 7 КБ, а еще есть аудиобуферы, буферы приема информации wifi модуля. Так что на STM32-Discovery запустить не удастся. Такое потянет отладочная плата с установленной stm32f103, но у меня ее нет, да и стоят они достаточно дорого.
                                      • 0
                                        Это на DSP, это лишь дополнительный набор DSP инструкций в ядре мк общего назначения.
                                      • +1
                                        Автору пожелание в усовершенствовании конструкции.
                                        Чтобы не остаться без такой полезной штуки если отключится интернет, воткните в порт USB( у этого контроллера вроде есть поддержка хоста) модем типа «свисток» и будет у вас резервный GPRS/EDGE/3G канал в интернет.
                                        Плюсов огромное количество:
                                        — опыт работы с usb хостом
                                        — опыт запуска TCP/IP
                                        — реверс инджениринг протокола свистка
                                        — занятие простаивающих ресурсов контроллера чем-то полезным
                                        — статья на хабре :-)
                                        • 0
                                          USB модем, это конечно интересно, но на практике обычно используют GSM/3G-модуль.
                                          • 0
                                            Ну так это же скучно, там все внутри уже реализовано, вам только питание подать и по УАРТ команды кидать.
                                            А я вон сколько удовольствия в моем варианте расписал :-)
                                        • +1
                                          Вижу уже не первую подобную статью где используется серве Google для распознавания речи.
                                          Много любителей есть также прикрутить Google к Аsterisk серверу.
                                          Но зачем гонят столько трафика, напрягать Гугле такой ерундой.
                                          Почему-то никто не может предложить использовать, например, CMU Sphinx, песплатный, есть русские акустические и лингвистические модели готовые. Для умного дома тем более у вас ограниченный набор фраз/команд, а не спонтанное распознование как делает Google.
                                          • 0
                                            Потому что не все так просто :)
                                            Акустические модели они, знаете, очень специфичные. И если тупо взять и загрузить их с VoxForge, то в 90% случаев они не заработают как надо в новых условиях (другой микрофон, посторонние шумы).
                                            А проводить адаптацию — это уже шарить надо.
                                          • +2
                                            Чёта с каждым новым сервисом гугла становится всё сыкатней и сыкатней. Понастроишь таких умных домов, потом дыц — америкосы решат, что пора — и каюк. Придёшь домой — а он тебе «ты кто такой? досвиданья» ;)
                                            Автор молодец. Но для умного дома, считаю, надо делать автономные сервисы, ну кроме если тольно внешнего управления.
                                            • +1
                                              Я уж думал и в правду на F4 речь распознают, а тут облом. Но всё равно интересно, работы тоже проделана не малая. Спасибо.
                                              • 0
                                                Я тоже думал, что кто-то либо изобрел мегаИИ, впендюривающийся в скудную оперативку, обслуживаемую МКшкой, или построил вокруг контроллера полноценный компьютер…

                                                Хотя, если взять ARM…
                                                • 0
                                                  >>Хотя, если взять ARM…
                                                  По вашему взят AVR?
                                                  • 0
                                                    Этот слишком дохлый. Надо что-нибудь хотя бы на гигагерц-другой…
                                                  • 0
                                                    Мы тут умудрились на SoC с CPU 20 Mhz + 48 Kb RAM + n Gb NAND flash запихать:
                                                    — реляционную базу данных (полный CRUD-фарш с индексами, joins, транзакциями)
                                                    — веб-сервер с сервлетами на JavaCard (правда эта жава самое узкое место во всём этом)
                                                    И на этом добре крутится вполне приличное веб-приложение.
                                                    Собственно самая алгоритмически навороченая часть ( БД ) занимает всего 8 Kb RAM!
                                                    Тормозов не наблюдается, в полутора десятках таблиц хранится около ста тысяч записей в каждой.
                                                    Так что распознавалку сделать можно если сильно напрячься…
                                                    Но я как и многие подумал что в статье пишут как кто-то этого добился :)
                                                • 0
                                                  Поправлю автора: распознавание голоса и распознавание речи — разные задачи.
                                                  Распознавание голоса — определение человеческого голоса среди других звуков (то есть задача — определить, что человек что-то сказал и отреагировать).
                                                  Распознавание диктора — определение персоны человека по голосу среди других людей.
                                                  Распознавание речи — расшифровка аудиосигнала, перевод речи в текст.
                                                  • 0
                                                    Действительно, я ошибся. Переименовал пост и поправил текст.
                                                  • 0
                                                    По поводу шума — можно попробовать фильтровать данные по частоте и амплитуде — например после записи делать бпф — резать все частоты, не попадающие в интервал человеческого голоса, а также частоты, которые ниже порога определенного
                                                    • 0
                                                      В основном, все бытовые шумы примерно на тех же частотах, что и голос.
                                                    • 0
                                                      Позволяет ли данный WIFI-модуль RN-171 принимать и передавать потоковое аудио?
                                                      • 0
                                                        В каком смысле?
                                                        • 0
                                                          Если вы о программной передаче — то да, в принципе может. Правда, качество звука будет зависеть от выбранного протокола.

                                                          Как раз на базе той же STM32F4-Discovery и RN-171 я делал WIFI радиоприемник, способный принимать данные с серверов Shoutcast. Приемник работал, но иногда звук прерывался или обрывалась связь с сервером, причем была явная зависимость качества звука от расстояния до роутера(при большем расстоянии становится больше потерь пакетов). Если бы я смог узнать, как управлять потоком в Shoutcast, то может быть, удалось бы добиться лучшего качества.
                                                          • 0
                                                            Да, есть желание тоже сделать wi-fi интернет-радио с софтовым декодированием mp3 или aac потока на Cortex M3/M4. Если не жалко, очень хотелось бы взглянуть на исходники вашего проекта. Ещё вопрос, хватит ли у RN-171 пропускной способности и скорости стека для обработки хотябы 92 кбит\с звука. Протокол tcp-ip.
                                                            • 0
                                                              К сожалению, я не смог запустить последнюю версию программы на DISCOVERY, так что пока не могу выложить исходники. Я постараюсь разобраться, из-за чего не работает проект и выложу его, как только смогу.

                                                              Я использовал декодер mp3 вот отсюда: jjmz.free.fr/?p=65
                                                              У меня звук воспроизводился на скорости 128 кбит/с. Однако, как я уже говорил выше, модуль работает на пределе возможностей, так что при слабом сигнале поток прерывается и соединение может разрываться.
                                                              • 0
                                                                Спасибо за помощь, пробовал портировать декодер helix но стабильной работы не получил пока. Может проблема была в антенне? А если внешнюю использовать?
                                                                Заказал себе WiFly Module, ждёмс.
                                                                • 0
                                                                  Я пробовал подпаивать антенну от роутера, немного получше стало, но проблемы остались, так что отпаял ее.
                                                                  • 0
                                                                    Нашел ошибку в программе, исправил ее, так что приемник запустился.
                                                                    Ссылка на исходники: ссылка

                                                                    Вот пример работы приемника:


                                                                    • 0
                                                                      Выглядит очень неплохо) Кстати, в wi-fi модуле есть команда переключения антенны set wlan ext_antenna. По умолчанию включена внутрення чип-антенна (параметр равен 0). В данной модификации её нет и этот параметр должен быть при инициализации установлен в 1. Связь нестабильна т.к. фактически ваша RN-XV сейчас работает без неё. Модификация с разъёмом SMA кажется более практичной, антенну можно скрутить, например, со старого роутера :)
                                                                      • 0
                                                                        По поводу команды цитата из даташита: «This command applies only to RN-131. This command is not applied to the RN-171. Issuing this command on the RN-171 will give an error message: ERR: Bad Args».
                                                                        У нас RN-171 и чип-антенны в нем нет. Так что 0 в данном случае — это внешняя антенна. Когда я перепаивал антенну, то в определенный момент ее контакт отошел, и модуль перестал работать, что свидетельствует о том, что используется именно внешняя антенна.
                                                                      • 0
                                                                        А под какой средой писался проект? Вроде где-то coocox проскакивал в конфигах.
                                                                        P.S. все сообщения в этом топике написаны по просьбе инженера-разработчика. Если у кого есть возможность — пришлите инвайт f_i_l_i_n@list.ru
                                                                        • 0
                                                                          Да, под Coocox. Это связано с тем, что проект был написан на основе этого: jjmz.free.fr/?p=65, а там используется компилятор ARM GCC. Я пробовал скомпилировать код в IAR, но столкнулся с тем, что в IAR совершенно другой обработчик ассемблера.
                                                                          • 0
                                                                            а вот вы бы ещё библиотеки юсб прикрутили от stm), чтоб можно было не только через блютуз передавать
                                                                            • 0
                                                                              Это вы вообще к чему? Какой bluetooth?
                                                                              • 0
                                                                                тьфу, то есть вайфай), это я заработался, это я через блютуз тут передаю)
                                                                                • 0
                                                                                  Ну а USB то куда приделать?
                                                                                  • 0
                                                                                    сжатую инфу в комп перегонять, а там можно уже декодировать и преобразовать в wav файл, в контейнере ogg
                                                                                    • 0
                                                                                      А смысл? Если есть компьютер, то он сам с чем угодно справится, и контроллер уже не нужен.
                                                                                      • 0
                                                                                        ну там же не только звук может писаться, а ещё куча другой инфы и всё на одной платформе, а на компе прога которая всё эту инфу перерабатывает. Или возможно даже в raw писать и по USB сбрасывать, а уже не компе файл формировать, там кстати если я не ошибаюсь ogg контейнер только для сжатых данных speex нужен, а в wav уже могут быть сырые данные. Да вроде так.

                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.