0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>14 авг 2025</li>
2
<ul><li>14 авг 2025</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Изучаем фреймворк и создаём простого голосового помощника.</p>
4
</ul><p>Изучаем фреймворк и создаём простого голосового помощника.</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6
<p>Пишет о сетях, инструментах для разработчиков и языках программирования. Любит готовить, играть в инди‑игры и программировать на Python.</p>
6
<p>Пишет о сетях, инструментах для разработчиков и языках программирования. Любит готовить, играть в инди‑игры и программировать на Python.</p>
7
<p>В этой статье мы рассмотрим фреймворк PyTorch для машинного обучения. Torch - это научная вычислительная среда с поддержкой алгоритмов машинного обучения, которая ориентирована на использование графических процессоров (GPU) для ускорения вычислений. Мы начнём с базовой теории, а затем перейдём к практике: создадим голосового ассистента, который сможет распознавать речь и предоставлять актуальную информацию о погоде.</p>
7
<p>В этой статье мы рассмотрим фреймворк PyTorch для машинного обучения. Torch - это научная вычислительная среда с поддержкой алгоритмов машинного обучения, которая ориентирована на использование графических процессоров (GPU) для ускорения вычислений. Мы начнём с базовой теории, а затем перейдём к практике: создадим голосового ассистента, который сможет распознавать речь и предоставлять актуальную информацию о погоде.</p>
8
<p>Хотя мы не будем подробно разбирать все возможности PyTorch, материал рассчитан не на полных новичков. Для понимания статьи вам нужно знать базовый синтаксис Python, уметь устанавливать библиотеки и запускать код.</p>
8
<p>Хотя мы не будем подробно разбирать все возможности PyTorch, материал рассчитан не на полных новичков. Для понимания статьи вам нужно знать базовый синтаксис Python, уметь устанавливать библиотеки и запускать код.</p>
9
<p><strong>Содержание</strong></p>
9
<p><strong>Содержание</strong></p>
10
<ul><li><a>Кому и для чего нужен PyTorch</a></li>
10
<ul><li><a>Кому и для чего нужен PyTorch</a></li>
11
<li><a>Как устроен PyTorch</a></li>
11
<li><a>Как устроен PyTorch</a></li>
12
<li><a>Создаём голосового ассистента на Python с помощью PyTorch</a></li>
12
<li><a>Создаём голосового ассистента на Python с помощью PyTorch</a></li>
13
</ul><p>PyTorch - это фреймворк с открытым исходным кодом для создания и обучения нейронных сетей на Python. Его часто используют исследователи, специалисты по данным и разработчики ML-систем. Например, команда OpenAI использует PyTorch для разработки новых архитектур нейросетей, а инженеры Uber и Netflix - для создания своих рекомендательных систем.</p>
13
</ul><p>PyTorch - это фреймворк с открытым исходным кодом для создания и обучения нейронных сетей на Python. Его часто используют исследователи, специалисты по данным и разработчики ML-систем. Например, команда OpenAI использует PyTorch для разработки новых архитектур нейросетей, а инженеры Uber и Netflix - для создания своих рекомендательных систем.</p>
14
<p>Одно из главных преимуществ PyTorch в том, что он позволяет быстро создавать модели машинного обучения разной сложности для всевозможных задач. Для этого фреймворк включает библиотеку готовых функциональных блоков, предобученные модели и оптимизированные алгоритмы обучения.</p>
14
<p>Одно из главных преимуществ PyTorch в том, что он позволяет быстро создавать модели машинного обучения разной сложности для всевозможных задач. Для этого фреймворк включает библиотеку готовых функциональных блоков, предобученные модели и оптимизированные алгоритмы обучения.</p>
15
<p>Например, вы можете использовать модуль<a>torchvision</a>для распознавания изображений или библиотеку<a>transformers</a>для обработки текста. Такой подход значительно сокращает время разработки и избавляет от необходимости писать код с нуля. То есть вы можете сосредоточиться на задаче и не отвлекаться на настройку базовой инфраструктуры модели.</p>
15
<p>Например, вы можете использовать модуль<a>torchvision</a>для распознавания изображений или библиотеку<a>transformers</a>для обработки текста. Такой подход значительно сокращает время разработки и избавляет от необходимости писать код с нуля. То есть вы можете сосредоточиться на задаче и не отвлекаться на настройку базовой инфраструктуры модели.</p>
16
<p>Если вы новичок в машинном обучении, то PyTorch можно представить как конструктор LEGO для создания моделей. В нём есть базовые "кубики" и готовые модули, которые можно легко комбинировать по инструкции или создавать собственные архитектуры. Кроме того, PyTorch позволяет менять "схему сборки" прямо во время работы: если определённая часть сети работает неэффективно, её можно модифицировать без перестройки всей модели.</p>
16
<p>Если вы новичок в машинном обучении, то PyTorch можно представить как конструктор LEGO для создания моделей. В нём есть базовые "кубики" и готовые модули, которые можно легко комбинировать по инструкции или создавать собственные архитектуры. Кроме того, PyTorch позволяет менять "схему сборки" прямо во время работы: если определённая часть сети работает неэффективно, её можно модифицировать без перестройки всей модели.</p>
17
<p>А если вы уже работали с библиотекой NumPy, то PyTorch покажется вам во многом знакомым: в нём тоже можно выполнять привычные операции с данными и использовать похожий синтаксис. Например, операция вычисления среднего значения tensor.mean() в PyTorch по синтаксису и функциональности полностью аналогична array.mean() в NumPy.</p>
17
<p>А если вы уже работали с библиотекой NumPy, то PyTorch покажется вам во многом знакомым: в нём тоже можно выполнять привычные операции с данными и использовать похожий синтаксис. Например, операция вычисления среднего значения tensor.mean() в PyTorch по синтаксису и функциональности полностью аналогична array.mean() в NumPy.</p>
18
<p>Главное отличие в том, что PyTorch выполняет вычисления не только на процессоре (CPU), как NumPy, но и на графическом ускорителе (GPU). А это означает, что по сравнению с вычислениями только на CPU вы можете ускорить работу в 10-50 раз, особенно если речь идёт о тяжёлых задачах - например, при обработке видео, работе с большими объёмами данных и обучении моделей.</p>
18
<p>Главное отличие в том, что PyTorch выполняет вычисления не только на процессоре (CPU), как NumPy, но и на графическом ускорителе (GPU). А это означает, что по сравнению с вычислениями только на CPU вы можете ускорить работу в 10-50 раз, особенно если речь идёт о тяжёлых задачах - например, при обработке видео, работе с большими объёмами данных и обучении моделей.</p>
19
<p>Фреймворк PyTorch основан на нескольких ключевых компонентах - тензорах, вычислительных графах и механизме автоматического дифференцирования. Эти компоненты работают в связке, и их можно представить как фабрику: тензоры - это сырьё (данные), вычислительный граф - чертёж и конвейер обработки, а автоматическое дифференцирование - система контроля качества, которая определяет, что нужно изменить для улучшения результата.</p>
19
<p>Фреймворк PyTorch основан на нескольких ключевых компонентах - тензорах, вычислительных графах и механизме автоматического дифференцирования. Эти компоненты работают в связке, и их можно представить как фабрику: тензоры - это сырьё (данные), вычислительный граф - чертёж и конвейер обработки, а автоматическое дифференцирование - система контроля качества, которая определяет, что нужно изменить для улучшения результата.</p>
20
<p><strong>Тензоры</strong> - это многомерные массивы данных, которые оптимизированы для параллельных вычислений на GPU и могут иметь любое количество измерений. Например, одномерный тензор - это вектор [1, 2, 3], двухмерный - матрица [[1, 2], [3, 4]], а трёхмерный - "куб" данных [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]. Для удобства представляйте тензор как таблицу чисел, которую можно расширять в длину, ширину и глубину.</p>
20
<p><strong>Тензоры</strong> - это многомерные массивы данных, которые оптимизированы для параллельных вычислений на GPU и могут иметь любое количество измерений. Например, одномерный тензор - это вектор [1, 2, 3], двухмерный - матрица [[1, 2], [3, 4]], а трёхмерный - "куб" данных [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]. Для удобства представляйте тензор как таблицу чисел, которую можно расширять в длину, ширину и глубину.</p>
21
<p><strong>Вычислительные графы</strong> - архитектурная схема, которая отображает последовательность и взаимосвязь операций над данными. В такой схеме узлы представляют различные математические операции, а рёбра - потоки данных-тензоров. Этот подход позволяет наглядно проследить, как данные трансформируются от входного слоя нейросети до финального результата.</p>
21
<p><strong>Вычислительные графы</strong> - архитектурная схема, которая отображает последовательность и взаимосвязь операций над данными. В такой схеме узлы представляют различные математические операции, а рёбра - потоки данных-тензоров. Этот подход позволяет наглядно проследить, как данные трансформируются от входного слоя нейросети до финального результата.</p>
22
<p>Например, выражение c = a + b в PyTorch можно представить как небольшой граф: два входа с данными (a и b) подключаются к узлу операции "сложение", а результат (c) идёт на выход. Такая схема позволяет фреймворку отслеживать порядок и взаимосвязь всех операций. Поэтому, если вы измените входные данные или захотите пересчитать результат, PyTorch просто повторит те же шаги и выдаст обновлённый ответ.</p>
22
<p>Например, выражение c = a + b в PyTorch можно представить как небольшой граф: два входа с данными (a и b) подключаются к узлу операции "сложение", а результат (c) идёт на выход. Такая схема позволяет фреймворку отслеживать порядок и взаимосвязь всех операций. Поэтому, если вы измените входные данные или захотите пересчитать результат, PyTorch просто повторит те же шаги и выдаст обновлённый ответ.</p>
23
<p><strong>Механизм автоматического дифференцирования</strong> - это встроенная в PyTorch система, которая автоматически вычисляет, как меняются выходные значения модели при изменении её параметров. Эти изменения называют градиентами. Благодаря этому механизму нейросеть сама определяет, какие параметры и как нужно скорректировать для улучшения результата - программисту при этом не нужно вручную считать сложные производные.</p>
23
<p><strong>Механизм автоматического дифференцирования</strong> - это встроенная в PyTorch система, которая автоматически вычисляет, как меняются выходные значения модели при изменении её параметров. Эти изменения называют градиентами. Благодаря этому механизму нейросеть сама определяет, какие параметры и как нужно скорректировать для улучшения результата - программисту при этом не нужно вручную считать сложные производные.</p>
24
<p>К примеру, если нейросеть для распознавания изображений перепутала кошку с собакой, этот механизм рассчитает веса нейронов и то, насколько нужно их изменить, чтобы в следующий раз повысить точность распознавания.</p>
24
<p>К примеру, если нейросеть для распознавания изображений перепутала кошку с собакой, этот механизм рассчитает веса нейронов и то, насколько нужно их изменить, чтобы в следующий раз повысить точность распознавания.</p>
25
<p>В следующем разделе мы будем создавать голосового ассистента. В этом проекте тензоры, вычислительные графы и механизм автоматического дифференцирования будут работать примерно в таком порядке:</p>
25
<p>В следующем разделе мы будем создавать голосового ассистента. В этом проекте тензоры, вычислительные графы и механизм автоматического дифференцирования будут работать примерно в таком порядке:</p>
26
<ul><li><strong>Преобразование звука в данные</strong> - аудиосигнал конвертируется в спектрограммы и последовательности численных значений (тензоров), которые отражают частотные и временные характеристики речи.</li>
26
<ul><li><strong>Преобразование звука в данные</strong> - аудиосигнал конвертируется в спектрограммы и последовательности численных значений (тензоров), которые отражают частотные и временные характеристики речи.</li>
27
<li><strong>Обработка в вычислительном графе</strong> - тензоры проходят через цепочку операций: сначала из них извлекаются звуковые признаки, затем происходит распознавание слов, а в конце формируется ответ.</li>
27
<li><strong>Обработка в вычислительном графе</strong> - тензоры проходят через цепочку операций: сначала из них извлекаются звуковые признаки, затем происходит распознавание слов, а в конце формируется ответ.</li>
28
<li><strong>Анализ ошибки</strong> - если модель распознала речь неправильно, PyTorch вычисляет, какие параметры (веса) необходимо скорректировать.</li>
28
<li><strong>Анализ ошибки</strong> - если модель распознала речь неправильно, PyTorch вычисляет, какие параметры (веса) необходимо скорректировать.</li>
29
<li><strong>Обновление модели </strong>- PyTorch корректирует параметры модели, чтобы повысить точность распознавания при следующих попытках.</li>
29
<li><strong>Обновление модели </strong>- PyTorch корректирует параметры модели, чтобы повысить точность распознавания при следующих попытках.</li>
30
</ul><p>Благодаря такому взаимодействию компонентов модель может постепенно обучаться и точнее распознавать речь. Переходим к сборке нашего ассистента.</p>
30
</ul><p>Благодаря такому взаимодействию компонентов модель может постепенно обучаться и точнее распознавать речь. Переходим к сборке нашего ассистента.</p>
31
<p>В этом разделе мы поработаем с API, подключим внешние библиотеки и напишем несколько функций для запуска голосового ассистента. Это будет простая программа, но вы можете доработать её и добавить функции, которые сочтёте полезными. Например, в нашей версии ассистент не умеет включать музыку, однако вы можете это исправить или реализовать другую команду.</p>
31
<p>В этом разделе мы поработаем с API, подключим внешние библиотеки и напишем несколько функций для запуска голосового ассистента. Это будет простая программа, но вы можете доработать её и добавить функции, которые сочтёте полезными. Например, в нашей версии ассистент не умеет включать музыку, однако вы можете это исправить или реализовать другую команду.</p>
32
<p>Перед написанием кода перейдите на сайт<a>openweathermap.org</a>, где собраны данные о погоде по всему миру. Мы будем использовать его API, чтобы голосовой помощник мог отвечать на вопрос "Какая сейчас погода?" в заданном городе. При желании вы можете выбрать другой похожий ресурс.</p>
32
<p>Перед написанием кода перейдите на сайт<a>openweathermap.org</a>, где собраны данные о погоде по всему миру. Мы будем использовать его API, чтобы голосовой помощник мог отвечать на вопрос "Какая сейчас погода?" в заданном городе. При желании вы можете выбрать другой похожий ресурс.</p>
33
<p>После регистрации на сайте зайдите в личный кабинет, найдите раздел "<strong>My API Keys</strong>" и скопируйте сгенерированный ключ - это строка из букв и цифр:</p>
33
<p>После регистрации на сайте зайдите в личный кабинет, найдите раздел "<strong>My API Keys</strong>" и скопируйте сгенерированный ключ - это строка из букв и цифр:</p>
34
Пример API-ключа в личном кабинете сервиса<a>OpenWeatherMap</a>. Обратите внимание: после регистрации активация вашего API-ключа может занять несколько часов<em>Скриншот:<a>OpenWeatherMap</a> / Skillbox Media</em><p>Полученный API-ключ необходимо сохранить в переменной окружения WEATHER_API_KEY. Переменную окружения можно создать временно для текущей сессии терминала или постоянно. Для учебного проекта достаточно временного варианта, поэтому введите в Windows PowerShell две команды:</p>
34
Пример API-ключа в личном кабинете сервиса<a>OpenWeatherMap</a>. Обратите внимание: после регистрации активация вашего API-ключа может занять несколько часов<em>Скриншот:<a>OpenWeatherMap</a> / Skillbox Media</em><p>Полученный API-ключ необходимо сохранить в переменной окружения WEATHER_API_KEY. Переменную окружения можно создать временно для текущей сессии терминала или постоянно. Для учебного проекта достаточно временного варианта, поэтому введите в Windows PowerShell две команды:</p>
35
# Устанавливаем переменную окружения только для текущей сессии $env:WEATHER_API_KEY="ВАШ_КЛЮЧ" # Проверяем, что ключ установлен echo $env:WEATHER_API_KEY # Если ключ успешно сохранён, в ответ отобразится введённое значение - ваш API-ключ<p>По-хорошему, на подготовительном этапе нам следовало бы обучить модель с нуля, чтобы она адаптировалась именно под наши задачи. Однако этот процесс требует времени, значительных вычислительных ресурсов и крупных наборов размеченных аудиозаписей. Чтобы упростить задачу, мы используем готовую модель распознавания речи<a>Wav2Vec 2.0</a> в русской версии - jonatasgrosman/wav2vec2-large-xlsr-53-russian с платформы<a>Hugging Face</a>.</p>
35
# Устанавливаем переменную окружения только для текущей сессии $env:WEATHER_API_KEY="ВАШ_КЛЮЧ" # Проверяем, что ключ установлен echo $env:WEATHER_API_KEY # Если ключ успешно сохранён, в ответ отобразится введённое значение - ваш API-ключ<p>По-хорошему, на подготовительном этапе нам следовало бы обучить модель с нуля, чтобы она адаптировалась именно под наши задачи. Однако этот процесс требует времени, значительных вычислительных ресурсов и крупных наборов размеченных аудиозаписей. Чтобы упростить задачу, мы используем готовую модель распознавания речи<a>Wav2Vec 2.0</a> в русской версии - jonatasgrosman/wav2vec2-large-xlsr-53-russian с платформы<a>Hugging Face</a>.</p>
36
<p>Для работы нам понадобится несколько внешних библиотек, которые можно установить одной командой:</p>
36
<p>Для работы нам понадобится несколько внешних библиотек, которые можно установить одной командой:</p>
37
pip install torch torchaudio transformers pyaudio pyttsx3 requests numpy<p>Кратко разбираемся, что и для чего нужно:</p>
37
pip install torch torchaudio transformers pyaudio pyttsx3 requests numpy<p>Кратко разбираемся, что и для чего нужно:</p>
38
<ul><li><a>PyTorch</a> - для запуска и обработки нейросети,</li>
38
<ul><li><a>PyTorch</a> - для запуска и обработки нейросети,</li>
39
<li><a>Torchaudio</a> - для работы со звуковыми файлами (ресемплинга),</li>
39
<li><a>Torchaudio</a> - для работы со звуковыми файлами (ресемплинга),</li>
40
<li><a>Transformers</a> - для загрузки предобученной модели Wav2Vec 2.0,</li>
40
<li><a>Transformers</a> - для загрузки предобученной модели Wav2Vec 2.0,</li>
41
<li><a>PyAudio</a> - для записи звука с микрофона,</li>
41
<li><a>PyAudio</a> - для записи звука с микрофона,</li>
42
<li><a>pyttsx3</a> - для синтеза речи (озвучивания),</li>
42
<li><a>pyttsx3</a> - для синтеза речи (озвучивания),</li>
43
<li><a>Requests</a> - для выполнения HTTP-запросов к погодному API,</li>
43
<li><a>Requests</a> - для выполнения HTTP-запросов к погодному API,</li>
44
<li><a>NumPy</a> - для работы с аудиоданными при чтении WAV.</li>
44
<li><a>NumPy</a> - для работы с аудиоданными при чтении WAV.</li>
45
</ul><p>Для работы будем использовать редактор VS Code, но вы можете выбрать любой другой. Создайте папку для проекта и как-то её назовите - например, voice_assistant. Внутри этой папки создайте файл с расширением .py - у нас это будет assistant.py. Дополнительно вы можете создать виртуальное окружение, чтобы изолировать зависимости проекта.</p>
45
</ul><p>Для работы будем использовать редактор VS Code, но вы можете выбрать любой другой. Создайте папку для проекта и как-то её назовите - например, voice_assistant. Внутри этой папки создайте файл с расширением .py - у нас это будет assistant.py. Дополнительно вы можете создать виртуальное окружение, чтобы изолировать зависимости проекта.</p>
46
<p>Если что-то не работает, убедитесь, что у вас на компьютере установлена актуальная версия Python (3.8 или выше). Проверить это можно командой:</p>
46
<p>Если что-то не работает, убедитесь, что у вас на компьютере установлена актуальная версия Python (3.8 или выше). Проверить это можно командой:</p>
47
python --version<p>Сначала мы импортируем библиотеки для работы со звуком, нейросетью и выполнения интернет-запросов. После этого загрузим модель Wav2Vec 2.0, которая сможет преобразовать записанное с микрофона аудио в текст.</p>
47
python --version<p>Сначала мы импортируем библиотеки для работы со звуком, нейросетью и выполнения интернет-запросов. После этого загрузим модель Wav2Vec 2.0, которая сможет преобразовать записанное с микрофона аудио в текст.</p>
48
<p>Дальше мы создадим несколько функций: одна будет записывать звук, вторая - преобразовывать его в текст, третья - получать прогноз погоды, а четвёртая - озвучивать ответ. Также у нас будет отдельная функция для обработки команд: она анализирует распознанный текст и определяет, что сделать - ответить приветствием, сообщить погоду или сообщить, что запрос не понят.</p>
48
<p>Дальше мы создадим несколько функций: одна будет записывать звук, вторая - преобразовывать его в текст, третья - получать прогноз погоды, а четвёртая - озвучивать ответ. Также у нас будет отдельная функция для обработки команд: она анализирует распознанный текст и определяет, что сделать - ответить приветствием, сообщить погоду или сообщить, что запрос не понят.</p>
49
<p>Вся логика работает в бесконечном цикле: после запуска ассистент ждёт, когда вы нажмёте<strong>Enter</strong>, затем записывает произнесённую фразу, преобразует её в текст, анализирует команду, озвучивает ответ и прописывает его текстом.</p>
49
<p>Вся логика работает в бесконечном цикле: после запуска ассистент ждёт, когда вы нажмёте<strong>Enter</strong>, затем записывает произнесённую фразу, преобразует её в текст, анализирует команду, озвучивает ответ и прописывает его текстом.</p>
50
import os import wave import requests import numpy as np import torch import torchaudio import pyaudio import pyttsx3 from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor # Название нашей модели и настройки MODEL_NAME = "jonatasgrosman/wav2vec2-large-xlsr-53-russian" current_location = "Москва" # Город по умолчанию DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Загружаем процессор и модель распознавания речи processor = Wav2Vec2Processor.from_pretrained(MODEL_NAME) model = Wav2Vec2ForCTC.from_pretrained(MODEL_NAME).to(DEVICE) model.eval() # Добавляем запись аудио с микрофона в файл def record_audio(filename: str, duration: int = 5, sample_rate: int = 16000) -> None: p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paInt16, channels=1, rate=sample_rate, input=True, frames_per_buffer=1024) print("Запись началась...") frames = [stream.read(1024) for _ in range(int(sample_rate / 1024 * duration))] print("Запись завершена.") stream.stop_stream() stream.close() p.terminate() # Сохраняем аудиоданные в WAV with wave.open(filename, "wb") as wf: wf.setnchannels(1) wf.setsampwidth(p.get_sample_size(pyaudio.paInt16)) wf.setframerate(sample_rate) wf.writeframes(b"".join(frames)) # Настраиваем распознавание речи из WAV-файла def transcribe_audio(filename: str) -> str: try: with wave.open(filename, "rb") as wf: n_channels = wf.getnchannels() sampwidth = wf.getsampwidth() sr = wf.getframerate() n_frames = wf.getnframes() raw = wf.readframes(n_frames) except (wave.Error, FileNotFoundError): return "" if n_channels != 1 or sampwidth != 2: return "" # Преобразуем в float32 [-1, 1] audio = np.frombuffer(raw, dtype=np.int16).astype(np.float32) / 32768.0 # Проводим ресемплинг до 16 кГц, если нужно if sr != 16000: tensor = torch.from_numpy(audio).unsqueeze(0) tensor = torchaudio.functional.resample(tensor, orig_freq=sr, new_freq=16000) audio = tensor.squeeze(0).numpy() sr = 16000 # Запускаем модель для получения текста inputs = processor(audio, sampling_rate=sr, return_tensors="pt", padding=True) input_values = inputs.input_values.to(DEVICE) attention_mask = inputs.attention_mask.to(DEVICE) if "attention_mask" in inputs else None with torch.no_grad(): logits = model(input_values, attention_mask=attention_mask).logits ids = torch.argmax(logits, dim=-1) return processor.batch_decode(ids)[0].strip() # Получаем прогноз погоды по API def get_weather_text(city: str) -> str: api_key = os.environ.get("WEATHER_API_KEY") if not api_key: return "API-ключ не найден. Установите переменную окружения WEATHER_API_KEY." url = "https://api.openweathermap.org/data/2.5/weather" params = {"q": city, "appid": api_key, "lang": "ru", "units": "metric"} try: r = requests.get(url, params=params, timeout=10) data = r.json() if data.get("cod") == 200: desc = data["weather"][0]["description"] temp = data["main"]["temp"] return f"Сейчас в {city} {desc}, температура {temp}°C." msg = data.get("message") or "Не удалось получить данные." return f"Не удалось найти погоду для {city}. {msg}" except requests.RequestException: return "Не удалось получить данные о погоде." # Добавляем синтез речи (озвучку) def speak(text: str) -> None: engine = pyttsx3.init() engine.say(text) engine.runAndWait() # Настраиваем обработку пользовательских команд def process_command(command: str) -> str: global current_location cmd = command.lower().strip() if not cmd: return "Не расслышал команду. Повторите, пожалуйста." if "установить местоположение" in cmd: city = cmd.split("установить местоположение", 1)[-1].strip().title() if city: current_location = city return f"Местоположение установлено на {city}." return "Не понял город. Скажите: 'установить местоположение <город>'." if "какая погода" in cmd or "погода" in cmd: return get_weather_text(current_location) if "привет" in cmd: return "Привет!" if "включи музыку" in cmd: return "Включаю музыку. (Демо.)" return "Извините, я не понял команду." # Формируем основной цикл работы ассистента def main(): speak(f"Голосовой помощник запущен. Текущее местоположение: {current_location}.") print("Нажмите Enter, чтобы начать запись...") while True: input() # ждём нажатия Enter record_audio("command.wav") # записываем речь text = transcribe_audio("command.wav") # распознаём print("Вы сказали:", text if text else "(пусто)") answer = process_command(text) # получаем ответ print("Ответ:", answer) speak(answer) # озвучиваем ответ if __name__ == "__main__": main()<p>Чтобы запустить голосового помощника, откройте терминал внутри редактора и выполните команду с указанием имени файла:</p>
50
import os import wave import requests import numpy as np import torch import torchaudio import pyaudio import pyttsx3 from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor # Название нашей модели и настройки MODEL_NAME = "jonatasgrosman/wav2vec2-large-xlsr-53-russian" current_location = "Москва" # Город по умолчанию DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Загружаем процессор и модель распознавания речи processor = Wav2Vec2Processor.from_pretrained(MODEL_NAME) model = Wav2Vec2ForCTC.from_pretrained(MODEL_NAME).to(DEVICE) model.eval() # Добавляем запись аудио с микрофона в файл def record_audio(filename: str, duration: int = 5, sample_rate: int = 16000) -> None: p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paInt16, channels=1, rate=sample_rate, input=True, frames_per_buffer=1024) print("Запись началась...") frames = [stream.read(1024) for _ in range(int(sample_rate / 1024 * duration))] print("Запись завершена.") stream.stop_stream() stream.close() p.terminate() # Сохраняем аудиоданные в WAV with wave.open(filename, "wb") as wf: wf.setnchannels(1) wf.setsampwidth(p.get_sample_size(pyaudio.paInt16)) wf.setframerate(sample_rate) wf.writeframes(b"".join(frames)) # Настраиваем распознавание речи из WAV-файла def transcribe_audio(filename: str) -> str: try: with wave.open(filename, "rb") as wf: n_channels = wf.getnchannels() sampwidth = wf.getsampwidth() sr = wf.getframerate() n_frames = wf.getnframes() raw = wf.readframes(n_frames) except (wave.Error, FileNotFoundError): return "" if n_channels != 1 or sampwidth != 2: return "" # Преобразуем в float32 [-1, 1] audio = np.frombuffer(raw, dtype=np.int16).astype(np.float32) / 32768.0 # Проводим ресемплинг до 16 кГц, если нужно if sr != 16000: tensor = torch.from_numpy(audio).unsqueeze(0) tensor = torchaudio.functional.resample(tensor, orig_freq=sr, new_freq=16000) audio = tensor.squeeze(0).numpy() sr = 16000 # Запускаем модель для получения текста inputs = processor(audio, sampling_rate=sr, return_tensors="pt", padding=True) input_values = inputs.input_values.to(DEVICE) attention_mask = inputs.attention_mask.to(DEVICE) if "attention_mask" in inputs else None with torch.no_grad(): logits = model(input_values, attention_mask=attention_mask).logits ids = torch.argmax(logits, dim=-1) return processor.batch_decode(ids)[0].strip() # Получаем прогноз погоды по API def get_weather_text(city: str) -> str: api_key = os.environ.get("WEATHER_API_KEY") if not api_key: return "API-ключ не найден. Установите переменную окружения WEATHER_API_KEY." url = "https://api.openweathermap.org/data/2.5/weather" params = {"q": city, "appid": api_key, "lang": "ru", "units": "metric"} try: r = requests.get(url, params=params, timeout=10) data = r.json() if data.get("cod") == 200: desc = data["weather"][0]["description"] temp = data["main"]["temp"] return f"Сейчас в {city} {desc}, температура {temp}°C." msg = data.get("message") or "Не удалось получить данные." return f"Не удалось найти погоду для {city}. {msg}" except requests.RequestException: return "Не удалось получить данные о погоде." # Добавляем синтез речи (озвучку) def speak(text: str) -> None: engine = pyttsx3.init() engine.say(text) engine.runAndWait() # Настраиваем обработку пользовательских команд def process_command(command: str) -> str: global current_location cmd = command.lower().strip() if not cmd: return "Не расслышал команду. Повторите, пожалуйста." if "установить местоположение" in cmd: city = cmd.split("установить местоположение", 1)[-1].strip().title() if city: current_location = city return f"Местоположение установлено на {city}." return "Не понял город. Скажите: 'установить местоположение <город>'." if "какая погода" in cmd or "погода" in cmd: return get_weather_text(current_location) if "привет" in cmd: return "Привет!" if "включи музыку" in cmd: return "Включаю музыку. (Демо.)" return "Извините, я не понял команду." # Формируем основной цикл работы ассистента def main(): speak(f"Голосовой помощник запущен. Текущее местоположение: {current_location}.") print("Нажмите Enter, чтобы начать запись...") while True: input() # ждём нажатия Enter record_audio("command.wav") # записываем речь text = transcribe_audio("command.wav") # распознаём print("Вы сказали:", text if text else "(пусто)") answer = process_command(text) # получаем ответ print("Ответ:", answer) speak(answer) # озвучиваем ответ if __name__ == "__main__": main()<p>Чтобы запустить голосового помощника, откройте терминал внутри редактора и выполните команду с указанием имени файла:</p>
51
python assistant.py<p>Подождите около 20 секунд, пока ассистент загрузит модель и поприветствует вас. После этого нажмите<strong>Enter</strong>и попробуйте с ним пообщаться. Иногда при запросе погоды ассистент может не обнаружить API-ключ. В таком случае убедитесь, что терминал открыт и сессия всё ещё активна. Попробуйте перезапустить редактор. Если это не поможет, введите ключ прямо в терминале редактора и затем снова запустите голосового ассистента.</p>
51
python assistant.py<p>Подождите около 20 секунд, пока ассистент загрузит модель и поприветствует вас. После этого нажмите<strong>Enter</strong>и попробуйте с ним пообщаться. Иногда при запросе погоды ассистент может не обнаружить API-ключ. В таком случае убедитесь, что терминал открыт и сессия всё ещё активна. Попробуйте перезапустить редактор. Если это не поможет, введите ключ прямо в терминале редактора и затем снова запустите голосового ассистента.</p>
52
Пример работы голосового ассистента на Python. На команду "Привет!" помощник отвечает "Привет!", на "Включи музыку" - "Включаю музыку", но не включает её, так как это лишь демонстрация. На запрос "Какая погода?" он сообщает погоду в Москве<em>Скриншот:<a>Visual Studio Code</a> / Skillbox Media</em><a><p>Нейросети</p>
52
Пример работы голосового ассистента на Python. На команду "Привет!" помощник отвечает "Привет!", на "Включи музыку" - "Включаю музыку", но не включает её, так как это лишь демонстрация. На запрос "Какая погода?" он сообщает погоду в Москве<em>Скриншот:<a>Visual Studio Code</a> / Skillbox Media</em><a><p>Нейросети</p>
53
<ul><li>38+ топ-нейросетей в одном курсе: ChatGPT, Midjourney, StableDiffusion, DALL-E 3, Gen-3, Kling, Luma, Suno и другие</li>
53
<ul><li>38+ топ-нейросетей в одном курсе: ChatGPT, Midjourney, StableDiffusion, DALL-E 3, Gen-3, Kling, Luma, Suno и другие</li>
54
<li>190+ готовых промптов, чтобы быстрее решать задачи</li>
54
<li>190+ готовых промптов, чтобы быстрее решать задачи</li>
55
<li>Практика на реальных кейсах и 10 проектов в портфолио</li>
55
<li>Практика на реальных кейсах и 10 проектов в портфолио</li>
56
<li>Бессрочный доступ с ежемесячными обновлениями</li>
56
<li>Бессрочный доступ с ежемесячными обновлениями</li>
57
</ul><p>Узнать о курсе</p>
57
</ul><p>Узнать о курсе</p>
58
</a><a>Практический курс: "Нейросети" Узнать о курсе</a>
58
</a><a>Практический курс: "Нейросети" Узнать о курсе</a>