UWP XAML ToggleSwitch, чтобы установить голос синтезатора речи для мужчин или женщин
Я пытаюсь настроить voice.gender на мужской или женский с помощью переключателя ToggleSwitch на странице настроек в приложении Template10 UWP.
Я объявляю ТГ:
<ToggleSwitch x:Name="VoiceSelection" Header="Select Voice"
IsOn="{Binding VoiceChoice, Mode=TwoWay}"
OffContent="Male Voice" OnContent="Female Voice" />
Это должно быть хорошо.
Затем я установил логическое значение, которое будет использоваться для выбора мужчины или женщины позже
public event PropertyChangedEventHandler PropertyChanged;
public static bool _voiceChoice = true;
public bool VoiceChoice
{
get
{
return _voiceChoice;
}
set
{
_voiceChoice = value;
OnPropertyChanged("VoiceChoice");
}
}
protected void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
Для информации вот код, который позже назначит голос. Это тоже хорошо работает.
...
if (_voiceChoice == true)
{
VoiceInformation voiceInfo =
(
from voice in SpeechSynthesizer.AllVoices
where voice.Gender == VoiceGender.Female
select voice
).FirstOrDefault() ?? SpeechSynthesizer.DefaultVoice;
synthesizer.Voice = voiceInfo;
stream = await synthesizer.SynthesizeTextToStreamAsync(text);
}
else
...
У меня проблема в том, что я могу выбрать голос, вручную установив логическое значение _voiceChoice, но я не могу установить его с помощью ToggleSwitch.
Я также понимаю, что это решение не очень чистое, и я открыт для любых предложений. Любая помощь с благодарностью. Заранее спасибо.
1 ответ
На самом деле, я смотрел на это совершенно неправильно.
Вот что нужно сделать, чтобы рабочий переключатель ToggleSwitch переключался между мужским и женским голосом в Template10. Может быть, более чистые решения, но это работает.
В SettingsPage.xaml добавьте:
<ToggleSwitch x:Name="VoiceSelection" Header="Select Voice"
IsOn="{Binding UseVoiceSelection, Mode=TwoWay}"
OffContent="Male Voice" OnContent="Female Voice" />
В SettingsService.cs добавьте:
public bool UseVoiceSelection
{
get { return _helper.Read<bool>(nameof(UseVoiceSelection), true); }
set
{
_helper.Write(nameof(UseVoiceSelection), value);
}
}
В классе SettingsPartViewModel: ViewModelBase добавьте:
public bool UseVoiceSelection
{
get { return _settings.UseVoiceSelection; }
set { _settings.UseVoiceSelection = value; base.RaisePropertyChanged(); }
}
Наконец, в отдельном классе установите значение bool и выполните синтез речи:
public class ReadSpeech
{
public static bool _voiceChoice = true;
// Performs synthesis
async Task<IRandomAccessStream> SynthesizeTextToSpeechAsync(string text)
{
IRandomAccessStream stream = null;
using (SpeechSynthesizer synthesizer = new SpeechSynthesizer())
{
if (temp.SettingsPartViewModel.UseVoiceSelection == true)
{
VoiceInformation voiceInfo =
(
from voice in SpeechSynthesizer.AllVoices
where voice.Gender == VoiceGender.Female
select voice
).FirstOrDefault() ?? SpeechSynthesizer.DefaultVoice;
synthesizer.Voice = voiceInfo;
stream = await synthesizer.SynthesizeTextToStreamAsync(text);
}
else
{
VoiceInformation voiceInfo =
(
from voice in SpeechSynthesizer.AllVoices
where voice.Gender == VoiceGender.Male
select voice
).FirstOrDefault() ?? SpeechSynthesizer.DefaultVoice;
synthesizer.Voice = voiceInfo;
stream = await synthesizer.SynthesizeTextToStreamAsync(text);
}
}
return (stream);
}