15 KiB
Перевод речи - Виртуальное IoT-устройство
В этой части урока вы напишете код для перевода речи при преобразовании в текст с использованием службы распознавания речи, а затем переведете текст с помощью службы Translator перед генерацией голосового ответа.
Использование службы распознавания речи для перевода речи
Служба распознавания речи может не только преобразовывать речь в текст на том же языке, но и переводить результат на другие языки.
Задача - использование службы распознавания речи для перевода речи
-
Откройте проект
smart-timer
в VS Code и убедитесь, что виртуальная среда загружена в терминале. -
Добавьте следующие инструкции импорта ниже существующих импортов:
from azure.cognitiveservices import speech from azure.cognitiveservices.speech.translation import SpeechTranslationConfig, TranslationRecognizer import requests
Это импортирует классы, используемые для перевода речи, и библиотеку
requests
, которая будет использоваться для вызова службы Translator позже в этом уроке. -
Ваш умный таймер будет настроен на два языка: язык сервера, который использовался для обучения LUIS (тот же язык также используется для создания сообщений для общения с пользователем), и язык, на котором говорит пользователь. Обновите переменную
language
, чтобы указать язык, на котором будет говорить пользователь, и добавьте новую переменнуюserver_language
для языка, использованного для обучения LUIS:language = '<user language>' server_language = '<server language>'
Замените
<user language>
на имя локали языка, на котором вы будете говорить, например,fr-FR
для французского илиzn-HK
для кантонского.Замените
<server language>
на имя локали языка, использованного для обучения LUIS.Вы можете найти список поддерживаемых языков и их имена локалей в документации о поддержке языков и голосов на сайте Microsoft.
💁 Если вы не говорите на нескольких языках, вы можете использовать такие сервисы, как Bing Translate или Google Translate, чтобы перевести с вашего предпочтительного языка на выбранный вами язык. Эти сервисы могут воспроизводить аудио переведенного текста. Учтите, что распознаватель речи может игнорировать некоторый аудиовывод с вашего устройства, поэтому вам может понадобиться дополнительное устройство для воспроизведения переведенного текста.
Например, если вы обучили LUIS на английском языке, но хотите использовать французский как язык пользователя, вы можете перевести такие предложения, как "установить таймер на 2 минуты и 27 секунд" с английского на французский с помощью Bing Translate, а затем использовать кнопку Listen translation, чтобы произнести перевод в микрофон.
-
Замените объявления
recognizer_config
иrecognizer
следующим:translation_config = SpeechTranslationConfig(subscription=speech_api_key, region=location, speech_recognition_language=language, target_languages=(language, server_language)) recognizer = TranslationRecognizer(translation_config=translation_config)
Это создает конфигурацию перевода для распознавания речи на языке пользователя и создания переводов на язык пользователя и сервера. Затем эта конфигурация используется для создания переводчика-распознавателя — распознавателя речи, который может переводить результат распознавания речи на несколько языков.
💁 Оригинальный язык должен быть указан в
target_languages
, иначе вы не получите никаких переводов. -
Обновите функцию
recognized
, заменив весь ее содержимое следующим:if args.result.reason == speech.ResultReason.TranslatedSpeech: language_match = next(l for l in args.result.translations if server_language.lower().startswith(l.lower())) text = args.result.translations[language_match] if (len(text) > 0): print(f'Translated text: {text}') message = Message(json.dumps({ 'speech': text })) device_client.send_message(message)
Этот код проверяет, был ли вызвано событие распознавания из-за перевода речи (это событие может быть вызвано в других случаях, например, когда речь распознана, но не переведена). Если речь была переведена, он находит перевод в словаре
args.result.translations
, который соответствует языку сервера.Словарь
args.result.translations
использует ключи, основанные на части языка из настройки локали, а не на всей настройке. Например, если вы запросите перевод наfr-FR
для французского, словарь будет содержать запись дляfr
, а неfr-FR
.Переведенный текст затем отправляется в IoT Hub.
-
Запустите этот код, чтобы протестировать переводы. Убедитесь, что ваше приложение-функция работает, и запросите таймер на языке пользователя, либо говоря на этом языке самостоятельно, либо используя приложение для перевода.
(.venv) ➜ smart-timer python app.py Connecting Connected Translated text: Set a timer of 2 minutes and 27 seconds.
Перевод текста с использованием службы Translator
Служба распознавания речи не поддерживает перевод текста обратно в речь, вместо этого вы можете использовать службу Translator для перевода текста. У этой службы есть REST API, который вы можете использовать для перевода текста.
Задача - использование ресурса Translator для перевода текста
-
Добавьте ключ API Translator ниже
speech_api_key
:translator_api_key = '<key>'
Замените
<key>
на ключ API для вашего ресурса службы Translator. -
Над функцией
say
определите функциюtranslate_text
, которая будет переводить текст с языка сервера на язык пользователя:def translate_text(text):
-
Внутри этой функции определите URL и заголовки для вызова REST API:
url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0' headers = { 'Ocp-Apim-Subscription-Key': translator_api_key, 'Ocp-Apim-Subscription-Region': location, 'Content-type': 'application/json' }
URL для этого API не зависит от местоположения, вместо этого местоположение передается в виде заголовка. Ключ API используется напрямую, поэтому, в отличие от службы распознавания речи, нет необходимости получать токен доступа через API выдачи токенов.
-
Ниже определите параметры и тело для вызова:
params = { 'from': server_language, 'to': language } body = [{ 'text' : text }]
params
определяет параметры для передачи в вызов API, передавая исходный и целевой языки. Этот вызов будет переводить текст с языкаfrom
на языкto
.body
содержит текст для перевода. Это массив, так как несколько блоков текста могут быть переведены в одном вызове. -
Выполните вызов REST API и получите ответ:
response = requests.post(url, headers=headers, params=params, json=body)
Ответ, который возвращается, представляет собой JSON-массив, содержащий один элемент с переводами. Этот элемент имеет массив для переводов всех элементов, переданных в теле.
[ { "translations": [ { "text": "Chronométrant votre minuterie de 2 minutes 27 secondes.", "to": "fr" } ] } ]
-
Верните свойство
text
из первого перевода первого элемента массива:return response.json()[0]['translations'][0]['text']
-
Обновите функцию
say
, чтобы перевести текст перед генерацией SSML:print('Original:', text) text = translate_text(text) print('Translated:', text)
Этот код также выводит оригинальную и переведенную версии текста в консоль.
-
Запустите ваш код. Убедитесь, что ваше приложение-функция работает, и запросите таймер на языке пользователя, либо говоря на этом языке самостоятельно, либо используя приложение для перевода.
(.venv) ➜ smart-timer python app.py Connecting Connected Translated text: Set a timer of 2 minutes and 27 seconds. Original: 2 minute 27 second timer started. Translated: 2 minute 27 seconde minute a commencé. Original: Times up on your 2 minute 27 second timer. Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.
💁 Из-за различных способов выражения в разных языках вы можете получить переводы, которые немного отличаются от примеров, которые вы дали LUIS. Если это так, добавьте больше примеров в LUIS, переобучите и снова опубликуйте модель.
💁 Вы можете найти этот код в папке code/virtual-iot-device.
😀 Ваш многоязычный таймер успешно работает!
Отказ от ответственности:
Этот документ был переведен с помощью сервиса автоматического перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.