Windows Phone 7 中的文本转语音






4.83/5 (13投票s)
如何在 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
。
步骤 2: 输入所需信息并获取有效的 Bing API AppID
。
注册应用程序后,我们将开始 Windows Phone 7 应用程序开发并调用云服务。
步骤 3:创建一个 Windows Phone 7 应用程序项目
步骤 4:要添加 Microsoft Translator 服务的 Web 引用,我们需要向 Windows Phone 项目添加服务引用。右键单击解决方案资源管理器中的 Windows Phone 项目,然后选择“添加服务引用”。请参阅下面的图片。
步骤 5:现在向 Windows Phone 7 项目添加全景页。
步骤 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 和代码片段。
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
参数,如 AppId
、SpeechText
、SpeechLanguage
、format
。请参阅下面的 UI 和代码片段。
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:现在构建应用程序并执行它。
关注点
FrameworkDispatcher.Update()
,Bing API 允许将语音转换为文本。