Превращение теста в речь в .Net и .Net Micro Framework с одновременным переводом


Грэг Дункан

Хотя мысль об офисе, заполненном разговаривающими компьютерами, для многих является ночным кошмаром (хорошо, во всяком случае, для меня; уже достаточно болтовни, и добавлять к ней каждый болтающий ПК? Нееет… J), многим хотелось бы встраивать речевые возможности в собственные аппаратные проекты. Чтобы погодная станция сообщала нам, когда случиться что-то интересное, робот просил нас не делать чего-то, а автоматический танк ставил последний ультиматум и т. п.

Но хотелось бы, чтобы система также была простая и дешевая. И да! Было бы здорово, если бы она магическим образом поддерживала разные языки.

Звучит, как если бы это была задача для облака, не правда ли?

Сегодняшнее сообщение пришло от Марка Минерво (Marco Minerva) через его пост «Новая версия библиотеки преобразования текста в речь» и это просто перевод текста в речь для .Net и .Net Micro Framework, управляемый Azure DataMarket, основанной на Microsoft Translator Service.

Перевод текста в речь (синтез речи) с помощью Microsoft Translator Service

Библиотека использует службу Microsoft Translator Service для получения потока файла произносимого текста на желаемом языке. На момент написания поддерживалось 44 языка, включая английский, итальянский, немецкий, французский, испанский, японский и китайский.

Если вам нужен вариант библиотеки для .NET Micro Framework, то пройдите по ссылке: http://code.msdn.microsoft.com/Text-To-Speech-for-NET-9cea4462.

Создание примера

Код, который можно загрузить с этой страницы содержит библиотеку классов TranslatorService.Speech, обеспечивающую всю необходимую функциональность по синтезу речи для ваших приложений. Он также включает небольшое консольное приложение TranslatorSpeakExample, демонстрирующее основные моменты ее использования.

Чтобы запустить приложение, надо пройти в Azure DataMarket и получить ключи Client ID и Client Secret для использования этого сервиса.

Описание

Библиотека вызывает сервис Microsoft Translator Service, используя классический объект .NET HttpWebRequest, и обрабатывает ответ REST. Поэтому ее использование очень просто:

Перевод текста в речь для .NET Micro Framework с помощью Microsoft Translator Service

Библиотека использует службу Microsoft Translator Service для получения потока файла произносимого текста на желаемом языке. На момент написания поддерживалось 44 языка, включая английский, итальянский, немецкий, французский, испанский, японский и китайский.

Если вам нужен вариант библиотеки для .NET Framework, то пройдите по ссылке: http://code.msdn.microsoft.com/Speech-Synthesis-with-7658fa03

Создание примера

Код, который можно загрузить с этой страницы содержит библиотеку классов TranslatorService.Speech, обеспечивающую всю необходимую функциональность по синтезу речи для ваших приложений. Он также включает небольшое консольное приложение TranslatorSpeakExample, демонстрирующее основные моменты ее использования.

Чтобы запустить приложение, надо пройти в Azure DataMarket и получить ключи Client ID и Client Secret для использования этого сервиса.

Описание

Библиотека вызывает сервис Microsoft Translator Service, используя классический объект .NET Micro Framework HttpWebRequest, и обрабатывает ответ REST. Поэтому ее использование очень просто:

Если вы такой же новичок в Azure DataMarket, как и я, то возможно не знаете, что «для использования сервиса необходимо пройти в Azure DataMarket и получить ключи Client ID и Client Secret.

Microsoft Translator получение токена доступа

Вы должны получить токен доступа для использования Microsoft Translator API. Токен доступа передается с каждым вызовом API и применяется для аутентификации вашего доступа к Microsoft Translator API. Он обеспечивает защищенный доступ к Microsoft Translator API и позволяет API связать запрос вашего приложения к службе Microsoft Translator с вашей учетной записью в Azure Marketplace.

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

  1. Подпишитесь на Microsoft Translator API в Azure Marketplace
  2. Зарегистрируйте приложение в Azure DataMarket
  3. Выполните запрос HTTP POST к сервису токенов

1. Подпишитесь на Microsoft Translator API в Azure Marketplace

Подпишитесь на Microsoft Translator API в Azure Marketplace. Базовая подписка, позволяющая получать до 2 миллионов символов в месяц, бесплатна. Перевод более 2 млн символов в месяц требует оплаты. Можно выбрать любую доступную подписку.

2. Зарегистрируйте приложение в Azure DataMarket

Чтобы зарегистрировать приложение в Azure DataMarket, посетите страницу https://datamarket.azure.com/developer/applications/, используя мандаты, полученные на шаге 1, и щелкните на кнопке “Register”. В диалоге «Register your application» задайте собственные параметры Client ID и Name. Поле «URI перенаправления» не используется в Microsoft Translator API. Однако оно обязательно и вам необходимо задать URI, чтобы получить код доступа. Описание не обязательно.

Запишите параметры client ID и client secret

...

Фрагменты выполнения шага 1

clip_image002

clip_image004

clip_image006

Фрагменты для шага 2;

clip_image008

clip_image010

Теперь возьмите параметры Client Id и Client secret и вставьте их в приложение:

clip_image012

Теперь можно двигаться дальше!

