×
Namespaces

Variants
Actions

Windows Phone 8有什么新功能(一)

From Nokia Developer Wiki
Jump to: navigation, search
WP Metro Icon WP8.png
WP Metro Icon Baby.png
SignpostIcon Code 52.png
Article Metadata

代码示例
兼容于
文章
翻译:
Hazel Xie
最后由 hamishwillee 在 04 Jul 2013 编辑

Contents

介绍

Windows Phone8的发布在微软的手机操作系统演变中标志着一个重要的里程碑。新版本对用户来说,这意味着扩大硬件的访问,支持高端游戏,以及更好的OS集成-所有这些都将很快在诺基亚Lumia920和诺基亚Lumia820手机上看到。 对于开发者来说有不少显著变化,引进了许多新的API。这些API简化了功能特性的编码,你可能已经添加这些特性到你的Windows Phone应用程序中了,但是也提供了很多新的。本文将向您介绍最重要的API添加和更改。 通过这篇文章的示例应用程序,展示如何编写利用这些新功能的实际代码。要创建你自己版本的应用程序,您将需要Windows Phone8 SDK,你可以从http://go.microsoft.com/fwlink/?LinkID=261873 下载。你可以得到一个完整版本的示例应用程序:Media:WhatsNewInWP8 FullExample.zip

本地:DirectX,C++和Direct3D图形

DirectX的一个子集被引进到Windows Phone 8使本地高端高性能游戏成为可能。C++也被引进来了,主要是用于高端游戏。 在Visual Studio2012中你可以创建一个使用这些新特性的“Windows Phone Direct3D应用程序”

WhatsNewWP8 1 CreateDirect3DApplicationTemplate.png


新建 Windows Phone Direct3D 应用程序 运行默认新项目,你将看到一个旋转的3D立方体

WhatsNewWP8 2 DirectX Cube.gif


在Direct3D中的3D旋转立方体 Direct3D不是魔法。研究CubeRenderer.cpp还是很容易的,找到定义立方体的8个点

