Преобразование речи в REST API для короткого звука

Варианты использования REST API преобразования речи в текст для короткого звука ограничены. Используйте его только в тех случаях, когда нельзя использовать пакет SDK Речи.

Прежде чем использовать REST API преобразования речи в текст для короткого звука, рассмотрите следующие ограничения:

  • Запросы, которые используют REST API для коротких звуковых файлов и передают звук напрямую, могут содержать аудио продолжительностью не более 60 секунд. Входные форматы звука являются более ограниченными по сравнению с пакетом SDK службы "Речь".
  • REST API для коротких звуковых файлов возвращает только окончательные результаты. Он не предоставляет частичные результаты.
  • Перевод речи не поддерживается через REST API для короткого звука. Необходимо использовать пакет SDK службы "Речь".
  • Пакетное транскрибирование и настраиваемая речь не поддерживаются через REST API для короткого звука. Для пакетного транскрибирования и пользовательской речи всегда следует использовать REST API преобразования речи в текст.

Прежде чем использовать REST API преобразования речи в текст для короткого звука, необходимо выполнить обмен маркерами в рамках проверки подлинности для доступа к службе. Дополнительные сведения см. в разделе Authenticate to the Speech API (Аутентификация в API речи).

Регионы и конечные точки

Конечная точка REST API для кратких звуковых сообщений имеет следующий формат.

https://<REGION_IDENTIFIER>.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1

Замените <REGION_IDENTIFIER> идентификатором, который соответствует региону ресурса "Речь".

Примечание.

Сведения об Azure для государственных организаций и Microsoft Azure, управляемых конечными точками 21Vianet, см. в этой статье о национальных облаках.

Форматы аудио

Аудио отправляется в тексте HTTP-запроса POST. Аудиопоток должен иметь один из форматов, приведенных в следующей таблице:

Формат Кодек Скорость Частота выборки
WAV PCM 256 Кбит/с 16 кГц, моно
OGG OPUS 256 Кбит/с 16 кГц, моно

Примечание.

Предыдущие форматы поддерживаются REST API для коротких звуковых файлов и WebSocket в службе "Речь". Пакет SDK для службы "Речь" поддерживает формат WAV с кодеком PCM, а также другие форматы.

Заголовки запросов

В этой таблице перечислены обязательные и необязательные заголовки для преобразования речи в текстовые запросы:

Верхний колонтитул Description Обязательно или необязательно
Ocp-Apim-Subscription-Key Ключ ресурса для службы "Речь". Обязательный, если не предоставлен заголовок Authorization.
Authorization Маркеру авторизации предшествует слово Bearer. Дополнительные сведения см. в разделе Authenticate to the Speech API (Аутентификация в API речи). Обязательный, если не предоставлен заголовок Ocp-Apim-Subscription-Key.
Pronunciation-Assessment Задает параметры для отображения оценок произношения в результатах распознавания. Эти оценки определяют качество произношения входных данных речи, используя такие индикаторы, как точность, беглость и полнота.

Этот параметр представляет собой JSON в кодировке Base64, содержащий несколько подробных параметров. Чтобы узнать, как создать этот заголовок, см. раздел Параметры оценки произношения.
Необязательно
Content-type Описывает формат и кодек предоставленных аудиоданных. Допустимые значения: audio/wav; codecs=audio/pcm; samplerate=16000 и audio/ogg; codecs=opus. Обязательное поле
Transfer-Encoding Указывает, что отправляются фрагментированные аудиоданные, а не один файл. Используйте этот заголовок, только если вы разбиваете аудиоданные на блоки. Необязательно
Expect Если вы используете блочную передачу, отправьте Expect: 100-continue. Служба "Речь" подтверждает первоначальный запрос и ожидает больше данных. Требуется, если вы отправляете аудиоданные блочно.
Accept Если указан, этот заголовок должен иметь значение application/json. Служба распознавания речи предоставляет результаты в формате JSON. Некоторые платформы запросов предоставляют несовместимое значение по умолчанию. Рекомендуется всегда включать Accept. Необязательный, но рекомендуется включать.

Параметры запроса

Эти параметры могут быть включены в строку запроса REST- запроса.

Примечание.

