2016-07-17 8 views
0

Я пытаюсь установить voice.gender для мужчин или женщин через ToggleSwitch на странице настроек в приложении Template10 UWP.UWP XAML ToggleSwitch для установки речи Синтез речи для мужчин или женщин

Объявляю TG:

<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.

Я также понимаю, что это решение не очень чистое, и я открыт для любых предложений. Любая помощь приветствуется. Заранее спасибо.

+0

Что вы подразумеваете под "can not set via ToggleSwitch"? Есть ли ошибка? Является ли сеттер свойства не вызванным? –

+0

Что-то в коде неверно, мне хотелось бы знать, что .. :) –

+0

Если вы установите контрольную точку в настройщике свойств и переверните переключатель, ударит ли точка останова? –

ответ

0

Фактически, я смотрел на это совершенно неправильно.
Вот что необходимо для того, чтобы рабочий 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); 
    }