Övning – Skapa ett text-till-tal-program med hjälp av en SSML-fil

Slutförd

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

  1. I Cloud Shell till höger skapar du en ny XML-fil som programmet ska läsa:

    code Shakespeare.xml
    
  2. 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.

  3. I elementet <speak> lägger du till följande XML för att definiera text som en-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 %.

  4. Lägg till följande XML efter föregående <voice> element för att definiera text som en-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.

  5. Lägg till följande XML efter föregående <voice> element för att definiera text som en-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.

  6. 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>
    
  7. 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

  1. Öppna filen Program.cs i Cloud Shell till höger:

    code Program.cs
    
  2. 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 och azureLocation 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.

  3. 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 och azureLocation med din nyckel och plats från den första övningen.

  4. 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

  1. Om du vill köra ditt program använder du följande kommando i Cloud Shell till höger.

    dotnet run
    
  2. 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.

  1. 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
    
  2. Logga in på Azure-portalen med samma konto som du använde för att aktivera sandbox-miljön.

  3. Välj Alla resurser på startsidan för Azure-portalen.

  4. När sidan Alla resurser visas väljer du ditt cloudshellNNNNNN-lagringskonto och väljer sedan Filresurser och sedan din cloudshellfilesNNNNN-filresurs.

    Screenshot showing the Cloud Shell file shares.

  5. När din cloudshellfilesNNNNNN-filresurssida visas väljer du Bläddra, väljer sedan Filen Shakespeare.wav och väljer sedan ikonen Ladda ned .

    Screenshot showing the file download link.

  6. Ladda ned Shakespeare.wav-filen till datorn, där du kan lyssna på den med operativsystemets ljudspelare.