Следует добавить параметр языка к URL-адресу, чтобы избежать получения ошибки HTTP 4xx. Например, выбор английского языка (США) с использованием конечной точки "Западная часть США" будет выглядеть так: https://westus.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US.

Параметр Описание Обязательно или необязательно
language Определяет распознаваемую устную речь. См. сведения о поддерживаемых языках. Обязательное поле
format Указывает формат результатов. Допустимые значения: simple и detailed. К простым результатам относятся RecognitionStatus, DisplayText, Offset и Duration. Подробные ответы включают четыре различных представления отображаемого текста. Значение по умолчанию равно simple. Необязательно
profanity Указывает, как обрабатывать ненормативную лексику в результатах распознавания. Допустимые значения:

masked для замены ненормативной лексики звездочками.
removed для удаления всей ненормативной лексики из результата.
raw для включения ненормативной лексики в результат.

Значение по умолчанию равно masked.
Необязательно
cid Когда вы используете Speech Studio для создания пользовательских моделей, вы можете воспользоваться значением Идентификатор конечной точки на странице Развертывание. Используйте значение Идентификатор конечной точки в качестве аргумента для параметра строки запроса cid. Необязательно

Параметры оценки произношения

Эта таблица содержит обязательные и необязательные параметры для оценки произношения.

Параметр Описание Обязательно или необязательно
ReferenceText Текст, на который вычисляется произношение. Обязательное поле
GradingSystem Система баллов для калибровки оценок. Система FivePoint ставит оценку в виде числа с плавающей запятой от 0 до 5, а HundredMark — оценку в виде числа с плавающей запятой от 0 до 100. По умолчанию: FivePoint. Необязательно
Granularity Степень детализации оценки. Допустимые значения:

Phoneme — отображает оценку на уровне всего текста, слова и фонемы.
Word — отображает оценку на уровне всего текста и слова.
FullText — отображает оценку только на уровне всего текста.

Значение по умолчанию равно Phoneme.
Необязательно
Dimension Определяет условия выходных данных. Допустимые значения:

Basic — отображает только оценку точности.
Comprehensive — отображает оценки по большему количеству измерений (например, оценку беглости речи и оценку полноты на уровне всего текста и тип ошибки на уровне слова).

Чтобы просмотреть определения различных измерений показателей и типов ошибок слова, см. статью "Свойства ответа". Значение по умолчанию равно Basic.
Необязательно
EnableMiscue Включает вычисление оговорок. Если этот параметр включен, то выраженные слова сравниваются с ссылочным текстом. Они отмечены упущением или вставкой на основе сравнения. Допустимые значения: False и True. Значение по умолчанию равно False. Необязательно
ScenarioId Уникальный идентификатор, который обозначает настроенную систему баллов. Необязательно

Ниже приведен пример JSON, содержащий параметры оценки произношения.

{
  "ReferenceText": "Good morning.",
  "GradingSystem": "HundredMark",
  "Granularity": "FullText",
  "Dimension": "Comprehensive"
}

Следующий пример кода демонстрирует создание параметров оценки произношения в заголовке Pronunciation-Assessment:

var pronAssessmentParamsJson = $"{{\"ReferenceText\":\"Good morning.\",\"GradingSystem\":\"HundredMark\",\"Granularity\":\"FullText\",\"Dimension\":\"Comprehensive\"}}";
var pronAssessmentParamsBytes = Encoding.UTF8.GetBytes(pronAssessmentParamsJson);
var pronAssessmentHeader = Convert.ToBase64String(pronAssessmentParamsBytes);

Настоятельно рекомендуется передавать потоковую передачу (фрагментированную передачу) во время публикации звуковых данных, что может значительно снизить задержку. Чтобы узнать, как включить потоковую передачу, см. пример кода на разных языках программирования.

Примечание.

Дополнительные сведения см. в описании оценки произношения.

Образец запроса

В следующем примере содержатся имя узла и обязательные заголовки. Важно отметить, что служба также ожидает звуковые данные, которые не включены в этот пример. Как упоминалось ранее, блочная передача рекомендуется, но не обязательна.

POST speech/recognition/conversation/cognitiveservices/v1?language=en-US&format=detailed HTTP/1.1
Accept: application/json;text/xml
Content-Type: audio/wav; codecs=audio/pcm; samplerate=16000
Ocp-Apim-Subscription-Key: YOUR_RESOURCE_KEY
Host: westus.stt.speech.microsoft.com
Transfer-Encoding: chunked
Expect: 100-continue

