65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Phone 7 中的文本转语音

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (13投票s)

2011年9月25日

CPOL

2分钟阅读

viewsIcon

87825

downloadIcon

2477

如何在 Windows Phone 7 中使用文本转语音 API

引言

本文讨论如何在 Windows Phone 7 中使用基于云的 Microsoft Translator 服务将文本转换为语音。 

背景

在本文中,我将解释如何利用云技术解决文本转语音翻译问题。使用 Bing API 在 Windows Phone 7 中实现这种功能非常简单。我将演示如何检索 Microsoft Translator 为 Speech API 支持的语言列表,并朗读用户的输入文本。

首先,我们必须获得有效的 Bing API AppID,请按照以下步骤操作。

步骤 1:打开以下 URL 注册您的应用程序,并按照说明获取有效的 Bing API AppID

1.png - Click to enlarge image

步骤 2 输入所需信息并获取有效的 Bing API AppID

2.png - Click to enlarge image 

注册应用程序后,我们将开始 Windows Phone 7 应用程序开发并调用云服务。

步骤 3:创建一个 Windows Phone 7 应用程序项目

WP_001.png - Click to enlarge image

步骤 4:要添加 Microsoft Translator 服务的 Web 引用,我们需要向 Windows Phone 项目添加服务引用。右键单击解决方案资源管理器中的 Windows Phone 项目,然后选择“添加服务引用”。请参阅下面的图片。

WP_004.png

WP_003.png

WP_004.png

步骤 5:现在向 Windows Phone 7 项目添加全景页。

WP_005.png - Click to enlarge image

步骤 6:根据应用程序要求创建 UI,请参阅下面的 XAML 代码片段。我添加了三个全景项目。 

使用 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 professional. 
                         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”。GetLanguagesForSpeak 方法仅返回语言代码,例如,英语为 en ,法语为 fr ,等等。请参阅下面的 UI 和代码片段。

WP_006.png

GetLanguagesForSpeakAsync 接受两种方法,如 AppID object。 

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第二个全景项目用于开发使用 SpeakAsync 方法进行语音朗读,该方法接受四个 string 参数,如 AppIdSpeechTextSpeechLanguageformat。请参阅下面的 UI 和代码片段。

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

关注点

FrameworkDispatcher.Update(),Bing API 允许将语音转换为文本。 

© . All rights reserved.