0
回答
在 Windows Phone 7 编写 TTS 程序 (Text to Speech)
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

本文将介绍如何在 Windows Phone 7 手机上使用微软的翻译服务。这将会用到微软的 Speech API 。

下面是详细的步骤:

1. 首先我们要申请一个 AppID

访问网址:http://www.bing.com/developers/appids.aspx

 

2. 输入必须的信息然后获取可用的 Bind API AppID

一旦注册成功,我们就可以开始 Windows Phone 7 上的程序开发了。

 

3. 创建一个 Windows Phone 7 的项目

WP_001.png

 

4. 添加对微软翻译服务的 Web 应用,首先需要添加服务引用到项目中。右击项目并选择“ Add Service Reference”,如下图所示:

http://api.microsofttranslator.com/V2/Soap.svc

WP_004.png

WP_003.png

WP_004.png

 

5. 现在添加一个全景页到项目中

WP_005.png

 

6. 使用如下 xaml 创建 UI :

<Grid x:Name="LayoutRoot">
    <controls:Panorama Title="text to speech" Name="panoSpeech" 
           Foreground="Blue" FontFamily="Comic Sans MS">
        <!--Panorama item one-->
        <controls:PanoramaItem Header="Language(s)" 
               Foreground="Plum" FontFamily="DengXian" 
               FontSize="72">
            <StackPanel Orientation="Horizontal">
                <StackPanel.Resources>
                    <DataTemplate x:Key="LanguageTemplate">
                        <TextBlock Foreground="White" 
                           Margin="0,0,0,0" Text="{Binding Name}"  />
                    </DataTemplate>
                </StackPanel.Resources>
                    <ListBox HorizontalAlignment="Left" 
                       ItemTemplate="{StaticResource LanguageTemplate}" 
                       Margin="20,10,0,20" 
                       Name="ListLanguages" Width="441">
                    </ListBox>
            </StackPanel>
        </controls:PanoramaItem>

        <!--Panorama item two-->
        <controls:PanoramaItem Header="Speech" Foreground="Yellow">
            <StackPanel Orientation="Vertical" Margin="20,0,0,0">
                <TextBox Name="TextToSpeachText" 
                   Text="This Pavan Pareta, Microsoft Most Value able proffesional. 
                         He has written an application for windows phone 7" 
                   TextWrapping="Wrap" Height="350" />
                <Button Content="S p e a k" Height="90" 
                   Margin="0,30,0,0" Name="btnSpeak" 
                   Width="338" Click="btnSpeak_Click" />
            </StackPanel>
        </controls:PanoramaItem>

        <!--Panorama item three-->
        <controls:PanoramaItem Header="Speak" Foreground="Violet">
            <StackPanel Orientation="Vertical">
                <Image Height="auto" Name="image1" 
                   Stretch="None" Width="auto" 
                   Margin="50 60 80 0" Source="/speak.jpg" />
            </StackPanel>
        </controls:PanoramaItem>
    </controls:Panorama>
</Grid>


7. 接下来需要调用 Web 服务方法:“GetLanguagesForSpeakAsync”. 该方法只返回语言代码,例如 English 会返回 en,而 French 返回 fr,界面和代码如下所示:

WP_006.png

GetLanguagesForSpeakAsync 需要两个参数:AppID 和 对象:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    try
    {
        FrameworkDispatcher.Update();
        var objTranslator = new ServiceReference1.LanguageServiceClient();
        objTranslator.GetLanguagesForSpeakCompleted += 
          new EventHandler<GetLanguagesForSpeakCompletedEventArgs>(
          translator_GetLanguagesForSpeakCompleted);
        objTranslator.GetLanguagesForSpeakAsync(AppId, objTranslator);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

void translator_GetLanguagesForSpeakCompleted(object sender, 
                GetLanguagesForSpeakCompletedEventArgs e)
{
    var objTranslator = e.UserState as ServiceReference1.LanguageServiceClient;
    objTranslator.GetLanguageNamesCompleted += 
      new EventHandler<GetLanguageNamesCompletedEventArgs>(
      translator_GetLanguageNamesCompleted);
    objTranslator.GetLanguageNamesAsync(AppId, "en", e.Result, e.Result);
}

void translator_GetLanguageNamesCompleted(object sender, 
     GetLanguageNamesCompletedEventArgs e)
{
    var codes = e.UserState as ObservableCollection<string>;
    var names = e.Result;
    var languagesData = (from code in codes
                     let cindex = codes.IndexOf(code)
                     from name in names
                     let nindex = names.IndexOf(name)
                     where cindex == nindex
                     select new TranslatorLanguage()
                     {
                         Name = name,
                         Code = code
                     }).ToArray();
    this.Dispatcher.BeginInvoke(() =>
    {
        this.ListLanguages.ItemsSource = languagesData;
    });
}


8. 第二个界面用来输入要发音的文本:

WP_007.png

private void btnSpeak_Click(object sender, RoutedEventArgs e)
{
    var languageCode = "en";
    var language = this.ListLanguages.SelectedItem as TranslatorLanguage;
    if (language != null)
    {
        languageCode = language.Code;
    }
    var objTranslator = new ServiceReference1.LanguageServiceClient();
    objTranslator.SpeakCompleted += translator_SpeakCompleted;
    objTranslator.SpeakAsync(AppId, this.TextToSpeachText.Text, 
                             languageCode, "audio/wav");

    panoSpeech.DefaultItem = panoSpeech.Items[(int)2];
            
 }

void translator_SpeakCompleted(object sender, ServiceReference1.SpeakCompletedEventArgs e)
{
    var client = new WebClient();
    client.OpenReadCompleted += ((s, args) =>
    {
        SoundEffect se = SoundEffect.FromStream(args.Result);
        se.Play();
    });
            client.OpenReadAsync(new Uri(e.Result));
}


9. 接下来就是编译项目并执行了,结果如下:

WP_008.png

WP_009.png

WP_010.png

 

英文原文:http://www.codeproject.com/KB/windows-phone-7/Text_to_speech_in_wp7.aspx

项目源码:TextToSpeech.zip - 82.68 KB

举报
红薯
发帖于6年前 0回/446阅
顶部