Чтобы включить оценку произношения, можно добавить следующий заголовок. Чтобы узнать, как создать этот заголовок, см. раздел Параметры оценки произношения.

Pronunciation-Assessment: eyJSZWZlcm...

Коды состояния HTTP

Код состояния HTTP для каждого ответа указывает на успешное выполнение или возникновение распространенных ошибок.

Код состояния HTTP Description Возможные причины
100 Продолжить Первоначальный запрос принимается. Перейдите к отправке данных, которые остались. (Этот код используется при блочной передаче.)
200 OK Запрос выполнен успешно. Текст ответа представляет собой объект JSON.
400 Недопустимый запрос Код языка не указан, язык не поддерживается или звуковой файл является недопустимым (например).
401 Не авторизовано Ключ ресурса или маркер авторизации недопустим в указанном регионе или конечная точка является недопустимой.
403 Запрещено Отсутствует ключ ресурса или маркер авторизации.

Образцы ответов

Типичный ответ для распознавания simple:

{
  "RecognitionStatus": "Success",
  "DisplayText": "Remind me to buy 5 pencils.",
  "Offset": "1236645672289",
  "Duration": "1236645672289"
}

Типичный ответ для распознавания detailed:

{
  "RecognitionStatus": "Success",
  "Offset": "1236645672289",
  "Duration": "1236645672289",
  "NBest": [
    {
      "Confidence": 0.9052885,
      "Display": "What's the weather like?",
      "ITN": "what's the weather like",
      "Lexical": "what's the weather like",
      "MaskedITN": "what's the weather like"
    },
    {
      "Confidence": 0.92459863,
      "Display": "what is the weather like",
      "ITN": "what is the weather like",
      "Lexical": "what is the weather like",
      "MaskedITN": "what is the weather like"
    }
  ]
}

Типичный ответ для распознавания с оценкой произношения:

{
  "RecognitionStatus": "Success",
  "Offset": "400000",
  "Duration": "11000000",
  "NBest": [
      {
        "Confidence" : "0.87",
        "Lexical" : "good morning",
        "ITN" : "good morning",
        "MaskedITN" : "good morning",
        "Display" : "Good morning.",
        "PronScore" : 84.4,
        "AccuracyScore" : 100.0,
        "FluencyScore" : 74.0,
        "CompletenessScore" : 100.0,
        "Words": [
            {
              "Word" : "Good",
              "AccuracyScore" : 100.0,
              "ErrorType" : "None",
              "Offset" : 500000,
              "Duration" : 2700000
            },
            {
              "Word" : "morning",
              "AccuracyScore" : 100.0,
              "ErrorType" : "None",
              "Offset" : 5300000,
              "Duration" : 900000
            }
        ]
      }
  ]
}

Свойства ответа

Результаты предоставляются в формате JSON. Формат simple включает следующие поля верхнего уровня:

Свойство Description
RecognitionStatus Состояние, например, Success в случае успешного распознавания. См. таблицу ниже.
DisplayText Распознанный текст после расстановки заглавных букв и знаков препинания, обратной нормализации текста и маскировки ненормативной лексики. Появляется только в случае успешного распознавания. Обратная нормализация текста — это преобразование произносимого текста в более короткие формы, например "200" вместо "двести" или "д-р Шевченко" вместо "доктор Шевченко".
Offset Время (в единицах 100 нс), с которого в звуковом потоке начинается распознанная речь.
Duration Длительность (в единицах 100 нс) распознанной речи в звуковом потоке.

Поле RecognitionStatus может содержать следующие значения:

Состояние Description
Success Речь распознана, и присутствует поле DisplayText.
NoMatch В аудиопотоке был обнаружена речь, но не были сопоставлены слова в целевом языке. Это состояние обычно означает, что язык распознавания отличается от языка, на котором говорит пользователь.
InitialSilenceTimeout В начале аудиопотока была только тишина, а время ожидания службой речи истекло.
BabbleTimeout Начало аудиопотока содержало только шум, а время ожидания службой речи истекло.
Error Служба распознавания столкнулась с внутренней ошибкой и не могла продолжиться. Повторите попытку, если это возможно.