Запустите приложение. Действительно прикольно слушать разные переводы (хотя я понятия не имею о чем они говорят J).

clip_image014

clip_image016

Вот фрагмент решения для.Net:

clip_image018

static void Main(string[] args)
{
if (string.IsNullOrEmpty(CLIENT_ID) || string.IsNullOrEmpty(CLIENT_SECRET))
{
Console.WriteLine("You must obtain a Client ID and Secret in order to use this application. Please visit Azure DataMarket at https://datamarket.azure.com/developer/applications to get one.\n");
Console.ReadKey();
return;
}

// Create the object to retrieve spoken streams.
SpeechSynthesizer speech = new SpeechSynthesizer(CLIENT_ID, CLIENT_SECRET);
speech.SpeakCompleted += new EventHandler<SpeechEventArgs>(speech_SpeakCompleted);
speech.AudioFormat = SpeakStreamFormat.Wave;
speech.AudioQuality = SpeakStreamQuality.MaxQuality;

Console.WriteLine("Retrieving the list of supported languages...");
try
{
string[] languages = speech.GetLanguages();

Console.WriteLine("Found {0} supported languges:", languages.Length);
foreach (var lang in languages)
{
Console.WriteLine("{0} - {1}", lang, CultureInfo.GetCultureInfo(lang).DisplayName);
}
}
catch (Exception ex)
{
Console.WriteLine("Error during the request: {0}", ex.Message);
}

Console.WriteLine("\n");

bool quit = false;
while (!quit)
{
try
{
Console.Write("Insert the text to be spoken (empty to terminate): ");
string text = Console.ReadLine();
if (string.IsNullOrWhiteSpace(text))
{
quit = true;
continue;
}

Console.Write("Specify the text language (empty to terminate): ");
string language = Console.ReadLine();
if (string.IsNullOrWhiteSpace(language))
{
quit = true;
continue;
}

Console.Write("Submitting request... ");

// Retrieve the stream of wave-file speaking the passed-in text in the desired language.

//using (Stream stream = speech.GetSpeakStream(text, language))
//{
// var length = stream.Length;
// using (SoundPlayer player = new SoundPlayer(stream))
// player.PlaySync();
//}

// Speak the passed-in text in the desired language, in an asynchronous way.
// When this operation completes, the speech_SpeakCompleted event is raised.
speech.SpeakAsync(text, language);
}
catch (Exception ex)
{
Console.WriteLine("Error during the request: {0}", ex.Message);
}

Console.WriteLine("\n");
}
}

private static void speech_SpeakCompleted(object sender, SpeechEventArgs e)
{
if (e.Error != null)
Console.WriteLine("Erorr: " + e.Error.Message);
}
}

Сборку TranslatorService.Speech легко понять и она прекрасно документирована:

/// <summary>
/// Initializes a new instance of the <strong>SpeechSynthesizer</strong> class, using the specified Client ID and Client Secret and the desired language.
/// </summary>
/// <param name="clientID">The Application Client ID.
/// </param>
/// <param name="clientSecret">The Application Client Secret.
/// </param>
/// <param name="language">A string representing the supported language code to speak the text in. The code must be present in the list of codes returned from the method <see cref="GetLanguages"/>.</param>
/// <remarks>You must register your application on Azure DataMarket, https://datamarket.azure.com/developer/applications, to obtain the Client ID and Client Secret needed to use the service.
/// </remarks>
/// <seealso cref="ClientID"/>
/// <seealso cref="ClientSecret"/>
/// <seealso cref="Language"/>
public SpeechSynthesizer(string clientID, string clientSecret, string language)
{
ClientID = clientID;
ClientSecret = clientSecret;
Language = language;
AudioFormat = SpeakStreamFormat.Wave;
AudioQuality = SpeakStreamQuality.MinSize;
}

#region Get Languages

/// <summary>
/// Retrieves the languages available for speech synthesis.
/// </summary>
/// <returns>A string array containing the language codes supported for speech synthesis by <strong>Microsoft Translator Service</strong>.</returns>
/// <exception cref="ArgumentException">The <see cref="ClientID"/> or <see cref="ClientSecret"/> properties haven't been set.</exception>
/// <remarks><para>This method will block until the array is returned. If you want to perform a non-blocking request to be notified when the operation is completed, use the <see cref="GetLanguagesAsync"/> method instead.</para>
/// <para>For more information, go to http://msdn.microsoft.com/en-us/library/ff512415.aspx.
/// </para>
/// </remarks>
/// <seealso cref="GetLanguagesAsync"/>
public string[] GetLanguages()
{
// Check if it is necessary to obtain/update access token.
this.UpdateToken();

string uri = LANGUAGES_URI;
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Headers.Add(AUTHORIZATION_HEADER, headerValue);

if (Proxy != null)
httpWebRequest.Proxy = Proxy;

using (WebResponse response = httpWebRequest.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
DataContractSerializer dcs = new DataContractSerializer(typeof(string[]));
string[] results = (string[])dcs.ReadObject(stream);

return results;
}
}
}

Если вам надо добавить в ваш проект Net или .Net Micro Framework речь в виде преобразования текста в речь с автоматическим переводом на разные языки вам надо бежать а не идти и смотреть этот проект…

Skip to main content