Преобразование текста в речь с использованием PythonConvert text-to-speech using Python

В этой статье описано, как преобразовать текст в речь с помощью Python и REST API "Преобразование текста в речь".In this article, you'll learn how to convert text-to-speech using Python and the text-to-speech REST API. Текст запроса в этом руководстве оформлен по стандарту разметки SSML (Speech Synthesis Markup Language), который позволяет выбрать голос и язык для ответа.The request body in this guide is structured as Speech Synthesis Markup Language (SSML), which allows you to choose the voice and language of the response.

Для выполнения инструкций из этой статьи требуется учетная запись Azure Cognitive Services и ресурс службы "Речь".This article requires an Azure Cognitive Services account with a Speech service resource. Если у вас нет учетной записи, можно использовать бесплатную пробную версию, чтобы получить ключ подписки.If you don't have an account, you can use the free trial to get a subscription key.

Предварительные требованияPrerequisites

Создание проекта и импорт обязательных модулейCreate a project and import required modules

Создайте проект Python, используя любую IDE или любой текстовый редактор.Create a new Python project using your favorite IDE or editor. Затем скопируйте в файл проекта с именем tts.py этот фрагмент кода.Then copy this code snippet into your project in a file named tts.py.

import os
import requests
import time
from xml.etree import ElementTree

Примечание

Если вы ранее не использовали эти модули, вам потребуется установить их перед запуском программы.If you haven't used these modules you'll need to install them before running your program. Чтобы установить эти пакеты, выполните команду: pip install requests.To install these packages, run: pip install requests.

Эти модули используются для записи речи в файл с меткой времени, создания запроса HTTP и вызова API преобразования текста в речь.These modules are used to write the speech response to a file with a timestamp, construct the HTTP request, and call the text-to-speech API.

Настройка ключа подписки и создание запроса для преобразования текста в речьSet the subscription key and create a prompt for TTS

В следующих разделах описано, как создать методы для обработки авторизации, вызова API преобразования текста в речь и проверки ответа.In the next few sections you'll create methods to handle authorization, call the text-to-speech API, and validate the response. Для начала мы добавим фрагмент, который проверяет совместимость кода с Python версии 2.7.x и 3.x.Let's start by adding some code that makes sure this sample will work with Python 2.7.x and 3.x.

try:
    input = raw_input
except NameError:
    pass

Теперь давайте создадим класс.Next, let's create a class. Именно в него мы поместим все методы для обмена маркерами и вызова API преобразования текста в речь.This is where we'll put our methods for token exchange, and calling the text-to-speech API.

class TextToSpeech(object):
    def __init__(self, subscription_key):
        self.subscription_key = subscription_key
        self.tts = input("What would you like to convert to speech: ")
        self.timestr = time.strftime("%Y%m%d-%H%M")
        self.access_token = None

Здесь subscription_key обозначает уникальный ключ, полученный на портале Azure.The subscription_key is your unique key from the Azure portal. tts предлагает пользователю ввести текст, который нужно преобразовать в речь.tts prompts the user to enter text that will be converted to speech. Входные данные обрабатываются как строковый литерал, поэтому символы не нужно экранировать.This input is a string literal, so characters don't need to be escaped. Наконец, timestr получает текущее время, которое нам потребуется для создания имени файла.Finally, timestr gets the current time, which we'll use to name your file.

Получение маркера доступаGet an access token

REST API преобразования текста в речь требует предоставить маркер доступа для аутентификации.The text-to-speech REST API requires an access token for authentication. Чтобы получить маркер доступа, нужно выполнить обмен.To get an access token, an exchange is required. Этот пример меняет ключ подписки службы "Речь" на маркер доступа через конечную точку issueToken.This sample exchanges your Speech service subscription key for an access token using the issueToken endpoint.

В этом примере предполагается, что подписка службы "Речь" размещена в регионе "Западная часть США".This sample assumes that your Speech service subscription is in the West US region. Если вы используете другой регион, измените значение fetch_token_url.If you're using a different region, update the value for fetch_token_url. См. полный список регионов.For a full list, see Regions.

Скопируйте следующий код в класс TextToSpeech:Copy this code into the TextToSpeech class:

def get_token(self):
    fetch_token_url = "https://westus.api.cognitive.microsoft.com/sts/v1.0/issueToken"
    headers = {
        'Ocp-Apim-Subscription-Key': self.subscription_key
    }
    response = requests.post(fetch_token_url, headers=headers)
    self.access_token = str(response.text)

Примечание

Дополнительные сведения о проверке подлинности см. в разделе Проверка подлинности с помощью маркера доступа.For more information on authentication, see Authenticate with an access token.

Выполнение запроса и сохранение ответаMake a request and save the response