Примечание.

Если звуковой файл содержит только ненормативную лексику, а параметр запроса profanity имеет значение remove, служба не возвращает результат распознавания речи.

Формат detailed содержит больше форм распознанных результатов. При использовании формата detailed параметр DisplayText указывается как Display для каждого результата в списке NBest.

Объект в списке NBest может включать следующие параметры.

Свойство Description
Confidence Оценка достоверности записи: от 0,0 (недостоверно) до 1,0 (полная достоверность).
Lexical Лексическая форма распознанного текста: конкретные распознанные слова.
ITN Форма распознанного текста после обратной нормализации (каноническая форма) с номерами телефонов, числами, сокращениями ("доктор Шевченко" до "д-р Шевченко") и другими выполненными преобразованиями.
MaskedITN Форма ITN с применением маскировки ненормативной лексики, если запрашивалась.
Display Отображаемая форма распознанного текста с расстановкой знаков препинания и прописных букв. Этот параметр совпадает с параметром DisplayText, если указан формат simple.
AccuracyScore Точность произношения речи. Правильность указывает на степень соответствия фонем произношению носителя языка. Оценка точности на уровне слова и целого текста вычисляется из оценки точности на уровне фонемы.
FluencyScore Беглость предоставленной речи. Владение языком указывает на степень соответствия речи использованию пауз между словами носителем языка.
CompletenessScore Полнота речи, определяемая путем вычисления соотношения произнесенных слов и эталонного входного текста.
PronScore Общая оценка, указывающая на качество произношения предоставленной речи. Эта оценка вычисляется на основе оценок AccuracyScore, FluencyScore и CompletenessScore с учетом их веса.
ErrorType Значение, указывающее, пропущено ли слово, вставлено или неверно произнесено по сравнению с ReferenceText. Возможные значения: None (означает отсутствие ошибок в этом слове), Omission, Insertion и Mispronunciation.

Блочная передача

Блочная передача (Transfer-Encoding: chunked) позволяет снизить задержку при распознавании. Она позволяет службе "Речь" начинать обработку звукового файла во время его передачи. REST API для короткого звука не предоставляет частичные или промежуточные результаты.

Следующий пример кода показывает, как отправлять аудио блоками. Только первый фрагмент данных должен содержать заголовок звукового файла. request — это объект HttpWebRequest, подключенный к соответствующей конечной точке REST. audioFile — путь к звуковому файлу на диске.

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.SendChunked = true;
request.Accept = @"application/json;text/xml";
request.Method = "POST";
request.ProtocolVersion = HttpVersion.Version11;
request.Host = host;
request.ContentType = @"audio/wav; codecs=audio/pcm; samplerate=16000";
request.Headers["Ocp-Apim-Subscription-Key"] = "YOUR_RESOURCE_KEY";
request.AllowWriteStreamBuffering = false;

using (var fs = new FileStream(audioFile, FileMode.Open, FileAccess.Read))
{
    // Open a request stream and write 1,024-byte chunks in the stream one at a time.
    byte[] buffer = null;
    int bytesRead = 0;
    using (var requestStream = request.GetRequestStream())
    {
        // Read 1,024 raw bytes from the input audio file.
        buffer = new Byte[checked((uint)Math.Min(1024, (int)fs.Length))];
        while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0)
        {
            requestStream.Write(buffer, 0, bytesRead);
        }

        requestStream.Flush();
    }
}

Проверка подлинности

Для каждого запроса требуется заголовок авторизации. В этой таблице показано, какие заголовки поддерживаются для каждого компонента.

Поддерживаемые заголовки авторизации Преобразование речи в текст Преобразование текста в речь
Ocp-Apim-Subscription-Key Да Да
Authorization: Bearer Да Да

Если вы используете Ocp-Apim-Subscription-Key заголовок, вам потребуется предоставить ключ ресурса. Например:

'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'

При использовании заголовка Authorization: Bearer необходимо выполнять запрос к конечной точке issueToken. В этом запросе вы обменяете ключом ресурса для маркера доступа, допустимого в течение 10 минут.

Как получить маркер доступа

Чтобы получить маркер доступа, необходимо запросить issueToken конечную точку с помощью Ocp-Apim-Subscription-Key ключа ресурса.

Конечная точка issueToken имеет следующий формат:

