Я пытаюсь заставить речь Google TTS работать, потому что Windows RT/Metro не содержит определения для System.Speech. Код ниже компилируется без ошибок, но ничего не говорится. Я отлаживал и проверял, содержит ли ListBox.SelectedItem текст, и он это делает.
Библиотеки называются:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Popups;
using System.Net.Http;
Так я называю myMediaElement:
MediaElement myMediaElement = new MediaElement();
Это то, что я пытаюсь сделать:
private void RepeatWord_Click(object sender, RoutedEventArgs e)
{
string pathx = "http://translate.google.com/translate_tts?tl=en&q=" + ListBox.SelectedItem.ToString();
myMediaElement.Source = new Uri(pathx, UriKind.RelativeOrAbsolute);
myMediaElement.Play();
}
Похоже, вы создаете MediaElement
в коде. Убедитесь, что он добавлен в пользовательский интерфейс. Он не будет воспроизводиться, если он просто ссылается на частное поле. Затем вы можете либо установить LoadedBehavior
на "Play" (нет необходимости вызывать Play()
), либо вам нужно дождаться загрузки носителя до вызова Play()
. Для тестирования я просто использовал Thread.Sleep()
но я ожидал бы, что для этого есть обратный вызов.
И последнее, но не менее важное: конструктор Uri обрабатывает большую часть кодировки url для вас, но если вы хотите, чтобы Google услышал высказывание "перетаскивание", вам нужно самому позаботиться об амперсанде.
Кредиты: эти сообщения помогли мне найти этот ответ и могут иметь дополнительную информацию для вас:
MainGrid.Children.Add(myMediaElement)
и всеMainGrid.Children.Add(myMediaElement)
.