<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>The Language of Technology</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/the_language_of_technology/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/feed.xml</link>
    <description>Blogging about natural user interaction and Microsoft interface design</description>
    <lastBuildDate>Wed, 17 Apr 2019 04:00:49 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Gesichtserkennung mit der Cognitive Services Face API</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/gesichtserkennung-mit-der-cognitive-services-face-api</link>
      <pubDate>Tue, 31 May 2016 07:33:24 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/?p=125</guid>
      <description><![CDATA[Microsoft Cognitive Services ist eine Sammlung an REST APIs und SDKs womit Entwickler - auch ohne...]]></description>
      <content:encoded><![CDATA[Microsoft Cognitive Services ist eine Sammlung an REST APIs und SDKs womit Entwickler - auch ohne Machine Learning-Experte zu sein - intelligente Funktionen, wie Bild-, Sprach- und Texterkennung, in ihre Anwendungen integrieren können.

In diesem Blogartikel werden wir lernen, wie man Schritt für Schritt eine eigene UWP App bauen kann, welche die Face API für Gesichtserkennung nutzt. Um das Tutorial nachzuvollziehen, könnt ihr auch den <a href="https://github.com/nicol3ta/face-detection">Code</a> von GitHub herunterladen.

Als erstes öffnen wir Visual Studio 2015 und erstellen ein neues Projekt. Dafür wählen wir als Vorlage eine leere Universelle Windows App (C#). Ich habe mein Projekt „FaceEmotion“ genannt und auf Enter gedrückt.

Fangen wir nun mit dem Frontend an. Dafür bauen wir eine einfache und schlichte UI, indem wir ein <code>RelativePanel</code> mit zwei Grids namens <code>LogoStackPanel</code> und <code>ImagePanel</code> erstellen.
<pre>&lt;Page
  x:Class="FaceEmotion.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:FaceEmotion"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d"&gt;

  &lt;RelativePanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"&gt;

  &lt;Grid Height="90" x:Name="LogoStackPanel" Background="#0078D7"
     RelativePanel.AlignRightWithPanel="True"
     RelativePanel.AlignLeftWithPanel="True"&gt;

  &lt;StackPanel Orientation="Vertical"
     HorizontalAlignment="Left"
     Margin="20,4,0,0"&gt;
  &lt;Image Height="24"
     Margin="2,0,0,0"
     HorizontalAlignment="Left"
     Source="Images/microsoftLogo.png" /&gt;
  &lt;TextBlock Text="Cognitive Serivces"
     FontSize="26"
     Foreground="WhiteSmoke"&gt;&lt;/TextBlock&gt;
  &lt;TextBlock Text="Face and Emotion Detection"
     FontSize="18"
     Foreground="WhiteSmoke"&gt;&lt;/TextBlock&gt;
  &lt;/StackPanel&gt;
  &lt;/Grid&gt;

  &lt;Grid x:Name="ImagePanel"
     RelativePanel.AlignLeftWith="LogoStackPanel"
     RelativePanel.Below="LogoStackPanel"&gt;

  &lt;Image x:Name="FacePhoto"
     Width="600"
     Height="800"
     Margin="20,10,40,44"
     Stretch="Uniform"
     VerticalAlignment="Top"
     HorizontalAlignment="Left" /&gt;

  &lt;Canvas Name="FacesCanvas"
     Margin="20,10,40,44" /&gt;

  &lt;Button x:Name="BrowseButton"
     Margin="20,5,0,10"
     Height="32"
     VerticalAlignment="Bottom"
     Content="Browse..."
     Click="BrowseButton_Click" /&gt;
  &lt;/Grid&gt;

  &lt;/RelativePanel&gt;
&lt;/Page&gt;
</pre>
Das erste Grid ist blau und beinhaltet das Logo, den Titel und den Untertitel der Anwendung.
Als Logo habe ich ein Bild mit dem Microsoft Logo genutzt, das ich in einem neuen Ordner "Images" hinzugefügt habe.
Das zweite Grid  besteht aus einem Knopf, womit die Nutzer später ein Bild hochladen können, dem Bild selbst und einer Canvas, damit wir dann die erkannten Gesichter darauf markieren können.

Als nächstes installieren wir das NuGet Package namens Microsoft.ProjectOxford.Face.

Die Face API erlaubt uns bis zu 64 Gesichter einschließlich bestimmter Merkmale in Bilder zu erkennen.
Die erkannten Gesichter werden als Rechtecke geliefert, die die Position der Gesichter innerhalb des Bildes in Pixelkoordinaten angibt.
Wir können außerdem Informationen über die Haltung, das Geschlecht und das Alter des erkannten Gesichts entnehmen. Natürlich handelt es sich hierbei um Schätzungen aufgrund von Gesichtsmerkmalen und nicht um exakte Daten.

Für unsere App möchten wir die Position des Gesichts, Id, Alter und Geschlecht der erkannten Person wissen. Deswegen erstellen wir eine neue Klasse <code>MyFaceModel</code> innerhalb von einem neuen Ordner namens Models.

In <code>MainPage.xaml.cs</code> referenzieren wir <code>Microsoft.ProjectOxford.Face</code> und wir erstellen einen <code>FaceServiceClient</code>.
<pre>namespace FaceEmotion.ViewModels
{
  class MyFaceModel
  {
    public object Age { get; internal set; }
    public string FaceId { get; internal set; }
    public FaceRectangle FaceRect { get; internal set; }
    public object Gender { get; internal set; }
  }
}
</pre>
<pre>private readonly FaceServiceClient faceServiceClient = new FaceServiceClient("replacewithyourkey");
</pre>
Wir implementieren die Methode <code>BrowseButton_Click</code> die auf Knopfdruck reagiert.
<pre>private async void BrowseButton_Click(object sender, RoutedEventArgs e)
{
  //Upload picture
  FileOpenPicker openPicker = new FileOpenPicker();
  openPicker.ViewMode = PickerViewMode.Thumbnail;
  openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
  openPicker.FileTypeFilter.Add(".jpg");
  openPicker.FileTypeFilter.Add(".jpeg");
  openPicker.FileTypeFilter.Add(".png");

  StorageFile file = await openPicker.PickSingleFileAsync();
  var bitmapImage = new BitmapImage();

  var stream = await file.OpenAsync(FileAccessMode.Read);
  bitmapImage.SetSource(stream);

  if (file != null)
  {
    FacePhoto.Source = bitmapImage;
    scale = FacePhoto.Width / bitmapImage.PixelWidth;
  }
  else
  {
    Debug.WriteLine("Operation cancelled.");
  }

  //Remove any existing rectangles from previous events
  FacesCanvas.Children.Clear();

  //DetectFaces
  var s = await file.OpenAsync(FileAccessMode.Read);
  List&lt;MyFaceModel&gt; faces = await DetectFaces(s.AsStream());
  var t = await file.OpenAsync(FileAccessMode.Read);
  DrawFaces(faces);
}
</pre>
FileOpenPicker ermöglicht dem Benutzer eine Datei auszuwählen. Wir lesen dann die ausgewählte Datei und legen sie als Quellbild fest.
<pre>//Remove any existing rectangles from previous events
FacesCanvas.Children.Clear();

//DetectFaces
var s = await file.OpenAsync(FileAccessMode.Read);
List&lt;MyFaceModel&gt; faces = await DetectFaces(s.AsStream());

DrawFaces(faces);
</pre>
Wir erstellen nun die Methode <code>DetectFaces</code>, wo wir <code>FaceServiceClient.DetectAsync</code> aufrufen, um die Gesichtserkennung zu starten.
Mögliche Ausnahmen behandeln wir mit einer Try-Catch Anweisung.
<pre>private async Task&lt;List&lt;MyFaceModel&gt;&gt; DetectFaces(Stream imageStream)
{
  var collection = new List&lt;MyFaceModel&gt;();
  var attributes = new List&lt;FaceAttributeType&gt;();
  attributes.Add(FaceAttributeType.Gender);
  attributes.Add(FaceAttributeType.Age);

  try
  {
    using (var s = imageStream)
    {
      var faces = await faceServiceClient.DetectAsync(s, true, true, attributes);
      foreach (var face in faces)
      {
       collection.Add(new MyFaceModel()
       {
       FaceId = face.FaceId.ToString(),
       FaceRect = face.FaceRectangle,
       Gender = face.FaceAttributes.Gender,
       Age = face.FaceAttributes.Age
       });
      }
    }
  }
  catch (InvalidOperationException e)
  {
    Debug.WriteLine("Error Message: " + e.Message);
  }
  return collection;
}
</pre>
In der Methode <code>DrawFaces </code>prüfen wir, ob Gesichter erkannt wurden und zeichnen dann die Rechtecke auf dem Bild.
<pre>private void DrawFaces(List&lt;MyFaceModel&gt; faces)
{
  //Check if there are any faces in this image
  if (faces != null)
  {
  //For each detected face
   for (int i = 0; i &lt; faces.Count; i++)
   {
    Rectangle faceBoundingBox = new Rectangle();

    //Set bounding box stroke properties
    faceBoundingBox.StrokeThickness = 3;

    //Highlight the first face in the set
    faceBoundingBox.Stroke = (i == 0 ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Colors.DeepSkyBlue));
    if (scale == 0)
    {
     scale = 1;
    }
    faceBoundingBox.Margin = new Thickness(faces[i].FaceRect.Left * scale, faces[i].FaceRect.Top * scale, 
                                           faces[i].FaceRect.Height * scale, faces[i].FaceRect.Width * scale);
    faceBoundingBox.Width = faces[i].FaceRect.Width * scale;
    faceBoundingBox.Height = faces[i].FaceRect.Height * scale;
    TextBlock age = new TextBlock();
    var predictedAge = Convert.ToInt32(faces[i].Age);

    // Acquire keys and sort them.
    var list = detectedEmotion.Keys.ToList();
    list.Sort();

    age.Text = faces[i].Gender + ", " + predictedAge;
    age.Margin = new Thickness(faces[i].FaceRect.Left * scale, (faces[i].FaceRect.Top * scale) - 20, 
                               faces[i].FaceRect.Height * scale, faces[i].FaceRect.Width * scale);
    age.Foreground = (i == 0 ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Colors.DeepSkyBlue));
    //Add grid to canvas containing all face UI objects
    FacesCanvas.Children.Add(faceBoundingBox);
    FacesCanvas.Children.Add(age);
   }
  }
  else
  {
   Debug.WriteLine("No faces identified");
  }
}
</pre>
Somit haben wir nun unsere App fertig und sind bereit, automatisch Gesichter in Bildern zu erkennen. Als nächsten Schritt können wir die Anwendung mit der Emotion Api erweitern, um auch die Gefühle der identifizierten Menschen zu ermitteln.

<a href="https://msdnshared.blob.core.windows.net/media/2016/05/FaceEmotion10.png"><img class="aligncenter size-full wp-image-146" src="https://msdnshared.blob.core.windows.net/media/2016/05/FaceEmotion10.png" alt="FaceEmotion10" width="627" height="594" /></a>

<!--more-->

Anwendungsbeispiele der Face API:
<a href="http://how-old.net/">How-Old.net</a>
<a href="https://www.projectmurphy.net/">Project Murphy</a>
<a href="http://celebslike.me/">Celebslike.me</a>
<a href="https://www.microsoft.com/en-us/garage/workbench-apps-details/Mimicker-Alarm/MimickerAlarm.aspx">Mimiker Alarm</a>

Mehr Informationen dazu: <a href="https://channel9.msdn.com/Series/Einfhrung-in-Cognitive-Services">Online Kurs "Einführung in Cognitive Services"</a>]]></content:encoded>
    </item>
    <item>
      <title>More Personal Computing</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/more-personal-computing</link>
      <pubDate>Sat, 12 Mar 2016 13:13:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2016/03/12/more-personal-computing/</guid>
      <description><![CDATA[Was bedeutet More Personal Computing?
Wir sprechen schon seit Anfang der 80er Jahre über den...]]></description>
      <content:encoded><![CDATA[<strong>Was bedeutet More Personal Computing?</strong>
<p style="text-align: justify">Wir sprechen schon seit Anfang der 80er Jahre über den persönlichen Computer (PC). Der PC wurde so genannt, weil er nicht nur für den professionellen Bereich eingesetzt wurde, sondern jedem den Zugang zur Technologie ermöglichen sollte. Die Computer waren damals allerdings nicht auf ihre Nutzer abgestimmt und somit nicht "persönlich" wie wir es heute verstehen. Nun beginnt eine neue Ära von "More Personal Computing". Durch die Anpassung der Technologie an den Menschen werden Mobilität und natürliche Interaktionen gefördert.</p>
<p style="text-align: justify">Bei More Personal Computing handelt es sich um innovative Eingabe- und Ausgabemethoden, die eine natürlichere Interaktion mit der Technologie erlauben, aber auch um Intelligenz.
Als Nutzer möchte ich ein System, das intelligent genug ist, um mir nur die Optionen anzubieten, die in meiner Situation Sinn machen und meinem Naturell entsprechen. Dafür ist es wichtig den Kontext des Nutzers zu verstehen und dabei nicht nur Ort und Uhrzeit berücksichtigen, sondern auch den Menschen und seine Emotionen.</p>
<p style="text-align: justify"></p>
<p style="text-align: center"><a href="https://msdnshared.blob.core.windows.net/media/2016/03/MPC_Sketch.png"><img class="aligncenter  wp-image-101" src="https://msdnshared.blob.core.windows.net/media/2016/03/MPC_Sketch-1024x576.png" alt="MPC" width="700" height="394" /></a></p>
<p style="text-align: left"><strong>Technologien</strong></p>
<span style="text-decoration: underline">Sprache</span>
<p style="text-align: justify">Entwickler können das <a href="https://dev.windows.com/de-de/speech">Speech SDK</a> benutzen, um ihre eigene App per Sprache steuern zu lassen. Aber nicht nur das - auch eine Sprachausgabe ist damit möglich.</p>
Weitere Links:
<ul>
	<li><a href="https://github.com/MicrosoftDXGermany/more-personal-computing/tree/master/CortanaBasics">Sample Code Speech</a></li>
	<li><a href="http://blogs.msdn.com/b/the_language_of_technology/archive/2015/04/29/sprachf-228-hige-apps-entwickeln-teil-2-die-speech-sdk.aspx">Blogartikel Sprachfähige Apps entwickeln</a></li>
</ul>
<div><span style="text-decoration: underline">Cortana</span></div>
<p style="text-align: justify"><a href="https://dev.windows.com/de-de/cortana">Cortana</a> ist Microsofts persönliche Assistentin, die den Nutzer bei verschiedenen Anforderungen und Aufgaben unterstützt. Wir können auch eigene Anwendungen mit Cortana erweitern und somit die Nutzereinbindung und Produktivität erhöhen.</p>
Weitere Links:
<ul>
	<li><a href="https://channel9.msdn.com/Events/Tech-Talk-Live/Cortana-fuer-Entwickler-Eigene-Apps-mit-Cortana-erweitern/Cortana-fuer-Entwickler?wt.mc_id=DX_59361">TechTalk Cortana für Entwickler</a></li>
</ul>
<span style="text-decoration: underline">Digitale Stifteingabe </span>
<p style="text-align: justify">Schreiben und Zeichnen beschreiben immer noch eine natürliche Art der Kommunikation. Die Verwendung eines Stifts ist in Windows 10 mehr denn je dem natürlichen Schreiben auf Papier nachempfunden. Mit <a href="https://msdn.microsoft.com/library/windows/apps/windows.ui.input.inking.directink.aspx">DirectInk</a> können Entwickler sehr einfach digitale Stifteingabe in ihre eigene Apps einbauen.</p>
<span style="text-decoration: underline">Gesten</span>
<p style="text-align: justify">In Windows 10 können wir eine direkte Manipulation mittels Touch ermöglichen, aber auch Gestensteuerung mit <a href="https://dev.windows.com/de-de/kinect">Kinect</a>.</p>
<span style="text-decoration: underline">Identität - Microsoft Passport und Windows Hello</span>
<p style="text-align: justify">Authentifizierung durch Passwörter ist nicht mehr ausreichend. Diese sind meistens schwer zu merken und werden daher oft wiederverwendet. Somit sind sie weniger sicher. Außerdem können Passwörter das Ziel von Replay Angriffen sein bzw. Benutzer können versehentlich ihre Passwörter aufgrund von Phishing-Angriffen verfügbar machen.</p>
<p style="text-align: justify"><a href="https://technet.microsoft.com/de-de/library/dn985839(v=vs.85).aspx">Microsoft Passport</a> erlaubt eine sichere zweistufige Authentifizierung durch eine PIN und/oder Windows Hello. Letzteres stellt eine biometrische Authentifizierung dar, so dass Nutzer sich per Fingerabdruck-, Gesichts- oder Iriserkennung anmelden können. Dabei werden die Biometriedaten verschlüsselt lokal gespeichert.</p>
<span style="text-decoration: underline">Project Oxford</span>
<p style="text-align: justify"><a href="https://www.projectoxford.ai/">Project Oxford</a> ist eine Sammlung von REST APIs und SDKs, mit der Entwickler intelligente Funktionen, wie Bild-, Sprach- und Texterkennung, in ihre Anwendungen integrieren können - auch ohne Machine Learning-Experte zu sein.</p>

<div>Weitere Links:</div>
<ul>
	<li><a href="https://www.projectoxford.ai/demo">https://www.projectoxford.ai/demo</a></li>
	<li><a href="http://blogs.msdn.com/controlpanel/blogs/posteditor.aspx/how-old.net/">how-old.net</a></li>
	<li><a href="https://channel9.msdn.com/Blogs/TechTalk/Episode-69-aus-Redmond-Project-Oxfords-Speech-API">TechTalk Project Oxford's Speech SDK</a></li>
	<li><a href="https://channel9.msdn.com/Blogs/TechTalk/Episode-74-Redmond-Project-Oxford-Vision-Face-and-Emotion-APIs">TechTalk Project Oxford- Vision, Face and Emotion APIs</a></li>
</ul>
<span style="text-decoration: underline">Microsoft Band</span>
<p style="text-align: justify">Mit <a href="https://developer.microsoftband.com/bandSDK">Microsoft Band</a> haben Entwickler Zugriff auf Sensordaten, wie Beschleunigung, UV-Strahlenintensität und Anzahl der zurückgelegten Schritte. Die SDK steht für die Plattformen iOS, Android und Windows zur Verfügung.</p>
Weitere Links:
<ul>
	<li><a href="https://github.com/MicrosoftDXGermany/more-personal-computing/tree/master/BandBasics">Sample Code Band</a></li>
	<li><a href="https://channel9.msdn.com/Blogs/TechTalk/Episode-37-Microsoft-Health-SDK?wt.mc_id=DX_59361">TechTalk Microsoft Health SDK</a></li>
</ul>
<p style="text-align: justify">All diese Technologien ermöglichen die Entwicklung von "more personal computing" und lassen uns schon heute die Zukunft erleben.</p>
<p style="text-align: center"></p>]]></content:encoded>
    </item>
    <item>
      <title>Adaptive User Interface in Windows 10</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/adaptive-user-interface-in-windows-10</link>
      <pubDate>Wed, 05 Aug 2015 23:45:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2015/08/05/adaptive-user-interface-in-windows-10/</guid>
      <description><![CDATA[Windows 10 Entwickler k&ouml;nnen ihre App auf vielen verschiedenen Ger&auml;ten mit jeweils eigener...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;">Windows 10 Entwickler k&ouml;nnen ihre App auf vielen verschiedenen Ger&auml;ten mit jeweils eigener Bildschirmgr&ouml;&szlig;e ausf&uuml;hren. Mit einem adaptiven UI k&ouml;nnen sie sicherstellen, dass die App trotzdem nutzerfreundlich bleibt und sich den Bed&uuml;rfnissen und dem Kontext des Nutzers anpasst.</p>
<p style="text-align: justify;">Zwei XAML Controls erleichtern das Entwickeln von adaptiven Benutzerschnittstellen, n&auml;mlich <span style="font-family: courier new,courier;">Adaptive Trigger</span> und <span style="font-family: courier new,courier;">Relative Panel.<br /><br /></span><strong>Adaptive Trigger</strong></p>
<p style="text-align: justify;">Schon vor Windows 10 konnten wir Visual States benutzen, um das Erscheinungsbild von Steuerelemente in bestimmten Zust&auml;nden zu definieren. Bisher konnte man jedoch einen State nur im Code aktivieren und die &Auml;nderungen der UI wurden als Animationen spezifiziert. Mittels <span style="font-family: courier new,courier;">Adaptive Trigger</span> k&ouml;nnen wir nun einen State innerhalb XAML ausl&ouml;sen und mit <span style="font-family: courier new,courier;">Setter</span> die Werte jeder Property &auml;ndern. <br />Somit k&ouml;nnen wir die Fenstergr&ouml;&szlig;e dynamisch ermitteln und als Reaktion darauf das Layout &auml;ndern.</p>
<p style="text-align: justify;"><strong>Relative Panel</strong></p>
<p style="text-align: justify;">Mit dem neuen XAML Control <span style="font-family: courier new,courier;">Relative Panel</span> k&ouml;nnen Entwickler, Steuerelemente im Verh&auml;ltnis zueinander oder zum Panel platzieren.<br />Wenn wir die <span style="font-family: courier new,courier;">State Trigger</span> und <span style="font-family: courier new,courier;">Setter</span> mit dem <span style="font-family: courier new,courier;">Relative Panel</span> verbinden, k&ouml;nnen wir auf eine sehr einfache Weise Elemente neu anordnen.</p>
<p style="text-align: justify;"><strong>Adaptive UI mit Adaptive Trigger und Relative Panel</strong></p>
<p style="text-align: justify;">Das Code-Snippet unten bezieht sich auf eine <a href="https://github.com/DanielMeixner/Windows10Highlights/tree/master/AdaptiveUIExample">Beispiel-App</a>, die zwei Visual States besitzt. Der <span style="font-family: courier new,courier;">NarrowState</span> wird aktiviert, falls die Bildschirmgr&ouml;&szlig;e kleiner 660 und gr&ouml;&szlig;er 1 ist. Der <span style="font-family: courier new,courier;">MediumLargeState</span> dagegen, falls das Fenster oder der Bildschirm gr&ouml;&szlig;er 660 ist. Die Gr&ouml;&szlig;e wird in der Einheit <a href="https://msdn.microsoft.com/de-de/library/windows/apps/dn958435.aspx">Effektive Pixel</a> gemessen. <br />Jedes Visual State Element kann eine Liste an <span style="font-family: courier new,courier;">StateTrigger</span> und eine Liste an <span style="font-family: courier new,courier;">Setter</span> enthalten.</p>
<p><span style="font-family: courier new,courier;">&lt;VisualStateManager.VisualStateGroups&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&lt;VisualStateGroup x:Name="WindowStates"&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp; &lt;VisualState x:Name="NarrowState"&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp; &lt;VisualState.StateTriggers&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;AdaptiveTrigger MinWindowWidth="1"/&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&lt;/VisualState.StateTriggers&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;VisualState.Setters&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Target="Title.(RelativePanel.Below)" Value="ImgUser1"&gt; &lt;/Setter&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Setter Target="Title.(RelativePanel.AlignLeftWith)" Value="ImgUser1"&gt; &lt;/Setter&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Setter Target="ImgUser1.(Source)" Value ="Images/CortanaUser1Cut.png"&gt; &lt;/Setter&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Setter Target="ImgUser1.(Width)" Value ="500"&gt; &lt;/Setter&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Setter Target="ImgUser2.(Source)" Value ="null"&gt; &lt;/Setter&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Setter Target="ImgUser3.(Source)" Value ="null"&gt; &lt;/Setter&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/VisualState.Setters&gt;</span><br /><span style="font-family: courier new,courier;"><span style="font-family: courier new,courier;">&nbsp; </span>&lt;/VisualState&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&lt;VisualState x:Name="MediumLargeState"&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp; &lt;VisualState.StateTriggers&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;AdaptiveTrigger MinWindowWidth="660"/&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&lt;/VisualState.StateTriggers&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;VisualState.Setters&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Target="Title.(RelativePanel.RightOf)" Value="ImgUser2"&gt; &lt;/Setter&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Setter Target="Title.(RelativePanel.AlignTopWith)" Value="ImgUser2"&gt; &lt;/Setter&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/VisualState.Setters&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&lt;/VisualState&gt;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&lt;/VisualStateGroup&gt;</span><br /><span style="font-family: courier new,courier;">&lt;/VisualStateManager.VisualStateGroups</span>&gt;</p>
<p style="text-align: justify;">Falls der Bildschirm gr&ouml;&szlig;er als 660 ist, werden drei Bilder auf der linken Seite und Text auf der rechten Seite gezeigt. Diese Elemente sind innerhalb eines Relative Panels gesetzt. Zum Beispiel steht der Textparagraph unterhalb des Titels und ist links auf derselben Linie wie der Titel ausgerichtet.</p>
<p style="text-align: left;"><span style="font-family: courier new,courier;">&lt;TextBlock x:Name="Content" RelativePanel.Below="Title" RelativePanel.AlignLeftWith="Title" &hellip;&gt;</span></p>
<p style="text-align: justify;">Sobald man aber das Fenster kleiner zieht, werden die drei Bilder durch das erste Bild in einem gr&ouml;&szlig;eren Format ersetzt. Der Text springt au&szlig;erdem unter das Bild. Daf&uuml;r habe ich einfach mittels <span style="font-family: courier new,courier;">Setter</span> die zwei Properties <span style="font-family: courier new,courier;">RelativePanel.Below</span> und <span style="font-family: courier new,courier;">RelativePanel.AlignLeft</span> ge&auml;ndert.&nbsp; <br />Dieselbe Darstellung der Elemente w&uuml;rde auch auf dem Smartphone sichtbar sein, so dass der Nutzer den Text einfach lesen kann.</p>
<p style="text-align: justify;"><span style="font-family: courier new,courier;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/0871.adaptiveUI3.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96/0871.adaptiveUI3.png"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/0871.adaptiveUI3.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96/0871.adaptiveUI3.png" alt="" border="0" /></a></span></p>
<p style="text-align: justify;">In diesem Blogpost haben wir gesehen, wie man eine adaptive Anwendung mittels <span style="font-family: courier new,courier;">Relative Panel</span> und <span style="font-family: courier new,courier;">Adaptive Trigger</span> mit sehr geringem Aufwand gestalten kann. Die Anpassung der UI an unterschiedliche Bildschirme ist ein wichtiger Bestandteil der Universal Windows Platform Apps und gew&auml;hrt dem Nutzer eine optimale User Experience.</p>
<p style="text-align: justify;">Weitere Infos zum Thema:</p>
<p style="text-align: justify;">&bull; <a href="https://msdn.microsoft.com/de-de/library/windows/apps/dn958435.aspx">Reaktionsf&auml;higes Design f&uuml;r Universal Windows Platform (UWP)-Apps &ndash; Grundlagen</a><br />&bull; <a href="https://channel9.msdn.com/Series/A-Developers-Guide-to-Windows-10/07">Video &uuml;ber "Adaptive UI" (englisch)</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Windows 10 Apps gestalten</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/windows-10-apps-gestalten</link>
      <pubDate>Wed, 08 Jul 2015 01:13:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2015/07/08/windows-10-apps-gestalten/</guid>
      <description><![CDATA[Dieser Blogpost besch&auml;ftigt sich mit der Windows 10 Preview und bezieht sich deshalb nur auf...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;"><em>Dieser Blogpost besch&auml;ftigt sich mit der Windows 10 Preview und bezieht sich deshalb nur auf den aktuellen Stand.</em></p>
<p style="text-align: justify;">Mit Windows 10 haben Entwickler die M&ouml;glichkeit, dieselbe Anwendung auf unterschiedlichen Ger&auml;te laufen zu lassen. Die Anwendung erreicht somit eine viel gr&ouml;&szlig;ere Anzahl an Nutzer mit sehr wenig zus&auml;tzlichem Programmieraufwand. Neben den vielen Vorteilen der Universal Windows Platform (UWP) muss aber auch mit der Herausforderung umgegangen werden, dass die Apps auf unterschiedlichen Bildschirmgr&ouml;&szlig;en und in verschiedene Nutzungskontexte benutzerfreundlich und zug&auml;nglich bleiben.</p>
<p style="text-align: justify;">Um die Benutzeroberfl&auml;che und die Funktionalit&auml;ten einer UWP Anwendung an die unterschiedlichen Ger&auml;te anzupassen, stellt Microsoft bestimmte Features zu Verf&uuml;gung.&nbsp; Entwickler werden mit integrierten Funktionen unterst&uuml;tzt, wie Effective Pixel, Plattformskalierung, universelle Eingabemethoden und Input Intelligence.</p>
<p style="text-align: justify;">Effective Pixel und Plattformskalierung stellen sicher, dass die Gr&ouml;&szlig;e der Anzeige- und Bedienelemente auf unterschiedlich gro&szlig;en Bildschirmen erhalten bleibt und dass Zeichens&auml;tze lesbar bleiben. Entwickler m&uuml;ssen sich daher keine Gedanken &uuml;ber die Pixeldichte oder den Abstand zum Bildschirm machen, da alles f&uuml;r sie automatisch geregelt wird.</p>
<p style="text-align: justify;">Dank der universellen Eingabemethoden und des Input Intelligence-Features werden Eingabemethoden und Steuerelemente automatisch angepasst. Zum Beispiel passt sich ein Dropdown Men&uuml; automatisch an die Eingabemethode an (siehe Bild). Bei Verwendung einer Maus wird das Men&uuml; komprimiert dargestellt, w&auml;hrend bei Toucheingabe der Inhalt auf einer gr&ouml;&szlig;eren Fl&auml;che dargestellt wird. Somit kann man es immer bequem bedienen.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/4338.dropdown.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96/4338.dropdown.png"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/4338.dropdown.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/300x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96/4338.dropdown.png" alt="" border="0" /></a></p>
<p style="text-align: justify;">Um die beste User Experience zu erschaffen, sollten Designer und Entwickler trotzdem explizit f&uuml;r verschiedene Displaygr&ouml;&szlig;en gestalten. Daf&uuml;r gibt es drei unterschiedliche Design-Ans&auml;tze.</p>
<p style="text-align: justify;">Responsive Design beschreibt die sukzessive &Auml;nderung der Gr&ouml;&szlig;e und Anpassung des Inhalts. So wird zum Beispiel ein Textfeld immer an die aktuelle Gr&ouml;&szlig;e des Bildschirms angepasst, ohne dadurch das Layout zu &auml;ndern.</p>
<p style="text-align: justify;">Die weitere Optimierung der Darstellung wird als Adaptive Design bezeichnet. Durch die Neuanordnung des Inhalts oder Einf&uuml;gen und Ersetzen von Bedienelemente kann der Bildschirm effektiver benutzt und die Navigation reduziert werden.</p>
<p style="text-align: justify;">Nat&uuml;rlich haben Entwickler immer noch die M&ouml;glichkeit eigene, stark anders gestaltete User Interfaces zu implementieren. Diese Technik wird als Tailored Design bezeichnet. Ein Beispiel daf&uuml;r w&auml;re, die individuelle Gestaltung von Ger&auml;ten, die mit einer Hand bedient werden k&ouml;nnen.</p>
<p style="text-align: justify;">In dem n&auml;chsten Artikel werde ich mich haupts&auml;chlich auf das Adaptive Design konzentrieren und erkl&auml;ren, wie man eine adaptive Benutzeroberfl&auml;che implementieren kann.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 Dinge die du über Kinect und Cortana wissen solltest</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/5-dinge-die-du-ber-kinect-und-cortana-wissen-solltest</link>
      <pubDate>Fri, 15 May 2015 05:18:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2015/05/15/5-dinge-die-du-ber-kinect-und-cortana-wissen-solltest/</guid>
      <description><![CDATA[1. Kinect ist nicht nur f&uuml;r SpieleDie meisten verbinden Kinect mit Xbox und sehen den Sensor...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;"><br /><strong>1. Kinect ist nicht nur f&uuml;r Spiele</strong><br />Die meisten verbinden Kinect mit Xbox und sehen den Sensor haupts&auml;chlich als Spielecontroller. In der Tat wurde Kinect 2010 als Zubeh&ouml;r von Xbox 360 auf dem Markt eingef&uuml;hrt. Seine vielf&auml;ltigen Einsatzm&ouml;glichkeiten sind schnell klar geworden und 2015 hat Microsoft ein SDK ver&ouml;ffentlicht, womit Entwickler auf die Daten des Sensors zugreifen k&ouml;nnen. Seitdem werden sehr viele spannende Projekte damit entwickelt. <br />Zum Beispiel nutzt das Physiotherapie Programm <a href="http://www.respondwell.com/">RespondWell</a> von Care Innovations die Kinect, um Patienten die Rehabilitation zu erleichtern und wirksam zu machen. Der Sensor stellt sicher, dass die Patienten die &Uuml;bungen richtig ausf&uuml;hren und verleiht Punkte, um sie zu motivieren. <br />&nbsp;<br /><strong>2. HoloLens basiert auf Kinect Technologie</strong><br />Es ist unbestreitbar, dass Kinect die Forschung beschleunigt und gro&szlig;e Auswirkungen auf den Umgang mit der digitalen Welt hat. HoloLens, der holographische Computer von Microsoft, nutzt Kinect-Technologie, um zum Beispiel die Umgebung des Nutzers zu erfassen. Somit kann die reale Welt mit digitalem Inhalt erweitert werden.<br />&nbsp;<br /><strong>3. Cortana ist eine k&uuml;nstliche Intelligenz</strong><br />Microsofts pers&ouml;nliche digitale Assistentin ist nicht nur "Spracherkennung" sondern viel mehr. Cortana basiert auf Bing und die Plattform verbindet Machine Learning, Data Mining, Spracherkennung und Spracherzeugung. <br />Die Assistentin hat das Wissen des Internets und die F&auml;higkeit zu lernen, um Nutzer immer besser unterst&uuml;tzen zu k&ouml;nnen.<br />Wenn wir Cortana eine Anfrage stellen, wird die Sprache erstmals in der Cloud mittels Spracherkennungs-Technologie in Text umgewandelt und dann wird der Sinn mittels Natural Language Processing interpretiert und entsprechend reagiert.&nbsp; <br />Cortana hat auch einen Notizbuch, genau wie eine reale Assistentin. Darin merkt sie sich die Interessen und Pr&auml;ferenzen des Nutzers, oft besuchte Orte oder Ruhezeiten, wenn der Nutzer nicht gest&ouml;rt werden mag. Nat&uuml;rlich sind diese Daten nur lokal gespeichert und der Nutzer kann jederzeit diese Informationen entziehen. <br />&nbsp;<br /><strong>4. Cortana erlaubt die Einbindung eigener Apps</strong><br />Was Cortana so besonders macht, ist meiner Meinung nach, auch die einzigartige M&ouml;glichkeit eigene Apps damit zu integrieren. Daf&uuml;r m&uuml;ssen Entwickler nur drei einfachen Schritten folgen. Mehr Informationen dazu gibt es in&nbsp;meinem vorherigen <a href="http://blogs.msdn.com/b/the_language_of_technology/archive/2015/03/11/sprachf-228-hige-apps-entwickeln-teil-1-cortana-integration.aspx">Blogbeitrag</a> &uuml;ber Cortana und das Speech SDK.<br />&nbsp;<br /><strong>5. Kinect und Cortana sind Natural User Interface-Technologien</strong><br />Natural User Interface (NUI) bezeichnet eine Schnittstelle die eine nat&uuml;rliche und direkte Bedienung des Systems erm&ouml;glicht. Sowohl Kinect, als auch Cortana sind Technologien, die diesen Trend vorantreiben. Mit Cortana k&ouml;nnen Nutzer auf eine nat&uuml;rliche Art und Weise kommunizieren. Statt "Wetter M&uuml;nchen morgen" k&ouml;nnen Nutzer Cortana direkt fragen "Brauche ich morgen einen Regenschirm?". Au&szlig;erdem besitzt Cortana eine Pers&ouml;nlichkeit, die diesen nat&uuml;rlichen Dialog unterst&uuml;tzt. <br />NUIs erlauben meistens unterschiedliche Interaktionsm&ouml;glichkeiten. Benutzer k&ouml;nnen zum Beispiel Kinect-Anwendungen mittels ihrem K&ouml;rper, Gestik, Gesichtsausdruck oder Sprache steuern. Diese Eingabemethoden k&ouml;nnen f&uuml;r unterschiedliche Situationen Sinn machen. Deswegen sollten sie am besten adaptiv sein und sich an den Nutzer und dessen Kontext anpassen.</p>]]></content:encoded>
    </item>
    <item>
      <title>Sprachfähige Apps entwickeln – Teil 2: Das Speech SDK</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/sprachfhige-apps-entwickeln-teil-2-das-speech-sdk</link>
      <pubDate>Wed, 29 Apr 2015 01:12:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2015/04/29/sprachfhige-apps-entwickeln-teil-2-das-speech-sdk/</guid>
      <description><![CDATA[In dem vorherigen Blogbeitrag habe ich erkl&auml;rt, wie man eigene Apps mit Cortana einbinden kann....]]></description>
      <content:encoded><![CDATA[<div style="text-align: justify;">In dem vorherigen Blogbeitrag habe ich erkl&auml;rt, wie man eigene Apps mit Cortana einbinden kann. Somit kann man zum Beispiel bestimmte Apps per Spracheingabe starten. Cortana leitet den Nutzer dann zur gew&uuml;nschten App weiter.</div>
<div style="text-align: justify;">Ab diesem Punkt &uuml;bernimmt das Speech SDK alle weiteren Aufgaben der Sprachsteuerung. Das bedeutet: Entwickler k&ouml;nnen das Speech SDK benutzen, um ihre eigene App per Sprache steuern zu lassen. Aber nicht nur das - auch eine Sprachausgabe ist damit m&ouml;glich.</div>
<div style="text-align: justify;">Nehmen wir die GasFinder App als Beispiel, die ich im vorherigen Blogbeitrag vorgestellt habe. Der Benutzer kann Cortana starten und sagen: 'Sprit Sucher finde die n&auml;chste g&uuml;nstige Tankstelle'. Cortana wird dann die App &ouml;ffnen und die n&auml;chste Tankstelle auf der Karte zeigen. Mittels Sprachsynthese wird dann das Ergebnis auch akustisch &uuml;bermittelt. Dar&uuml;ber hinaus wird der Benutzer gefragt, ob die Route angezeigt werden soll. Seine Antwort wird durch Spracherkennung festgestellt und entsprechend darauf reagiert.</div>
<div style="text-align: justify;">Wir m&uuml;ssen also zwei Bereiche genauer betrachten: die Spracherkennung und die Sprachsynthese.</div>
<div style="text-align: justify;">Sprachsynthese oder Text-to-Speech ist f&uuml;r die k&uuml;nstliche Nachbildung nat&uuml;rlicher Sprache zust&auml;ndig. Sie wandelt Text in Sprache um und nutzt daf&uuml;r eine computergenerierte Stimme. <br />Damit wir unsere App mit Spracherkennung erweitern k&ouml;nnen, m&uuml;ssen wir erstmal auf <span style="font-family: courier new,courier;">SpeechSynthesis</span> referenzieren.</div>
<div style="text-align: justify;"><span style="font-family: courier new,courier;">using Windows.Media.SpeechSynthesis;</span></div>
<div style="text-align: justify;">Nun k&ouml;nnen wir eine Methode <span style="font-family: courier new,courier;">SpeakText</span> implementieren, die den <span style="font-family: courier new,courier;">SpeechSynthesizer</span> benutzt, um einen Audio Stream aus Text herzustellen. <br />F&uuml;r den <span style="font-family: courier new,courier;">SpeechSynthesizer</span> k&ouml;nnen wir auch eine bestimmte Sprache festlegen. In diesem Fall habe ich mich f&uuml;r eine deutsche, weibliche Stimme entschieden, die &auml;hnlich zu Cortana klingt.<br />Den Audio Stream k&ouml;nnen wir schlie&szlig;lich mittels einem <span style="font-family: courier new,courier;">MediaElement</span> abspielen lassen.<br /><br /></div>
<div style="text-align: left;"><span style="font-family: courier new,courier;">private async Task SpeakText(string textToSpeak)</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;using (var speech = new SpeechSynthesizer())</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;//Retrieve the first German female voice</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;speech.Voice = SpeechSynthesizer.AllVoices.First(i =&gt; (i.Gender == VoiceGender.Female &amp;&amp; i.Description.Contains("Germany")));</span></div>
<div style="text-align: left;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;//Generate the audio stream from plain text</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;SpeechSynthesisStream ttsStream = await speech.SynthesizeTextToStreamAsync(textToSpeak);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;mediaPlayer.SetSource(ttsStream, ttsStream.ContentType);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;mediaPlayer.Play();</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;mediaPlayer.CurrentStateChanged += OnStateChanged;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><br /><span style="font-family: courier new,courier;">}</span></div>
<div style="text-align: left;"><span style="font-family: courier new,courier;"><br /></span></div>
<div style="text-align: justify;">Um die Aussprache zu verfeinern kann man auch Speech Synthesis Markup Language (SSML) einsetzen. <br />SSML ist ein W3C Standard f&uuml;r die Optimierung der Sprache. Damit kann man zum Beispiel die Tonh&ouml;he und die Geschwindigkeit anpassen.</div>
<div style="text-align: justify;">Die App kann somit sprechen, aber noch nicht zuh&ouml;ren. Daf&uuml;r m&uuml;ssen wir die <span style="font-family: courier new,courier;">SpeechRecognition</span> API nutzen.</div>
<div style="text-align: justify;"><span style="font-family: courier new,courier;">using Windows.Media.SpeechRecognition</span>;</div>
<div style="text-align: justify;">Wir implementieren eine Methode namens <span style="font-family: courier new,courier;">RecognizeSpeech</span>, die f&uuml;r die Spracherkennung zust&auml;ndig ist. <br />Innerhalb dieser Methode erstellen wir erstmal eine Instanz der <span style="font-family: courier new,courier;">SpeechRecognizer</span>-Klasse und verwenden die <span style="font-family: courier new,courier;">SpeechRecognizer.Constraints</span>-Eigenschaft, um Einschr&auml;nkungen f&uuml;r die Spracherkennung hinzuzuf&uuml;gen.<br />Es gibt unterschiedliche Einschr&auml;nkungen, die wir nutzen k&ouml;nnen. Zum Beispiel bietet sich f&uuml;r das Diktieren oder Websuche eine vordefinierte Grammatik an. Bei Verwendung dieser Grammatik wird die Spracherkennung remote durchgef&uuml;hrt. Deswegen ist in diesem Fall eine Internetverbindung n&ouml;tig. <br />Die benutzerdefinierte Grammatik ist hingegen lokal vorhanden und bietet unter Umst&auml;nden eine besser Leistung.<br />F&uuml;r unser Demo erstellen wir eine benutzerdefinierte Grammatik in Form einer Liste mit W&ouml;rter und Wortgruppen, namens <span style="font-family: courier new,courier;">listConstraint</span>. Diese enth&auml;lt die m&ouml;gliche Antworten vom Nutzer, die in einem Array namens <span style="font-family: courier new,courier;">possibleAnswers</span> enthalten sind. <br />Die <span style="font-family: courier new,courier;">listConstraint</span> m&uuml;ssen wir kompilieren indem wir <span style="font-family: courier new,courier;">CompileConstraintsAsync()</span> aufrufen. Nun k&ouml;nnen wir die Erkennung starten. Daf&uuml;r benutzen wir ein vordefiniertes User Interface, um Benutzern visuelles Feedback zu geben.&nbsp;</div>
<div style="text-align: justify;">&nbsp;</div>
<div style="text-align: left;"><span style="font-family: courier new,courier;">private async Task&lt;SpeechRecognitionResult&gt; RecognizeSpeech()</span><br /><span style="font-family: courier new,courier;">{</span><br /><span style="font-family: courier new,courier;">&nbsp; try</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;if (recognizer == null)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recognizer = new SpeechRecognizer();</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string[] possibleAnswers = { "Ja", "Klar", "Nat&uuml;rlich", "Nein", "Ne" };</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var listConstraint = new SpeechRecognitionListConstraint(possibleAnswers, "Answer");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recognizer.UIOptions.ExampleText = @"Bsp. 'ja','nein'";</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recognizer.Constraints.Add(listConstraint);</span></div>
<div style="text-align: justify;"><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;await recognizer.CompileConstraintsAsync();&nbsp;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;SpeechRecognitionResult result = await recognizer.RecognizeWithUIAsync();</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;return result;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;}</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;catch(Exception exception)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const uint HResultPrivacyStatementDeclined = 0x80045509;</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((uint)exception.HResult == HResultPrivacyStatementDeclined)</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var messageDialog = new Windows.UI.Popups.MessageDialog("You must accept the speech privacy policy");</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageDialog.ShowAsync().GetResults();</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.WriteLine("Error: " + exception.Message);</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;return null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br /><span style="font-family: courier new,courier;">}</span></div>
<div style="text-align: justify;"><br />Nachdem wir <span style="font-family: courier new,courier;">RecognizeSpeech</span> in der <span style="font-family: courier new,courier;">Listen</span>-Methode aufrufen, k&ouml;nnen wir pr&uuml;fen ob das gesprochene Wort erkannt wurde. Wir k&ouml;nnen auch abfragen, wie hoch die Konfidenz der Erkennung war und entsprechend reagieren. Schlie&szlig;lich, falls die Antwort des Nutzers erkannt wurde und positiv ist, wird die Route zur Tankstelle auf der Karte dargestellt.</div>
<div style="text-align: justify;">In diesem Blogbeitrag haben wir gelernt, wie man eine einfache Sprachinteraktion mithilfe von Sprachsynthese und Spracherkennung implementieren kann. <br />Weitere Informationen dazu und mehr Material &uuml;ber die Einbindung eigener Apps mit Cortana, gibt es auch auf folgende Webseiten:</div>
<ul>
<li>
<div style="text-align: justify;"><a href="http://www.windowsphone.com/de-de/features/meet-cortana/">Meet Cortana</a></div>
</li>
<li>
<div style="text-align: justify;"><a href="https://msdn.microsoft.com/de-de/library/dn630430.aspx">Schnellstart: Sprachbefehle mit Cortana</a></div>
</li>
<li>
<div style="text-align: justify;"><a href="https://msdn.microsoft.com/de-de/library/windows.media.speechsynthesis.aspx">Dokumentation: Speech Synthesis</a></div>
</li>
<li>
<div style="text-align: justify;"><a href="https://msdn.microsoft.com/de-de/library/dn720492.aspx">Schnellstart: Spracherkennung</a></div>
</li>
<li>
<div style="text-align: justify;"><a href="https://t.co/Niuf8jArHi">MVA Kurs: Sprachf&auml;hige Apps mit Cortana und der Speech SDK</a><br /><span style="line-height: 107%; font-family: arial,helvetica,sans-serif; font-size: small; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;" lang="EN-US"><br /></span></div>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Sprachfähige Apps entwickeln – Teil 1: Cortana Integration</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/sprachfhige-apps-entwickeln-teil-1-cortana-integration</link>
      <pubDate>Wed, 11 Mar 2015 08:01:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2015/03/11/sprachfhige-apps-entwickeln-teil-1-cortana-integration/</guid>
      <description><![CDATA[&nbsp;
Cortana ist Microsofts pers&ouml;nliche Assistentin, die den Nutzer bei verschiedenen...]]></description>
      <content:encoded><![CDATA[<p align="justify">&nbsp;</p>
<p align="justify">Cortana ist Microsofts pers&ouml;nliche Assistentin, die den Nutzer bei verschiedenen Anforderungen und Aufgaben unterst&uuml;tzt. Sie wurde im Dezember 2014 in Deutschland angek&uuml;ndigt und befindet sich noch in der Alpha-Phase. Neben einer Vielzahl an Funktionen, bietet Cortana auch die M&ouml;glichkeit, eigene Apps einzubinden. <br />Diese Blogserie zeigt, wie man sprachf&auml;hige Anwendungen mit Cortana und der Speech SDK entwickeln kann.</p>
<p align="justify">Ich werde nun anhand von einer Sample App in diesem ersten Blogartikel zeigen, wie man Schritt f&uuml;r Schritt eine Anwendung mit Cortana erweitern kann. In diesem Fall &uuml;berarbeite ich eine App namens GasFinder, die ich vor kurzem implementiert habe. Die App erm&ouml;glicht das Suchen und Finden von g&uuml;nstigen Tankstellen in der N&auml;he des Nutzers. Es handelt sich jedoch nur um eine Beispiel-App, die keine realen Daten enth&auml;lt, sondern nur exemplarisch immer eine erfundene Tankstelle als Ergebnis zur&uuml;ckgibt. Das Projekt ist auch auf <a href="https://github.com/nicol3ta/gasfinder-demo">github</a> verf&uuml;gbar.</p>
<p align="justify">F&uuml;r die Integration eigener Apps mit Cortana muss man haupts&auml;chlich drei Schritten folgen:</p>
<p align="justify">1. Eine Voice Command Definition (VCD) XML-Datei erstellen, die die Befehle enth&auml;lt. <br />2. Die VCD XML-Datei bei der App Inbetriebnahme registrieren. <br />3. Die Voice Commands entsprechend bearbeiten, falls die App mittels Cortana aktiviert wurde.</p>
<p align="justify">Als Erstes m&uuml;ssen wir also eine XML-Datei erstellen, die die Sprachbefehle enth&auml;lt. Diese VoiceCommandDefinition-Datei kann aus einem oder mehreren CommandSets f&uuml;r unterschiedliche Sprachen bestehen. F&uuml;r diese Demo habe ich nur ein Set f&uuml;r die deutsche Sprache erstellt. Dieses enth&auml;lt die Tags <span style="font-family: 'Courier New';">&lt;CommandPrefix&gt;</span>, <span style="font-family: 'Courier New';">&lt;Example&gt;</span>, <span style="font-family: 'Courier New';">&lt;Command&gt;</span> und mehrere <span style="font-family: courier;">&lt;PhraseList&gt;</span>s.</p>
<p align="justify">Als <span style="font-family: courier;">&lt;CommandPrefix&gt;</span> kannst du den Namen deiner Anwendung oder eine Kurzform davon eingeben. Der Nutzer wird sp&auml;ter damit deine Anwendung starten k&ouml;nnen. Da meine App einen englischen Namen hat, habe ich den Prefix "Sprit Sucher" gegeben.</p>
<p align="justify"><span style="font-family: 'Courier New';">&lt;Example&gt;</span> repr&auml;sentiert ein Beispiel auf der obersten Ebene, wie man mit deiner App interagieren kann. Dieses Beispiel erscheint auch, falls du Cortana "Was kann ich sagen?" fragst (siehe Bild unten).</p>
<p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/metablogapi/2555.waskannichsagen_36501655.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96-metablogapi/2555.waskannichsagen_5F00_36501655.png"><img style="float: none; margin-left: auto; display: block; margin-right: auto; border: 0px;" title="waskannichsagen" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/metablogapi/1680.waskannichsagen_thumb_0CDBD515.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96-metablogapi/1680.waskannichsagen_5F00_thumb_5F00_0CDBD515.png" alt="waskannichsagen" width="204" height="338" border="0" /></a></p>
<p align="justify"><span style="font-family: 'Courier New';">&lt;Command&gt;</span> beschreibt einen Befehl und enth&auml;lt ein weiteres Beispiel: <span style="font-family: courier;">&lt;Example&gt;</span>, gefolgt von dem was der Nutzer zu Cortana sagen kann: <span style="font-family: 'Courier New';">&lt;ListenFor&gt;</span>, wie Cortana darauf antwortet soll: <span style="font-family: 'Courier New';">&lt;Feedback&gt;</span> und welche Aktion sie ausf&uuml;hren soll: <span style="font-family: 'Courier New';">&lt;Navigate&gt;</span>.</p>
<p align="justify">&lt;ListenFor&gt; kann mehrere Ausdr&uuml;cke enthalten. Diese k&ouml;nnen dar&uuml;ber hinaus auch <span style="font-family: 'Courier New';">&lt;PhraseTopic&gt;</span> und <span style="font-family: 'Courier New';">&lt;PhraseList&gt;</span> enthalten.</p>
<p align="justify">Ich habe die XML-Datei "VCD" benannt und mit nur einem Befehl namens "NextStation" erweitert. Um unterschiedliche Varianten abzudecken, habe ich <span style="font-family: 'Courier New';">&lt;PhraseList&gt;</span> verwendet. Zum Beispiel k&ouml;nnte der Nutzer statt "finde" auch "suche" oder "vermittle" sagen und verstanden werden.</p>
<div id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6533cd3d-f79d-427c-9b94-b9a733897952" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="xml:firstline[1]">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1"&gt;
 &lt;CommandSet xml:lang="de-DE"&gt;
  &lt;CommandPrefix&gt;Sprit Sucher&lt;/CommandPrefix&gt;
  &lt;Example&gt; wo ist die n&auml;chste Tankstelle &lt;/Example&gt;

  &lt;Command Name="NextStation"&gt;
   &lt;Example&gt; wo ist die n&auml;chste Tankstelle &lt;/Example&gt;
    &lt;ListenFor&gt; wo {ist} die n&auml;chste Tankstelle&lt;/ListenFor&gt;
    &lt;ListenFor&gt; wo {ist} die n&auml;chste Tankstelle mit [billigem] {Sprit} &lt;/ListenFor&gt;
    &lt;ListenFor&gt; {finde} die n&auml;chste Tankstelle &lt;/ListenFor&gt;
    &lt;ListenFor&gt; {finde} die n&auml;chste Tankstelle mit [billigem] {Sprit} &lt;/ListenFor&gt;
    &lt;ListenFor&gt; {finde} die n&auml;chste Tankstelle mit g&uuml;nstigem {Sprit} &lt;/ListenFor&gt;
    &lt;ListenFor&gt; {finde} die g&uuml;nstigste Tankstelle [in meiner N&auml;he] &lt;/ListenFor&gt;
    &lt;Feedback&gt; Suche Tankstelle... &lt;/Feedback&gt;
    &lt;Navigate /&gt;
   &lt;/Command&gt;
    
   &lt;PhraseList Label="ist"&gt;
     &lt;Item&gt; befindet sich &lt;/Item&gt;
     &lt;Item&gt; finde ich &lt;/Item&gt;
     &lt;Item&gt; gibt es &lt;/Item&gt;
   &lt;/PhraseList&gt;

   &lt;PhraseList Label="finde"&gt;
     &lt;Item&gt; suche &lt;/Item&gt;
     &lt;Item&gt; finde &lt;/Item&gt;
     &lt;Item&gt; vermittle &lt;/Item&gt;
     &lt;Item&gt; entdecke &lt;/Item&gt;
   &lt;/PhraseList&gt;

   &lt;PhraseList Label="Sprit"&gt;
     &lt;Item&gt; Benzin &lt;/Item&gt;
     &lt;Item&gt; Sprit &lt;/Item&gt;
     &lt;Item&gt; E10 &lt;/Item&gt;
     &lt;Item&gt; Super &lt;/Item&gt;
     &lt;Item&gt; Super Plus &lt;/Item&gt;
     &lt;Item&gt; Diesel &lt;/Item&gt;
   &lt;/PhraseList&gt;

 &lt;/CommandSet&gt;
&lt;/VoiceCommands&gt;</pre>
</div>
<p align="justify">Um die erstellte XML-Datei beim Starten der App zu registrieren, muss man folgende Methode verwenden: <span style="font-family: 'Courier New';">await VoiceCommandManager.InstallCommandSetsFromStorageFileAsync(file);</span> wobei <span style="font-family: 'Courier New';">file</span> die VCD Datei ist. Daf&uuml;r habe ich eine Methode <span style="font-family: courier;">RegisterVoiceCommands()</span> im App.xaml.cs erstelllt, die ich dann in der <span style="font-family: 'Courier New';">OnLaunched()</span> -Methode aufrufe.</p>
<div id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e07d058a-fd76-4542-ad83-3acaabc4698c" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="c#">private async void RegisterVoiceCommands()
{
     Uri uriVoiceCommands = new Uri("ms-appx:///vcd.xml", UriKind.Absolute);
     StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(uriVoiceCommands);
     try
     {
	 await VoiceCommandManager.InstallCommandSetsFromStorageFileAsync(file);
     }
	catch (Exception ex)
    {
	 string errorMessage = String.Format(
         "An error was encountered installing the Voice Command Definition file: \r\n {0:x} \r\n {1}",
         ex.HResult,
         ex.Message);
         Debug.WriteLine(errorMessage);
    }
}</pre>
</div>
<p align="justify">In <span style="font-family: 'Courier New';">OnActivated</span> werden dann die Befehle bearbeitet. Man kann entweder abh&auml;ngig vom Befehl auf unterschiedliche Seiten der App navigieren oder immer auf eine bestimmte Seite navigieren und da die Befehle bearbeiten. Die letzte Variante ist auch die Vorgehensweise f&uuml;r unsere Demo-App. Wir pr&uuml;fen erstmal, ob die Anwendung mittels Cortana aktiviert wurde indem wir schauen, ob ActivationKind gleich VoiceCommand ist und springen dann zur MainPage.</p>
<div id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b6e75bd6-7763-456d-90bb-c43128d6576a" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="c#">protected override void OnActivated(IActivatedEventArgs args)
{
     CommonInitialize();
	
    Frame rootFrame = Window.Current.Content as Frame;
    Type navType = typeof(MainPage);

    if (args.Kind == ActivationKind.VoiceCommand)
    {
      VoiceCommandActivatedEventArgs vcArgs = (VoiceCommandActivatedEventArgs)args;
      Debug.Assert(rootFrame.Navigate(navType, vcArgs.Result), 
				  "Failed to create initial page");
    }
     // Ensure the current window is active
     Window.Current.Activate();
 }</pre>
</div>
<p align="justify">Somit sind wir mit der Integration von Cortana fertig. Diese wird nun die App GasFinder starten, sobald ein geeigneter Befehl erkannt wird. In den n&auml;chsten Blogartikeln werden ich euch vorstellen, wie man zwischen Sprach- und Text-Befehle unterscheiden kann und wie man den Dialog innerhalb der App&nbsp; mittels der Speech SDK weiterf&uuml;hren kann.</p>]]></content:encoded>
    </item>
    <item>
      <title>Gestenerkennung mit Kinect und Visual Gesture Builder</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/gestenerkennung-mit-kinect-und-visual-gesture-builder</link>
      <pubDate>Wed, 22 Oct 2014 00:18:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2014/10/22/gestenerkennung-mit-kinect-und-visual-gesture-builder/</guid>
      <description><![CDATA[Wir benutzen Gesten tagt&auml;glich zum Kommunizieren, sowohl implizit als auch explizit. So werden...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;">Wir benutzen Gesten tagt&auml;glich zum Kommunizieren, sowohl implizit als auch explizit. So werden zum Beispiel Taxis mit ausgestreckter Hand herangewinkt. Die Taxifahrer erkennen diese Geste und halten ihr Auto an. <br />&nbsp;<br />Auch in der digitalen Welt z&auml;hlt Gestensteuerung als eine nat&uuml;rliche Eingabemethode, weil sie intuitiv und direkt ist. Die <a href="http://kinectforwindows.com">Kinect</a> von Microsoft erm&ouml;glicht die Implementierung von Anwendungen mit Gestenerkennung. Um solche Gesten selbst zu erstellen, gibt es zwei M&ouml;glichkeiten. Man kann entweder heuristisch vorgehen und die Gestenerkennung im Code programmieren oder maschinelle Lernverfahren einsetzen, indem man das Tool Visual Gesture Builder (VGB) verwendet.<br />&nbsp;<br />VGB ist ein selbst&auml;ndiges Programm, das zusammen mit dem <a href="https://aka.ms/k4wv2previewsdk">Kinect SDK</a> heruntergeladen werden kann. Das Programm nutzt Machine Learning Algorithmen um Gesten zu identifizieren. Daf&uuml;r muss man im Grunde unterschiedliche Videos aufnehmen, in VGB hochladen und die gew&uuml;nschten Gesten markieren. Der gr&ouml;&szlig;te Vorteil gegen&uuml;ber dem heuristischen Ansatz ist, dass Gesten sehr schnell erstellt und bewertet werden k&ouml;nnen, noch bevor &uuml;berhaupt jeglicher Code geschrieben wird. Des Weiteren braucht man f&uuml;r die Bedienung des VGB keinen technischen Hintergrund und somit muss dieser Arbeitsschritt nicht von Programmierern durchgef&uuml;hrt werden.</p>
<p style="text-align: justify;">F&uuml;r das Aufnehmen der Gesten stellt Microsoft das Kinect Studio zur Verf&uuml;gung. Mit diesem Programm kann man Daten von dem Kinect Sensor aufnehmen und abspielen. Die Videos werden als xrf (im RAW-Format) oder xef-Datei gespeichert und k&ouml;nnen dann im VGB in einer neuen Solution hochgeladen werden. Falls die Videos im RAW-Format gespeichert wurden, m&uuml;ssen sie noch mit dem KSConverter in eine xef-Datei umgewandelt werden.<br />&nbsp;<br />Das Bild unten zeigt die Oberfl&auml;che des VGB Programms. Diese besteht aus unterschiedliche Fenstern und Men&uuml;-Optionen. Auf der linken Seite wird die Projektstruktur angezeigt. Eine Solution besteht aus unterschiedlichen Projekten, die jeweils einer bestimmten Geste zugeordnet sind. Jedes Projekt kann man au&szlig;erdem in einem Training- und einem Analyse-Bereich unterteilen. Empfehlenswert ist ungef&auml;hr 90% der aufgenommenen Videos f&uuml;r das Training zu benutzen und 10% f&uuml;r die Analyse.<br />Um ein neues Projekt hinzuzuf&uuml;gen, kann man auf der Solution rechtsklicken und dann aus dem Kontextmen&uuml; "Create New Project" ausw&auml;hlen. <br />Ein Projekt kann entweder auf AdaBoostTrigger oder RFRProgress beruhen. Mit dem ersten Verfahren wird festgelegt, ob der Nutzer eine bestimmte Geste durchf&uuml;hrt, w&auml;hrend mit dem zweiten der Fortschritt der durchgef&uuml;hrten Geste festgelegt wird.</p>
<p style="text-align: justify;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/5315.screenshot_VGB.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96/5315.screenshot_5F00_VGB.jpg"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/5315.screenshot_VGB.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96/5315.screenshot_5F00_VGB.jpg" alt="" border="0" /></a><br />Das Ansichtsfenster in der Mitte zeigt eine 2D und eine 3D Sicht des Videos, das gerade bearbeitet wird. Unterhalb befindet sich das Steuerungsfenster und auf der rechten Seite die Eigenschaften des Projekts oder der Aufnahmen.<br />&nbsp;<br />Das Markieren (taggen) der Videos bestimmt den Abschnitt, durch welche die Geste definiert wird und sollte aufmerksam durchgef&uuml;hrt werden. Tastenk&uuml;rzel k&ouml;nnen daf&uuml;r sehr hilfreich sein. Diese sind unterhalb des Steuerungsfensters versteckt. So kann man zum Beispiel Strg+HOME dr&uuml;cken, um den Cursor an den Anfang des Videos zu setzen und dann die rechte Pfeiltaste gedr&uuml;ckt halten um das Video zu markieren. Am Ende kann man im Falle eines AdaBoostTrigger-Projekts entweder Enter dr&uuml;cken um den ausgew&auml;hlten Abschnitt auf "true" zu setzen oder die Leertaste dr&uuml;cken um den Abschnitt auf "false" zu setzen.<br />&nbsp;<br />Zum Schluss kann man eine bestimmte Geste oder die ganze Datenbank (also die ganze Solution) builden und mittels Live Preview testen, ob die Gestenerkennung robust ist. Die erstellte gbd- oder gba-Datei kann dann abschlie&szlig;end in die Kinectanwendung eingebunden werden.<br />&nbsp;<br />Insgesamt bietet Visual Gesture Builder eine schnelle und einfache Methode eigene Gesten zu erstellen und steigert somit die Produktivit&auml;t. Am besten einfach gleich ausprobieren und eigene Gesten erstellen. ;)<br />&nbsp;<br />Weitere Quellen: <a href="https://onedrive.live.com/view.aspx?resid=1A0C78068E0550B5!77743&amp;app=WordPdf">VGB Whitepaper</a> (Englisch)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://channel9.msdn.com/Blogs/TechTalk/Episode-13-Visual-Gesture-Builder">TechTalk - Visual Gesture Builder</a>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://channel9.msdn.com/Blogs/k4wdev/Custom-Gestures-End-to-End-with-Kinect-and-Visual-Gesture-Builder#time=00h05m43s">Custom Gestures, Kinect for Windows v2 and the Visual Gesture Builder</a> (Englisch)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://msdn.microsoft.com/en-us/library/dn785304.aspx">VGB Documentation</a> (Englisch)</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>24 Hour Kinect Hackathon in Amsterdam</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/24-hour-kinect-hackathon-in-amsterdam</link>
      <pubDate>Thu, 11 Sep 2014 08:13:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2014/09/11/24-hour-kinect-hackathon-in-amsterdam/</guid>
      <description><![CDATA[Letzte Woche haben Technologiebegeisterte die Chance gehabt, ihre Ideen innerhalb des 24 Hour Kinect...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;">Letzte Woche haben Technologiebegeisterte die Chance gehabt, ihre Ideen innerhalb des<a href="http://difr.co/kinect-hackathon/"> 24 Hour Kinect Hackathons</a> zu verwirklichen. Das Event hat in Amsterdam stattgefunden und wurde von DARE TO DIFR und Microsoft gesponsert. Da ich selber die Gelegenheit hatte dabei zu sein und au&szlig;erdem von den Ergebnissen sehr begeistert war, habe ich mich entschieden einen kurzen Blogeintrag &uuml;ber den Kinect Hackathon zu schreiben.</p>
<p style="text-align: justify;">Schon vor Beginn des Hackathons hat die Veranstaltung <a href="http://www.dezwijger.nl/111948/nl/sign-of-time-5-get-kinected">Sign of Time 5: Get Kinected</a> f&uuml;r Inspiration gesorgt. Donnerstagabend, am 04. September, wurde im Parkhuis de Zwijger sowohl die <a href="http://www.microsoft.com/en-us/kinectforwindows/">Microsoft Kinect</a>, als auch eindrucksvolle Kinect Showcases vorgestellt. Das Event war ein kleiner Vorgeschmack auf das, was kommen sollte. Ben Lower (Kinect Community Manager bei Microsoft) hat den neuen Sensor pr&auml;sentiert, w&auml;hrend Jerry Lieveld, der Gr&uuml;nder und Chief Creative von DARE TO DIFR, seine Erfahrungen aus dem Bereich UX mit dem Publikum geteilt hat. Microsoft Kollegen aus Indien haben au&szlig;erdem eine tolle Infotainment-Plattform namens "Ripple" gezeigt. Anschlie&szlig;end hat der Entwickler und Designer, Edwin Jakobs, eine Auswahl an kreativen Arbeiten von <a href="http://lustlab.net/">LUSTLab</a> vorgestellt.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/7183.WP_20140904_20_02_59_Pro1.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96/7183.WP_5F00_20140904_5F00_20_5F00_02_5F00_59_5F00_Pro1.jpg"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/96/7183.WP_20140904_20_02_59_Pro1.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-96/7183.WP_5F00_20140904_5F00_20_5F00_02_5F00_59_5F00_Pro1.jpg" alt="" border="0" /></a></p>
<p style="text-align: justify;">Der Hackathon hat Freitag um 10 Uhr mit Fr&uuml;hst&uuml;ck und einer kurzen Vorstellung der Agenda angefangen. Ben Lower erl&auml;uterte nachher die neuen Features des Kinect v2 Sensors und zeigte Beispiele, wie man den Sensor einsetzen kann.<br />Die Teilnehmer durften dann Projekt-Ideen pitchen und Teams bilden. Gegen 13 Uhr fing langsam das Hacken an. Ger&auml;te und Arbeitsumgebungen wurden eingerichtet und Konzepte bearbeitet. Menschen aus unterschiedlichen L&auml;ndern und mit verschiedenen Vorkenntnisse kamen zusammen, um an innovativen und kreativen Projekten gemeinsam zu arbeiten.<br />24 Stunden wurde flei&szlig;ig gehackt und viele Teilnehmer waren so engagiert, dass sie komplett auf Schlaf verzichtet haben. Samstag um 13 Uhr wurden dann die Ergebnisse pr&auml;sentiert.<br />Alle Projekte waren sehr gut und originell. Dabei wurden unterschiedliche Bereiche, wie Medizin und Unterhaltung, abgedeckt. Ein Team aus Berlin hat zum Beispiel ein Spiel entwickelt, welches auch f&uuml;r medizinische Diagnostik benutzt werden kann. <br />Auch zus&auml;tzliche Gadgets, wie das Oculus Rift, wurden verwendet. Dadurch entstanden w&auml;hrend des Hackathons sehr unterschiedliche kreative Konzepte.</p>
<p style="text-align: justify;">Den ersten Platz hat das Team Hoog+Diep mit dem Projekt <a href="https://vimeo.com/105801610">My First Little Toy Story 3D</a> gewonnen. Die Idee dahinter ist einen eigenen Film auf einer sehr einfachen Weise zu erstellen. Daf&uuml;r werden Spielzeuge verwendet, die vorher mit der Kinect eingescannt wurden. Die Anwender k&ouml;nnen dann zum Beispiel mit wenig Aufwand einen Film mit den Spielzeugen nachstellen. Die Anwendung erkennt die menschliche K&ouml;rper und schneidet sie aus dem Endprodukt aus, so dass nur die Spielzeuge zu sehen sind. Somit bekommt man anschlie&szlig;end eine einfache, aber sch&ouml;ne Animation.</p>
<p style="text-align: justify;">Insgesamt war es sehr spannend zu sehen, was sich die Teilnehmer f&uuml;r Einsatzm&ouml;glichkeiten der Kinect &uuml;berlegt haben. <br />Der Sensor erm&ouml;glicht neue Interaktionskonzepte und Hackathons sind eine wunderbare Gelegenheit eigene, kreative Ideen greifbar zu machen.</p>]]></content:encoded>
    </item>
    <item>
      <title>Digital, but Natural</title>
      <link>https://docs.microsoft.com/archive/blogs/the_language_of_technology/digital-but-natural</link>
      <pubDate>Sun, 24 Aug 2014 01:37:00 GMT</pubDate>
      <dc:creator><![CDATA[Nicoleta Mihali]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/the_language_of_technology/2014/08/24/digital-but-natural/</guid>
      <description><![CDATA[In der letzten Zeit wird viel von Natural User Interfaces, kurz NUI, gesprochen und wie wir damit...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;">In der letzten Zeit wird viel von Natural User Interfaces, kurz NUI, gesprochen und wie wir damit immer weniger die Grenze zwischen der realen Welt und der virtuellen Welt bewusst wahrnehmen. Das Ziel von NUI ist eine m&ouml;glichst nat&uuml;rliche Interaktion zwischen Mensch und Maschine, und somit eine intuitivere und benutzerfreundlichere Erfahrung f&uuml;r den Nutzer. <br />&nbsp;<br />Der Wandel von traditionellen grafischen Benutzeroberfl&auml;chen (GUI) zu NUIs hat in den letzten zehn Jahren zugenommen. Tastatur und Maus werden schrittweise durch direkte Eingabemethoden, wie zum Beispiel Touch und Sprachsteuerung erweitert oder ersetzt. Die Bedienung soll somit effizienter und intuitiver sein.<br />&nbsp;<br />NUI basiert auf menschlichen F&auml;higkeiten, wie Ber&uuml;hrung, Sehen, Gestik, Handschrift und Sprache. Ein gutes nat&uuml;rliches Interface soll sich aber nicht nur auf eine von diesen Modalit&auml;ten beschr&auml;nken, sondern unterschiedliche Eingabemethoden unterst&uuml;tzen.<br />Nehmen wir das Smartphone als Beispiel. W&auml;hrend man Auto f&auml;hrt, kann Spracheingabe sehr n&uuml;tzlich sein, um das Ger&auml;t zu bedienen. Sobald man jedoch in einem &ouml;ffentlichen Raum ist, wie beispielsweise in einer Bibliothek, k&ouml;nnte die Nutzung der Tastatur geeigneter sein.<br />Dementsprechend sollte NUI adaptiv sein und sich an den Kontext und die Bed&uuml;rfnisse des Nutzers anpassen.<br />&nbsp;<br />Es gibt nat&uuml;rlich auch unterschiedliche neue Herausforderungen die NUI mit sich bringt. Zum Beispiel geh&ouml;ren Gesten zu unserer nat&uuml;rlichen Verhaltensweise und k&ouml;nnen auch automatisch erfolgen, ohne dass wir eine bestimmte Absicht haben. In diesem Fall muss das System den Kontext entsprechend analysieren, um falsche Reaktionen zu vermeiden.<br />So kann zum Beispiel durch Erkennung der Blickrichtung des Nutzers festgestellt werden, ob er mit dem System interagieren will oder nicht.</p>
<p style="text-align: justify;">Ein weiterer wichtiger Aspekt, den man ber&uuml;cksichtigen sollte ist Barrierefreiheit. Wie kann NUI am besten eingesetzt werden um Menschen mit Behinderungen zu unterst&uuml;tzen? Beziehungsweise wie sollte es angepasst werden? Durch den richtigen Einsatz von NUI k&ouml;nnte Technologie f&uuml;r jeden zug&auml;nglich sein.</p>
<p style="text-align: justify;">Ein Beispiel f&uuml;r eine Windows App, die mit einer zus&auml;tzlichen nat&uuml;rlichen Eingabemethode erweitert wurde, ist <a href="http://apps.microsoft.com/windows/de-de/app/bing-food-drink/fa01a69f-eb9f-4f1c-a83c-5344200dc045">Bing Kochen und Genuss</a>. Die Anwendung erm&ouml;glicht das Aktivieren des Freihand-Modus, so dass der Nutzer nur mit einer Handbewegung die Seiten des Kochbuchs wenden kann. <br />Das Umbl&auml;ttern mittels Gestiksteuerung kann w&auml;hrend dem Kochen sehr praktisch sein, um den Bildschirm sauber zu halten.</p>
<p style="text-align: justify;">Viel mehr M&ouml;glichkeiten bietet Kinect an, ein Produkt von Microsoft, das Gesichtserkennung, sowie Sprach- und Gestenerkennung beinhaltet. <br />Kinect ist als Erweiterung von Xbox auf dem Markt erschienen. Nutzer k&ouml;nnen K&ouml;rperbewegungen, Mimik und Sprachbefehlen nutzen und so auf eine nat&uuml;rliche Weise das Spiel steuern.<br />Obwohl Kinect erst nur f&uuml;r den Spielbereich gedacht war, wurde sein Potential schnell erkannt und ab 2012 mittels Kinect for Windows auch in anderen Industriebereichen eingesetzt. <br />&nbsp;<br />Ab diesem Jahr ist eine neue Version von Kinect verf&uuml;gbar. <a href="http://kinectforwindows.com/">Kinect v2</a> besitzt im Gegensatz zu ihrem Vorg&auml;nger eine HD Farbkamera, eine Tiefenkamera, die auf der Time-Of-Flight Technologie basiert, sowie verbesserte Mikrofone. Damit k&ouml;nnen nun bis zu sechs Personen mit 25 Gelenkpunkten erkannt werden. <br />&nbsp;<br />Weitere Details der Kinect Technologie werde ich in zuk&uuml;nftigen Blogs abdecken.<br />Ich hoffe, dieser Artikel &uuml;ber NUI hat euer Interesse geweckt und hat euch geholfen einen ersten &Uuml;berblick zu gewinnen.<br />&nbsp;</p>
<p style="text-align: justify;">Weitere Infos zum Thema:</p>
<p style="text-align: justify;"><a href="http://www.jnd.org/dn.mss/natural_user_interfa.html">Natural User Interfaces Are Not Natural &ndash; Donald A. Norman</a><br /><a href="http://books.google.co.uk/books?hl=en&amp;lr=&amp;id=ID0L0EI79-YC&amp;oi=fnd&amp;pg=PP2&amp;dq=Natural+User+interfaces&amp;ots=07_BMigP3T&amp;sig=-nwS1vokvI7TnfFVDurpxIJQEsg">Brave NUI World: Designing Natural User Interfaces for Touch and Gesture - Daniel Wigdor, Dennis Wixon</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>