https://<REGION_IDENTIFIER>.api.cognitive.microsoft.com/sts/v1.0/issueToken

Замените <REGION_IDENTIFIER> идентификатором, соответствующим региону подписки.

Используйте эти примеры, чтобы создать запрос на получение маркера доступа.

Пример HTTP

Это простой HTTP-запрос для получения маркера. Замените YOUR_SUBSCRIPTION_KEY ключом ресурса для службы "Речь". Если ваша подписка не находится в регионе "Западная часть США", замените заголовок Host на имя узла в вашем регионе.

POST /sts/v1.0/issueToken HTTP/1.1
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
Host: eastus.api.cognitive.microsoft.com
Content-type: application/x-www-form-urlencoded
Content-Length: 0

Тело ответа содержит маркер доступа в формате JSON Web Token (JWT).

Пример для PowerShell

Это простой сценарий PowerShell для получения маркера доступа. Замените YOUR_SUBSCRIPTION_KEY ключом ресурса для службы "Речь". Обязательно используйте правильную конечную точку для региона, который соответствует вашей подписке. В этом примере используется конечная точка для западной части США.

$FetchTokenHeader = @{
  'Content-type'='application/x-www-form-urlencoded';
  'Content-Length'= '0';
  'Ocp-Apim-Subscription-Key' = 'YOUR_SUBSCRIPTION_KEY'
}

$OAuthToken = Invoke-RestMethod -Method POST -Uri https://eastus.api.cognitive.microsoft.com/sts/v1.0/issueToken
 -Headers $FetchTokenHeader

# show the token received
$OAuthToken

Пример cURL

cURL — это программа командной строки, доступная в Linux (и в подсистеме Windows для Linux). Эта команда cURL показывает, как получить маркер доступа. Замените YOUR_SUBSCRIPTION_KEY ключом ресурса для службы "Речь". Обязательно используйте правильную конечную точку для региона, который соответствует вашей подписке. В этом примере используется конечная точка для западной части США.

curl -v -X POST \
 "https://eastus.api.cognitive.microsoft.com/sts/v1.0/issueToken" \
 -H "Content-type: application/x-www-form-urlencoded" \
 -H "Content-Length: 0" \
 -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"

Пример на языке C#

Этот класс C# показывает, как получить маркер доступа. Передайте ключ ресурса для службы "Речь" при создании экземпляра класса. Если регион вашей подписки — не западная часть США, измените значение FetchTokenUri в соответствии с регионом своей подписки.

public class Authentication
{
    public static readonly string FetchTokenUri =
        "https://eastus.api.cognitive.microsoft.com/sts/v1.0/issueToken";
    private string subscriptionKey;
    private string token;

    public Authentication(string subscriptionKey)
    {
        this.subscriptionKey = subscriptionKey;
        this.token = FetchTokenAsync(FetchTokenUri, subscriptionKey).Result;
    }

    public string GetAccessToken()
    {
        return this.token;
    }

    private async Task<string> FetchTokenAsync(string fetchUri, string subscriptionKey)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
            UriBuilder uriBuilder = new UriBuilder(fetchUri);

            var result = await client.PostAsync(uriBuilder.Uri.AbsoluteUri, null);
            Console.WriteLine("Token Uri: {0}", uriBuilder.Uri.AbsoluteUri);
            return await result.Content.ReadAsStringAsync();
        }
    }
}

Пример для Python

# Request module must be installed.
# Run pip install requests if necessary.
import requests

subscription_key = 'REPLACE_WITH_YOUR_KEY'


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

Как использовать маркер доступа

Маркер доступа должен отправляться в службу в виде заголовка Authorization: Bearer <TOKEN>. Каждый маркер доступа действителен в течение 10 минут. Вы можете получить новый маркер в любое время, но, чтобы уменьшить сетевой трафик и задержку, мы рекомендуем использовать один маркер в течение девяти минут.

Ниже приведен пример HTTP-запроса к API преобразования речи в текст REST API для короткого звука:

POST /cognitiveservices/v1 HTTP/1.1
Authorization: Bearer YOUR_ACCESS_TOKEN
Host: westus.stt.speech.microsoft.com
Content-type: application/ssml+xml
Content-Length: 199
Connection: Keep-Alive

// Message body here...

Следующие шаги