VertexPositionColor cubeVertices[] =
{
{XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT3(0.0f, 0.0f, 0.0f)},
{XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT3(0.0f, 0.0f, 1.0f)},
{XMFLOAT3(-0.5f, 0.5f, -0.5f), XMFLOAT3(0.0f, 1.0f, 0.0f)},
{XMFLOAT3(-0.5f, 0.5f, 0.5f), XMFLOAT3(0.0f, 1.0f, 1.0f)},
{XMFLOAT3( 0.5f, -0.5f, -0.5f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
{XMFLOAT3( 0.5f, -0.5f, 0.5f), XMFLOAT3(1.0f, 0.0f, 1.0f)},
{XMFLOAT3( 0.5f, 0.5f, -0.5f), XMFLOAT3(1.0f, 1.0f, 0.0f)},
{XMFLOAT3( 0.5f, 0.5f, 0.5f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
};

减少4的定义点获得一个四面体这也是比较容易的,如下:

VertexPositionColor cubeVertices[] =
{
{XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT3(0.0f, 0.0f, 0.0f)},
{XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT3(0.0f, 0.0f, 1.0f)},
{XMFLOAT3(-0.5f, 0.5f, -0.5f), XMFLOAT3(0.0f, 1.0f, 0.0f)},
{XMFLOAT3(-0.5f, 0.5f, 0.5f), XMFLOAT3(0.0f, 1.0f, 1.0f)},
//{XMFLOAT3( 0.5f, -0.5f, -0.5f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
//{XMFLOAT3( 0.5f, -0.5f, 0.5f), XMFLOAT3(1.0f, 0.0f, 1.0f)},
//{XMFLOAT3( 0.5f, 0.5f, -0.5f), XMFLOAT3(1.0f, 1.0f, 0.0f)},
//{XMFLOAT3( 0.5f, 0.5f, 0.5f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
};

现在,运行程序,显示一个3维的旋转平坦四面体

WhatsNewWP8 3 DirectX Tetrogon.gif

Direct3D中的3维旋转四面体 对于这个新功能集,有几个重要的注意事项 1 编程语言:C++是为了和DirectX一起使用的。 C ++与XAML或C#和DirectX现成是不支持的,即使在两个平台之间实现互操作性是可能的。 2 Direct3D功能级别:所有Windows Phone8设备支持Direct3D功能的级别是Level9_3。而Windows8商店应用程序可以支持更多的功能级别。这限制了我们Direct3D可以做的。但是,它也为所有windows Phone 8设备创建了一个简单的DirectX编程模型并且有潜力实现windows phone 8和windows 8游戏代码的重用。这里有一个部分的Direct3D11.1支持的功能级别9_3列表

WhatsNewWP8 4 Direct3D 11.1 FeaturesSupportedInFeatureLevel9 3.png

在Level9_3中支持的的Direct3D的功能集 3 支持DirectX: 只有Direct3D一个技术在技术大家庭被称为“DirectX”。并非所有这些技术在Windows Phone8上都支持,即使是那些支持的也是桌面API的一个子集。你可以在这里看到一个完整这些技术的列表。

4 C++不能访问托管Mango的API:C++代码只能从WinPRT使用新的WP8的API。因此C ++代码不能访问任何现有的Mango API。这意味着C ++应用程序只限于以下新的Windows Phone命名空间:

Windows.ApplicationModel
Windows.ApplicationModel.Activation
Windows.ApplicationModel.Core
Windows.ApplicationModel.DataTransfer
Windows.ApplicationModel.Store
Windows.Devices.Geolocation
Windows.Devices.Input
Windows.Devices.Sensors
Windows.Foundation
Windows.Foundation.Collections
Windows.Foundation.Diagnostics
Windows.Foundation.Metadata
Windows.Graphics.Display
Windows.Management.Deployment
Windows.Networking
Windows.Networking.Connectivity
Windows.Networking.Proximity
Windows.Networking.Sockets
Windows.Phone.ApplicationModel
Windows.Phone.Devices.Notification
Windows.Phone.Devices.Power
Windows.Phone.Graphics.Interop
Windows.Phone.Input.Interop
Windows.Phone.Management.Deployment
Windows.Phone.Media.Capture
Windows.Phone.Media.Devices
Windows.Phone.Networking.NetworkOperators
Windows.Phone.Networking.Voip
Windows.Phone.PersonalInformation
Windows.Phone.PersonalInformation.Provisioning
Windows.Phone.Speech.Recognition
Windows.Phone.Speech.Synthesis
Windows.Phone.Speech.VoiceCommands
Windows.Phone.Storage.SharedAccess
Windows.Phone.System
Windows.Phone.System.Analytics
Windows.Phone.System.Memory
Windows.Phone.System.Power
Windows.Phone.System.Profile
Windows.Phone.System.UserProfile
Windows.Phone.System.UserProfile.GameServices.Core
Windows.Phone.UI.Core
Windows.Phone.UI.Input
Windows.Security.Authentication.OnlineId
Windows.Storage
Windows.Storage.FileProperties
Windows.Storage.Pickers
Windows.Storage.Search
Windows.Storage.Streams
Windows.System
Windows.System.Display
Windows.System.Threading
Windows.System.Threading.Core
Windows.UI
Windows.UI.Core
Windows.UI.Input
Windows.UI.Popups
Windows.UI.ViewManagement

返回顶部

本地:DirectX和C++ 与XAML和C#之间的互操作性

新的DirectX和C ++的支持的最酷的功能之一是它可以很容易地集成XAML和C#。 我们可以使用新的<DrawingSurface/>和<DrawingSurfaceBackgroundGrid/>控件混合XAML和DirectX

<DrawingSurface x:Name="DrawingSurface" />

因为DirectX的绘图表面可以是一个XAML页面中的另一个元素,我们可以很容易地整合它和其他XAML元素。这个简单的例子解释说明在DirectX DrawingSurface顶部放置一个按钮。

<Grid x:Name="LayoutRoot" Background="Transparent">
<DrawingSurface x:Name="DrawingSurface" />
<Button Margin="20" Content="Tell DirectX this button was clicked"
Height="70" VerticalAlignment="Top"/>
</Grid>

结果是,该按钮重叠在DirectX绘图表面,如下所示。它甚至重叠背景颜色。

WhatsNewWP8 5 XAML Button overlaying DirectX.png

XAML按钮覆盖DirectX 它也可以用于C++组件暴露专用端点为C#代码通信,反之亦然。 例如,在示例应用程序中,您可以在Direct3DInterop.h的头文件的头部暴露以下方法:

public:
Direct3DInterop();
Windows::Phone::Graphics::Interop::IDrawingSurfaceContentProvider^ CreateContentProvider();
 
// Event Handlers
void MyButtonWasClicked();

然后在Direct3DInterop.cpp中实现此方法,打印东西到调试控制台。

void Direct3DInterop::MyButtonWasClicked()
{
OutputDebugString(L"Button was clicked!");
}

你现在可以从C#代码中调用这个新方法。

private Direct3DInterop m_d3dInterop = new Direct3DInterop();
private void Button_Click_1(object sender, RoutedEventArgs e)
{
m_d3dInterop.MyButtonWasClicked();
}

调试应用程序,在调试控制台显示输出字符串。但首先,你需要,开始调试应用程序的本机代码库。要做到这一点,打开项目属性,并切换到本机调试器。

WhatsNewWP8 6 Changing App debugging to Native Only.png

更改应用程序调试为仅限本机 现在运行的应用程序,然后单击按钮,在输出窗口中,你会看到下面的调试信息:

WhatsNewWP8 7 Debug Output Window For button click passed to Cpp.png

输出窗口显示一个按钮被点击发送到C ++ 这告诉你XAML按钮点击做了一个C#到C ++代码库(该调用可能影响DirectX代码)互操作成功调用。DirectX和C++与XAML和C#的互操作性是非常强大的。

返回顶部

语音:文本到语音转换

文本到语音转换(TTS)现在内置到Windows Phone 8. TTS在前一Windows Phone版本从Bing使用在线服务是可能的。 如果你已经试过使用这个服务,你可能有多个问题:Bing翻译没有建立有质量的文本到语音的转换--因此语音听起来像机械似的—它还花费大量的工作来建立并且它还需求网络连接。所有的这些问题在WP8上解决了:TTS听起来很自然,有广泛语言支持。只需添加两行代码,并且可以没有数据连接离线工作。

“Hello world”TTS示例代码是很简单的
private async void TTS_HelloWorld(object sender, RoutedEventArgs e)
{
var text2speech = new SpeechSynthesizer();
await text2speech.SpeakTextAsync("OMG! Hello world!");
}

当你运行该应用程序你将听到Media:WhatsNewWP8 TTS HelloWorld.mp3

WP8关于TTS的一个很酷的事情是你可以改变用于读文本的声音。你有无数的语言和声音可以使用。不同的声音基于性别和文化,他们正在为其优化。本示例在一个简单例子中使用了所有安装的声音。

private async void TTS_AllVoices(object sender, RoutedEventArgs e)
{
foreach (var voice in InstalledVoices.All)
{
Debug.WriteLine(voice.DisplayName + ", " +
voice.Language + ", " +
voice.Gender + ", " +
voice.Description);
using (var text2speech = new SpeechSynthesizer())
{
text2speech.SetVoice(voice);
await text2speech.SpeakTextAsync("Hello world! I'm " + voice.DisplayName + ".");
}
}
}

当运行,你将听到 Media:WhatsNewWP8 TTS AllVoices.mp3


你也可以看到如下调试输出:

Microsoft Zira Mobile, en-US, Female, Microsoft Zira Mobile - English (United States)
Microsoft Stefan Mobile, de-DE, Male, Microsoft Stefan Mobile - German (Germany)
Microsoft George Mobile, en-GB, Male, Microsoft George Mobile - English (United Kingdom)
Microsoft Susan Mobile, en-GB, Female, Microsoft Susan Mobile - English (United Kingdom)
Microsoft Heera Mobile, en-IN, Female, Microsoft Heera Mobile - English (India)
Microsoft Ravi Mobile, en-IN, Male, Microsoft Ravi Mobile - English (India)
Microsoft Mark Mobile, en-US, Male, Microsoft Mark Mobile - English (United States)
Microsoft Katja Mobile, de-DE, Female, Microsoft Katja Mobile - German (Germany)
Microsoft Laura Mobile, es-ES, Female, Microsoft Laura Mobile - Spanish (Spain)
Microsoft Pablo Mobile, es-ES, Male, Microsoft Pablo Mobile - Spanish (Spain)
Microsoft Raul Mobile, es-MX, Male, Microsoft Raul Mobile - Spanish (Mexico)
Microsoft Sabina Mobile, es-MX, Female, Microsoft Sabina Mobile - Spanish (Mexico)
Microsoft Julie Mobile, fr-FR, Female, Microsoft Julie Mobile - French (France)
Microsoft Paul Mobile, fr-FR, Male, Microsoft Paul Mobile - French (France)
Microsoft Cosimo Mobile, it-IT, Male, Microsoft Cosimo Mobile - Italian (Italy)
Microsoft Elsa Mobile, it-IT, Female, Microsoft Elsa Mobile - Italian (Italy)
Microsoft Ayumi Mobile, ja-JP, Female, Microsoft Ayumi Mobile - Japanese (Japan)
Microsoft Ichiro Mobile, ja-JP, Male, Microsoft Ichiro Mobile - Japanese (Japan)
Microsoft Adam Mobile, pl-PL, Male, Microsoft Adam Mobile - Polish (Poland)
Microsoft Paulina Mobile, pl-PL, Female, Microsoft Paulina Mobile - Polish (Poland)
Microsoft Daniel Mobile, pt-BR, Male, Microsoft Daniel Mobile - Portuguese (Brazil)
Microsoft Maria Mobile, pt-BR, Female, Microsoft Maria Mobile - Portuguese (Brazil)
Microsoft Irina Mobile, ru-RU, Female, Microsoft Irina Mobile - Russian (Russia)
Microsoft Pavel Mobile, ru-RU, Male, Microsoft Pavel Mobile - Russian (Russia)
Microsoft Kangkang Mobile, zh-CN, Male, Microsoft Kangkang Mobile - Chinese (Simplified, PRC)
Microsoft Yaoyao Mobile, zh-CN, Female, Microsoft Yaoyao Mobile - Chinese (Simplified, PRC)
Microsoft Danny Mobile, zh-HK, Male, Microsoft Danny Mobile - Chinese (Traditional, Hong Kong S.A.R.)
Microsoft Tracy Mobile, zh-HK, Female, Microsoft Tracy Mobile - Chinese (Traditional, Hong Kong S.A.R.)
Microsoft Yating Mobile, zh-TW, Female, Microsoft Yating Mobile - Chinese (Traditional, Taiwan)
Microsoft Zhiwei Mobile, zh-TW, Male, Microsoft Zhiwei Mobile - Chinese (Traditional, Taiwan)

对于“文本到语音”的更细粒度的控制,你可以使用的的SSML格式优化语音,使它听起来像真人。使用示例来自W3C的网站的SSML

private async void TTS_SSML(object sender, RoutedEventArgs e)
{
var text2speech = new SpeechSynthesizer();
await text2speech.SpeakSsmlAsync(@"<speak version=""1.0""
xmlns="
"http://www.w3.org/2001/10/synthesis"" xml:lang=""en-US"">
<voice gender="
"female"">
Hi, this is Justin's computer...
</voice>
<voice age="
"6"">
Hello <prosody contour="
"(0%,+20Hz)(10%,+30%)(40%,+10Hz)"">world</prosody>
</voice>
</speak>"
);
}

运行本示例,你将听到 Media:WhatsNewWP8 TTS SSML.mp3


返回顶部

语音:语音到文本转换

语音到文字转换做成功是十分困难的。即使是在WP7上设计最好的解决方案也是古怪不可靠的,并且该技术从来没有被消费者使用。在Windows Phone8中,微软已经真正实现了带头作用,创造了一流的语音到文本转换API。大部分的处理发生在远程服务器上,因此,你将需要一个数据连接让它工作。 下面的代码是一个简单直接从UI运行的语音到文本识别会话

private async void STT_Freeform(object sender, RoutedEventArgs e)
{
SpeechRecognizerUI speechRecognizer = new SpeechRecognizerUI();
speechRecognizer.Settings.ExampleText = "Fine thanks";
speechRecognizer.Settings.ListenText = "How's it goin', eh?";
speechRecognizer.Settings.ReadoutEnabled = true;
speechRecognizer.Settings.ShowConfirmation = true;
SpeechRecognitionUIResult result = await speechRecognizer.RecognizeWithUIAsync();
if (result.ResultStatus == SpeechRecognitionUIStatus.Succeeded)
{
MessageBox.Show(result.RecognitionResult.Text);
}
}

所示的代码片段的操作如下面Media:WhatsNewWP8 STT Freeform.mp4所示:


一个非常有用的功能,这有助于进一步提高识别准确度,您可以从列表或从文件加载在一个语法限制支持的回答,如下:

private async void STT_FromList(object sender, RoutedEventArgs e)
{
SpeechRecognizerUI speechRecognizer = new SpeechRecognizerUI();
speechRecognizer.Settings.ExampleText = "Me, You, Everyone";
speechRecognizer.Settings.ListenText = "Who's awesome?";
speechRecognizer.Settings.ReadoutEnabled = true;
speechRecognizer.Settings.ShowConfirmation = true;
 
speechRecognizer.Recognizer.Grammars.AddGrammarFromList("answer",
new string[] { "You", "Me", "Everyone" });
 
SpeechRecognitionUIResult result = await speechRecognizer.RecognizeWithUIAsync();
if (result.ResultStatus == SpeechRecognitionUIStatus.Succeeded)
{
MessageBox.Show(result.RecognitionResult.Text);
}
}

现在当你运行该代码时,系统只识别来自语法列表中的。

WhatsNewWP8 10 Voice Recognition confirming spoken text.png

WP8语音识别确认口语文本

WhatsNewWP8 11 Voice Recognition confirming spoken text.png

WP8语音识别,确认口语文本 没有展现一个UI,也可以进行语音到文本的转换,这也是可能的。例如,下面的代码片段将对任何音频文件进行分析:

private async void STT_NonVisual(object sender, RoutedEventArgs e)
{
SpeechRecognizer speechRecognizer = new SpeechRecognizer();
SpeechRecognitionResult result = await speechRecognizer.RecognizeAsync();
MessageBox.Show("Heard \"" + result.Text + "\" with a confidence of " + result.TextConfidence);
}

你可以看到,该引擎可以应付,甚至我的古色古香的加拿大口音(Media:WhatsNewWP8 STT NonVisual.mp4)。

WhatsNewWP8 12 Voice Recognition confirming spoken text dictation canadian accent.png


WP8语音识别确认口语文本听写

返回顶部

语音:语音命令

应用程序现在可以注册语音命令,其既可以唤醒应用程序或从应用程序内使用语音命令。每个语音命令可以被分解成三个部分:应用程序名称,命令和它的短语列表。

WhatsNewWP8 13 Breaking down voice command structure.png

解析语音命令结构:应用程序的名称,命令和短语 在构建语音命令时,你需要开始创建VCD(语音命令定义)文件。对于一个简单的语音命令,创建这个简单的VCD,已经展示了使用所有这三个要素的命令。

<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0">
<CommandSet xml:lang="en-us">
 
<Example>Compute Pii to a billion places</Example>
 
<Command Name="ComputePii">
<Example>Compute Pii to a billion places</Example>
<ListenFor>Compute Pii to a {number} places</ListenFor>
<ListenFor>Compute Pii NOW</ListenFor>
<Feedback>Computing Pii...</Feedback>
<Navigate Target="MainPage.xaml"/>
</Command>
 
<PhraseList Label="number">
<Item>one</Item>
<Item>two</Item>
<Item>billion</Item>
</PhraseList>
 
</CommandSet>
</VoiceCommands>

正如你可以看到,这个文件的目的是定义一个命令,该命令连接到目标URI deeplink,并列出可以使用的命令短语。

注:您可能会问,为什么VCD不包括“My App”。这是因为应用程序的名称是来自提供的信息的WmAppManfiest文件。在已提交的应用程序的WP8商店后,开发中心将覆盖此应用程序的名称,因为它已在Windows Phone8商店上。 接下来,你必须注册此文件与操作系统,那么它知道识别语音指令。最好,这是在应用程序的启动时并只有一次,但在这个例子中,你可以在一个事件处理器中简单地注册XML。

private async void VoiceCommands(object sender, RoutedEventArgs e)
{
await VoiceCommandService.InstallCommandSetsFromFileAsync(
new Uri("file://" +
Windows.ApplicationModel.Package.Current.InstalledLocation.Path +
@"/ComputePiiVCD.xml",
UriKind.RelativeOrAbsolute));
MessageBox.Show(@"Hit the home key to go to the start screen.
Then press and hold the Windows button and say:
My App, Compute Pii to a Billion Places"
,
"Voice Commands registered.",
MessageBoxButton.OK);
}

最后,当语音命令调用应用程序时你必须处理该事件,。做到这一点需要重写OnNavigatedTo处理程序和显示一个所有的URI查询字符串参数的MessageBoxwith。请注意,一个真实世界的实现是创建自己的UriMapper,并用它来导航用户到正确的页面。

protected async override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (NavigationContext.QueryString.Any())
{
StringBuilder sb = new StringBuilder();
foreach (var key in NavigationContext.QueryString.Keys)
{
sb.AppendLine(key + ": " + NavigationContext.QueryString[key]);
}
MessageBox.Show(sb.ToString(), "Page Querystring", MessageBoxButton.OK);
}
}

最后,您运行的应用程序,注册命令,进入到主屏幕,然后说:“My App, Compute Pi to a Billion places”。

WhatsNewWP8 14 Dialogue confirming voice commands have been registered and how to use them.png

语音命令确认对话框已被注册,以及如何使用它们

WhatsNewWP8 15 Show apps with voice commands-myapp.png

使用语音命令列出应用程序

WhatsNewWP8 16 Starting an app with voice commands.png

使用语音命令来启动一个应用程序

WhatsNewWP8 17 Printout from starting an app with voice commands.png

可以使用语音命令来启动一个应用程序的打印输出 您可以Media:WhatsNewWP8 SpeechCommands.mp4该视频显示的语音命令操作或下面观看它: 返回顶部 本文翻译自:What's new in Windows Phone 8#Speech: Voice Commands

This page was last modified on 4 July 2013, at 08:31.
136 page views in the last 30 days.
×