Övning – Skapa ett text-till-tal-program med hjälp av en SSML-fil
I den här övningen skapar du en XML-fil som innehåller Speech Synthesis Markup Language (SSML), som du använder för att anpassa ljudutdata från Azure AI-tal-API:erna.
Skapa en SSML-fil som programmet ska läsa
I Cloud Shell till höger skapar du en ny XML-fil som programmet ska läsa:
code Shakespeare.xml
När kodredigeraren visas anger du följande XML:
<speak xmlns="http://www.w3.org/2001/10/synthesis" version="1.0" xml:lang="en-US"> </speak>
Det här kodutdraget definierar rotelementet
<speak>
som ska innehålla en serie<voice>
element som anger andra röster som ska användas.I elementet
<speak>
lägger du till följande XML för att definiera text somen-GB-LibbyNeural
rösten ska läsa:<voice name="en-GB-LibbyNeural"> <prosody rate="-10%" pitch="-5%"> The following quotes are from act 2, scene 7, of William Shakespeare's play "As You Like It." </prosody> </voice>
Det här kodutdraget definierar ett
<voice>
element som anger en annan röst än standardvärdet och omsluter texten i ett<prosody>
element som saktar ned talfrekvensen med 10 % och sänker tonhöjden med 5 %.Lägg till följande XML efter föregående
<voice>
element för att definiera text somen-GB-RyanNeural
rösten ska läsa.<voice name="en-GB-RyanNeural"> <prosody rate="-5%" pitch="-10%"> <break time="1s" /> All the world's a stage, And all the men and women merely players: <break time="1s" /> They have their exits and their entrances; And one man in his time plays many parts, His acts being seven ages. </prosody> </voice>
Precis som i föregående kodutdrag definierar det här utdraget ett
<voice>
element som anger en annan röst och omsluter texten i ett<prosody>
element som ändrar talhastigheten och tonhöjden. Det här utdraget innehåller<break>
dock även element som lägger till pauser mellan fraser.Lägg till följande XML efter föregående
<voice>
element för att definiera text somen-IE-ConnorNeural
rösten ska läsa.<voice name="en-IE-ConnorNeural"> <prosody rate="-10%" pitch="-5%"> <break time="1s" /> Thou <phoneme alphabet="sapi" ph="s i eh s t">seest</phoneme> we are not all alone unhappy: <break time="1s" /> This wide and universal theatre Presents more woeful pageants than the scene Wherein we play in. </prosody> </voice>
Precis som de två sista kodutdragen definierar det här utdraget ett
<voice>
element som anger en annan röst och omsluter texten i ett<prosody>
element som ändrar talhastigheten och tonhöjden, och som även innehåller<break>
element som lägger till en paus mellan fraser. Men det här utdraget innehåller också ett<phoneme>
element som hjälper text till talmotor att uttala ett äldre engelskt ord som det kanske inte vet hur man uttalar.När du har lagt till all kod bör XML-filen likna följande exempel:
<speak xmlns="http://www.w3.org/2001/10/synthesis" version="1.0" xml:lang="en-US"> <voice name="en-GB-LibbyNeural"> <prosody rate="-10%" pitch="-5%"> The following quotes are from act 2, scene 7, of William Shakespeare's play "As You Like It." </prosody> </voice> <voice name="en-GB-RyanNeural"> <break time="1s" /> <prosody rate="-5%" pitch="-10%"> All the world's a stage, And all the men and women merely players: <break time="1s" /> They have their exits and their entrances; And one man in his time plays many parts, His acts being seven ages. </prosody> </voice> <voice name="en-IE-ConnorNeural"> <break time="1s" /> <prosody rate="-10%" pitch="-5%"> Thou <phoneme alphabet="sapi" ph="s i eh s t">seest</phoneme> we are not all alone unhappy: <break time="1s" /> This wide and universal theatre Presents more woeful pageants than the scene Wherein we play in. </prosody> </voice> </speak>
Spara dina ändringar genom att trycka på Ctrl+S för att spara filen och sedan på Ctrl+Q för att avsluta redigeraren.
Uppdatera koden för text till tal-programmet för SSML
Öppna filen Program.cs i Cloud Shell till höger:
code Program.cs
Lämna de befintliga
using
uttrycken oförändrade, men ersätt resten med följande kod, som ändrar programmet så att innehållet i en SSML-fil används i stället för en textfil.azureKey
Ersätt värdena ochazureLocation
med de som du kopierade i den första övningen.string azureKey = "ENTER YOUR KEY FROM THE FIRST EXERCISE"; string azureLocation = "ENTER YOUR LOCATION FROM THE FIRST EXERCISE"; string ssmlFile = "Shakespeare.xml"; string waveFile = "Shakespeare.wav"; try { FileInfo fileInfo = new FileInfo(ssmlFile); if (fileInfo.Exists) { string ssmlContent = File.ReadAllText(fileInfo.FullName); var speechConfig = SpeechConfig.FromSubscription(azureKey, azureLocation); using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null); var speechResult = await speechSynthesizer.SpeakSsmlAsync(ssmlContent); using var audioDataStream = AudioDataStream.FromResult(speechResult); await audioDataStream.SaveToWaveFileAsync(waveFile); } } catch (Exception ex) { Console.WriteLine(ex.Message); }
Det här kodutdraget är i stort sett detsamma som koden från föregående övning. De största skillnaderna är de rader som anger XML-filen i stället för textfilen och som använder
SpeakSsmlAsync()
metoden för att bearbeta SSML-koden.När du har ändrat koden bör filen likna följande exempel.
using System.Text; using Microsoft.CognitiveServices.Speech; using Microsoft.CognitiveServices.Speech.Audio; string azureKey = "ENTER YOUR KEY FROM THE FIRST EXERCISE"; string azureLocation = "ENTER YOUR LOCATION FROM THE FIRST EXERCISE"; string ssmlFile = "Shakespeare.xml"; string waveFile = "Shakespeare.wav"; try { FileInfo fileInfo = new FileInfo(ssmlFile); if (fileInfo.Exists) { string ssmlContent = File.ReadAllText(fileInfo.FullName); var speechConfig = SpeechConfig.FromSubscription(azureKey, azureLocation); using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null); var speechResult = await speechSynthesizer.SpeakSsmlAsync(ssmlContent); using var audioDataStream = AudioDataStream.FromResult(speechResult); await audioDataStream.SaveToWaveFileAsync(waveFile); } } catch (Exception ex) { Console.WriteLine(ex.Message); }
Precis som i föregående övning kontrollerar du att du uppdaterar värdena för variablerna
azureKey
ochazureLocation
med din nyckel och plats från den första övningen.Spara dina ändringar genom att trycka på Ctrl+S för att spara filen och sedan på Ctrl+Q för att avsluta redigeraren.
Köra ditt program
Om du vill köra ditt program använder du följande kommando i Cloud Shell till höger.
dotnet run
Om du inte ser några fel har programmet körts. Kontrollera genom att köra följande kommando för att hämta en lista över filer i katalogen.
ls -l
Du bör få ett svar som i följande exempel och du bör ha Filen Shakespeare.wav i listan med filer.
drwxr-xr-x 3 user user 4096 Oct 1 11:11 bin drwxr-xr-x 3 user user 4096 Oct 1 11:11 obj -rw-r--r-- 1 user user 1328 Oct 1 11:11 Program.cs -rw-r--r-- 1 user user 413 Oct 1 11:11 Shakespeare.txt -rw-r--r-- 1 user user 978260 Oct 1 11:11 Shakespeare.wav -rw-r--r-- 1 user user 1117 Oct 1 11:11 Shakespeare.xml -rw-r--r-- 1 user user 348 Oct 1 11:11 text to speech.csproj
Valfritt: Lyssna på WAV-filen
För att kunna lyssna på WAV-filen som ditt program skapade måste du först ladda ned den. Gör det med hjälp av följande steg.
I Cloud Shell till höger använder du följande kommando för att kopiera WAV-filen till din tillfälliga molnenhet:
cp Shakespeare.wav ~/clouddrive
Logga in på Azure-portalen med samma konto som du använde för att aktivera sandbox-miljön.
Välj Alla resurser på startsidan för Azure-portalen.
När sidan Alla resurser visas väljer du ditt cloudshellNNNNNN-lagringskonto och väljer sedan Filresurser och sedan din cloudshellfilesNNNNN-filresurs.
När din cloudshellfilesNNNNNN-filresurssida visas väljer du Bläddra, väljer sedan Filen Shakespeare.wav och väljer sedan ikonen Ladda ned .
Ladda ned Shakespeare.wav-filen till datorn, där du kan lyssna på den med operativsystemets ljudspelare.