Add voices on Windows 10 IoT Core (TTS)

Windows 10

In a recent project I had to use a Raspberry Pi B+ shipping the preview version of Windows IoT Core.

As the ‘preview’ word means, we don’t have access yet access to all of the capabilities of the embeded OS. This includes the ability to add language packs.

Note that normally, the tip is valid for any device running on the OS aforementioned

Command lines & in vitro alteration

The operating system, before flashing the ROM, is packed in a FFU image (Full Flash Update), digitally signed to prevent alterations of its content (so, a difficult way and especially illegal). Also, do not think about making this change “in vitro” as can be done with earlier versions of Windows (uh. Windows XP Coccinelle Windows XP for example).

Passing through the command prompt (via SSH) to try to execute the language pack installer (CLI version), lpksetup.exe was a failure too: the command finished properly, but after checksum (before/after) of the directories containing language resources, there was no difference. Also tested via a practical program in c# (remote debuged).

But so, what works?

To install new voices, the (good) method is much simpler than those of the top! Follow the guide.

The only prerequisite is to have a computer on Windows (>= 7 I think) and to have already the desired voices installed inside. To check the installed voice, open the Control Panel, speech recognition section, left pane, click on Advanced speech Options. The Text to Speech tab will tell you the voices installed on your system.

Psst, do you want more? This way Gordon! 

Once the voices you want are installed on your machine, go to: C:Windows\Speech_OneCore

An FTP server is natively installed. Be aware : the connection to the server is done without authentication, with full rights 😉 Yes I Know… In 2015. Fortunately this is a preview 🙂 Hoping that they will fix this major flaw.

NB: In this example, I want to install French voices. The procedure is obviously the same for any other voice.

So connect yourself with your favorite client and navigate to Windows\Speech_OneCore\Engines\TTS (from the board), copy the ‘en-US’ folder from C:Windows\Speech_OneCore\EnginesTTS (of the PC).

The second and final copy is less simple because it is in a System32’s subdirectory (permission set to 000 via FTP). This one concern the transfer of the metadatas (name, version… etc.) of the files previously transferred TTS folder.

Go therefore on /Windows/System32/Speech_OneCore (from the board) then move the ‘en-US’ folder from C:\Windows\System32\Speech_OneCore\Common (of the PC).

Yes I know, its place is in the Common  directory that is protected.

It is accessible via FTP, we will therefore pass through PowerShell. (Follow this tutorial if you never used PowerShell with your Pi), navigate to the directory where our misplaced folder is located.

A simple mv .\en-US\ .\Common\ will do the trick.

Restart the map and voila!

To see if this at work, a small universal project with:

public MainPage()
{
   this. InitializeComponent(); 
 
   var synt = new SpeechSynthesizer();

   foreach (var voice in SpeechSynthesizer.AllVoices)
   {
     Debug.WriteLine($"Name: {voice.DisplayName} Lang: {voice.Language} Type: {voice.Gender} Description : {voice.Description}");
   } 
}

Will give you the following output (normally: p):

Result

I assume this the same principle to change the language of the interface but I dont’t have too much time to experiment yet 🙂

If someone is hacking it on his side, I invite him to contact me to confirm the feasibility 😉