ОБНОВЛЕНИЕ Google TTS API больше не является общедоступным. Примечания внизу о TTS от Microsoft по-прежнему актуальны и обеспечивают эквивалентную функциональность.
Вы можете использовать API TTS Google из своего приложения WinForm, проиграв ответ, используя вариант ответа на этот вопрос (это заняло у меня некоторое время, но у меня реальное решение ):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.FormClosing += (sender, e) =>
{
if (waiting)
stop.Set();
};
}
private void ButtonClick(object sender, EventArgs e)
{
var clicked = sender as Button;
var relatedLabel = this.Controls.Find(clicked.Tag.ToString(), true).FirstOrDefault() as Label;
if (relatedLabel == null)
return;
var playThread = new Thread(() => PlayMp3FromUrl("http://translate.google.com/translate_tts?q=" + HttpUtility.UrlEncode(relatedLabel.Text)));
playThread.IsBackground = true;
playThread.Start();
}
bool waiting = false;
AutoResetEvent stop = new AutoResetEvent(false);
public void PlayMp3FromUrl(string url)
{
using (Stream ms = new MemoryStream())
{
using (Stream stream = WebRequest.Create(url)
.GetResponse().GetResponseStream())
{
byte[] buffer = new byte[32768];
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
}
ms.Position = 0;
using (WaveStream blockAlignedStream =
new BlockAlignReductionStream(
WaveFormatConversionStream.CreatePcmStream(
new Mp3FileReader(ms))))
{
using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
{
waveOut.Init(blockAlignedStream);
waveOut.PlaybackStopped += (sender, e) =>
{
waveOut.Stop();
};
waveOut.Play();
waiting = true;
stop.WaitOne(10000);
waiting = false;
}
}
}
}
}
ПРИМЕЧАНИЕ: Приведенный выше код требует работы NAudio (свободный / открытый исходный код) и операторов using
для System.Web
, System.Threading
и NAudio.Wave
.
My Form1
имеет 2 элемента управления:
- Метка с именем
label1
- Кнопка с именем
button1
с Tag
из label1
(используется для привязки кнопки к ее метке)
Приведенный выше код можно немного упростить, если у вас есть разные события для каждой комбинации кнопок / меток, используя что-то вроде (не проверено):
private void ButtonClick(object sender, EventArgs e)
{
var clicked = sender as Button;
var playThread = new Thread(() => PlayMp3FromUrl("http://translate.google.com/translate_tts?q=" + HttpUtility.UrlEncode(label1.Text)));
playThread.IsBackground = true;
playThread.Start();
}
Есть проблемы с этим решением, хотя (этот список, вероятно, не полный; я уверен, что комментарии и реальное использование найдут другие):
- Обратите внимание на
stop.WaitOne(10000);
в первом фрагменте кода. 10000 представляет максимум 10 секунд звука для воспроизведения, поэтому его необходимо настроить, если для чтения вашего ярлыка требуется больше времени. Это необходимо, потому что текущая версия NAudio (v1.5.4.0), похоже, имеет проблемы с определением, когда закончится воспроизведение потока. Это может быть исправлено в более поздней версии или, возможно, есть обходной путь, который я не нашел времени, чтобы найти. Один временный обходной путь - использовать ParameterizedThreadStart
, который бы использовал таймаут в качестве параметра для потока. Это допускает переменные таймауты, но технически не решит проблему.
- Что еще более важно, API Google TTS является неофициальным (то есть не предназначенным для использования приложениями, не относящимися к Google), и может быть изменено без уведомления в любое время. Если вам нужно что-то, что будет работать в коммерческой среде, я бы предложил либо решение MS TTS (как предполагает ваш вопрос), либо одну из многих коммерческих альтернатив. Хотя ничего из этого не бывает таким простым.
Чтобы ответить на другую сторону вашего вопроса:
Класс System.Speech.Synthesis.SpeechSynthesizer
намного проще в использовании, и вы можете рассчитывать на его надежную доступность (тогда как с Google API он может исчезнуть завтра).
Это действительно так же просто, как включить ссылку на ссылку System.Speech
и:
public void SaySomething(string somethingToSay)
{
var synth = new System.Speech.Synthesis.SpeechSynthesizer();
synth.SpeakAsync(somethingToSay);
}
Это просто работает .
Попытка использовать Google TTS API была забавным экспериментом, но мне было бы трудно предложить его для производственного использования, и если вы не хотите платить за коммерческую альтернативу, решение Microsoft примерно так же хорошо, как и оно. становится.