Здесь вы создадите запрос и сохраните ответ службы "Речь".Here you're going to build the request and save the speech response. Прежде всего задайте значения base_url и path.First, you need to set the base_url and path. В этом примере предполагается, что вы используете конечную точку в регионе "Западная часть США".This sample assumes you're using the West US endpoint. Если ресурс зарегистрирован в другом регионе, обновите значение base_url.If your resource is registered to a different region, make sure you update the base_url. Дополнительные сведения см. в списке регионов службы "Речь".For more information, see Speech service regions.

Теперь следует добавить в запрос обязательные заголовки.Next, you need to add required headers for the request. Обязательно сохраните в User-Agent имя ресурса (размещенного на портале Azure), а в X-Microsoft-OutputFormat укажите нужный аудиовыход.Make sure that you update User-Agent with the name of your resource (located in the Azure portal), and set X-Microsoft-OutputFormat to your preferred audio output. См. полный список форматов аудиовыхода.For a full list of output formats, see Audio outputs.

Затем создайте текст запроса с соблюдением синтаксиса SSML.Then construct the request body using Speech Synthesis Markup Language (SSML). Этот пример определяет структуру и применяет входные данные tts, которые вы создали ранее.This sample defines the structure, and uses the tts input you created earlier.

Примечание

В этом примере используется голос Guy24kRUS.This sample uses the Guy24kRUS voice font. См. полный список предоставляемых корпорацией Майкрософт голосов и языков.For a complete list of Microsoft provided voices/languages, see Language support. Если вы хотите создать для своего бренда уникальный и узнаваемый голос, см. руководство по созданию пользовательского голоса.If you're interested in creating a unique, recognizable voice for your brand, see Creating custom voice fonts.

И наконец, направьте запрос в службу.Finally, you'll make a request to the service. Если запрос выполнен успешно, возвращается код состояния 200 и речевой ответ сохраняется в файл с меткой времени.If the request is successful, and a 200 status code is returned, the speech response is written to a timestamped file.

Скопируйте следующий код в класс TextToSpeech:Copy this code into the TextToSpeech class:

def save_audio(self):
    base_url = 'https://westus.tts.speech.microsoft.com/'
    path = 'cognitiveservices/v1'
    constructed_url = base_url + path
    headers = {
        'Authorization': 'Bearer ' + self.access_token,
        'Content-Type': 'application/ssml+xml',
        'X-Microsoft-OutputFormat': 'riff-24khz-16bit-mono-pcm',
        'User-Agent': 'YOUR_RESOURCE_NAME'
    }
    xml_body = ElementTree.Element('speak', version='1.0')
    xml_body.set('{http://www.w3.org/XML/1998/namespace}lang', 'en-us')
    voice = ElementTree.SubElement(xml_body, 'voice')
    voice.set('{http://www.w3.org/XML/1998/namespace}lang', 'en-US')
    voice.set(
        'name', 'Microsoft Server Speech Text to Speech Voice (en-US, Guy24kRUS)')
    voice.text = self.tts
    body = ElementTree.tostring(xml_body)

    response = requests.post(constructed_url, headers=headers, data=body)
    if response.status_code == 200:
        with open('sample-' + self.timestr + '.wav', 'wb') as audio:
            audio.write(response.content)
            print("\nStatus code: " + str(response.status_code) +
                  "\nYour TTS is ready for playback.\n")
    else:
        print("\nStatus code: " + str(response.status_code) +
              "\nSomething went wrong. Check your subscription key and headers.\n")

СборкаPut it all together

Осталось совсем немного.You're almost done. Последним шагом будет создание экземпляра класса и вызов функций.The last step is to instantiate your class and call your functions.

if __name__ == "__main__":
    subscription_key = "YOUR_KEY_HERE"
    app = TextToSpeech(subscription_key)
    app.get_token()
    app.save_audio()

Запуск примера приложенияRun the sample app

Итак, все готово к запуску примера приложения преобразования текста в речь.That's it, you're ready to run your text-to-speech sample app. В командной строке или сеансе терминала перейдите к каталогу проекта и выполните следующую команду:From the command line (or terminal session), navigate to your project directory and run:

python tts.py

Когда появится запрос, введите любой текст для преобразования в речь.When prompted, type in whatever you'd like to convert from text-to-speech. Если все пройдет успешно, готовый речевой файл будет размещен в папке проекта.If successful, the speech file is located in your project folder. Воспроизведите его в любом проигрывателе мультимедиа.Play it using your favorite media player.

Очистка ресурсовClean up resources

Удалите из исходного кода примера приложения все конфиденциальные сведения, например ключи подписки.Make sure to remove any confidential information from your sample app's source code, like subscription keys.

Дальнейшие действияNext steps

См. также разделSee also