Använda Microsoft Azure Speech-tjänsten för att extrahera text från en ljudfil

Sidan uppdaterad :
Datum för skapande av sida :

Miljö för driftskontroll

Microsoft Azure rösttjänster
  • Juli 2022-upplagan
Visual Studio
  • Visual Studio 2022
.NET
  • 6.0

förutsättning

Innan du kan verifiera att dessa tips fungerar måste du:

Om provmaterial

Vi lånar ljudfiler från följande webbplats. Den ingår inte i exempelkoden.

Externa länkar

Först

Som ett exempel, för att spela in innehållet i mötet etc., spelas innehållet i konversationen in, och senare för att skapa mötesprotokollet hörs det inspelade ljudet och transkriberas till text. Det är dock lätt att föreställa sig att det är mycket besvärligt att skriva ner innehållet i konversationen i en mening.

Så här använder du Microsoft Azure Speech-tjänsten för att automatiskt exportera och mata ut taldata till text. I föregående exempel är det en inspelning av mötet, men i detta Tips extraheras det från ljudfilen så att det kan tillämpas på allt som innehåller konversationsinnehåll.

Den här gången talar vi också om att transkribera till text, Du kan också använda Microsoft Azure rösttjänst för att konvertera och översätta under inspelning.

Om avgifter

Den här gången kommer vi att använda gratisplanen, så även om du försöker använda kommer du inte att debiteras. Gratisplanen har dock tids- och karaktärsgränser, så om du behöver mer konvertering efter att du faktiskt har använt den, vänligen ändra till en betald plan.

Se följande officiella sida för prissättning. Eftersom det är en molntjänst kan avgiften variera beroende på säsong.

Få åtkomst till Microsoft Azure-portalen

Få åtkomst till följande URL i en webbläsare:

Om du redan är inloggad är du klar. Om du inte redan är inloggad visas följande skärm, så logga in.

När du loggar in visas följande skärm. Beroende på vilken design du ställer in kan skärmen vara annorlunda.

Skapa en rösttjänst i Microsoft Azure

Om du anger "röst" i sökinmatningsfältet ovanför portalen kommer "rösttjänst" ut, så välj det.

「Cognitive Services | När skärmen "Voice Service" visas väljer du "Skapa".

Skärmen "Skapa taltjänster" öppnas, så ange nödvändiga objekt.

Grundfraser

Exempel på
indatainnehåll för objekt
abonnemang Välj de prenumerationer som du vill betala för. Även om det är gratis måste du alltid knyta det till någon form av prenumeration.
Resursgrupper Anger i vilken resursgrupp rösttjänsten som ska skapas ska inkluderas. Om du inte har skapat en ännu, vänligen skapa en från "Ny" nedan. Du kan tänka på resursgrupper som grupperingar när du skapar olika tjänster.
Region Välj nära en plats där du kanske använder den oftast. Observera dock att priserna kan variera beroende på region. Japan, östra
Namn Alla namn för den här rösttjänsten. Om du skapar mer än en rösttjänst kontrollerar du att namnet är beskrivande. Det här namnet är globalt och unikt, så du kan inte använda ett namn som används någon annanstans. SpeechToText-Test
Prisnivå Om du vill använda den gratis väljer du "Free F0". Om du vill använda den mot en avgift, välj en annan plan. Naturligtvis finns det begränsningar om det är gratis. Gratis F0

När du har angett väljer du Nästa: > nedan.

nätverk

Exempel på
indatainnehåll för objekt
sort Anger det intervall från vilket den här rösttjänsten är tillgänglig. Om du vill kunna komma åt den var som helst utan några detaljerade inställningar, välj "Inklusive Internet ...". "Kan nås var som helst" betyder också "vem som helst kan komma åt den", men i själva verket bara de som har "nyckeln" som ska förvärvas efter detta kan komma åt den, så det är inte så mycket ett problem när det gäller säkerhet. Inklusive Internet ...

När du har angett det väljer du Nästa: > nedan.

Identitet

Exempel på
indatainnehåll för objekt
Systemtilldelat hanterat ID Den här gången använder jag rösttjänsten ensam, så det är bra att stänga av den. bort
Användartilldelat hanterat ID Jag behöver inte lägga till den eftersom jag inte skapar en användare den här gången. utan

När du har angett det väljer du Nästa: Tagga > nedan.

tagg

Eftersom taggen inte används den här gången är den inte inställd.

När du har angett väljer du Nästa: Granska och skapa > nedan.

Granska och skapa

Om det inte finns några problem med indatainnehållet visas "Valideringen lyckades". Om det finns ett problem visas ett felmeddelande, så gå tillbaka och ställ in det igen.

Om det inte finns några problem med inmatningsinnehållet klickar du på knappen "Skapa". Sedan börjar distributionen.

Efter ett tag är distributionen klar och följande skärm visas. Distributionsnamnet är långt, men du behöver inte oroa dig för det eftersom det är tillfälligt i distributionen.

Du kan klicka på knappen Gå till resurs för att kontrollera att rösttjänsten har skapats.

Generera och hämta nycklar

En autentiseringsnyckel krävs för att komma åt den här rösttjänsten från klienten. Eftersom det endast är tillgängligt för programmet som har den här nyckeln är det nödvändigt att förhindra att den här nyckeln blir stulen av en tredje part.

"Klient" här avser alla program som använder Microsoft Azure, till exempel skrivbordsappar, smartphone-appar och webbappar.

För att få nyckeln, gå till rösttjänsten du skapade. Den kan nås från instrumentpaneler, resursgrupper och så vidare.

När sidan Rösttjänster öppnas väljer du Nycklar & slutpunkter på menyn till vänster.

Sedan öppnas sidan "Nyckel och slutpunkt" och objekten "Nyckel 1", "Nyckel 2", "Plats / region" och "Slutpunkt" visas.

Båda föremålen är nödvändiga, men "Key 2" är en reservram, så den används inte i de flesta fall.

Anteckna varje värde. Som nämnts i beskrivningen, vänligen dela inte nyckeln med utvecklingsländerna oväntat.

Om nyckeln läcker ut klickar du på "Återskapa nyckel 1" ovan för att utfärda en ny nyckel. Naturligtvis, var medveten om att i det här fallet kommer den tidigare nyckeln inte längre att kunna användas.

Använda en taltjänst från ett program för att extrahera text från tal

Från och med nu kommer användningen av rösttjänsten att ändras beroende på vilket program som används. Den här gången kommer jag åt den från ett .NET-skrivbordsprogram, men om du använder ett annat ramverk kan du försöka använda det på Internet. Den officiella webbplatsen har också instruktioner om hur man använder den på flera språk.

Den här gången skapar vi en WPF-skrivbordsapp i Visual Studio 2022. När det gäller Visual Studio Code är det lite besvärligt eftersom det inte finns någon designer, men om du bara extraherar programdelen är det möjligt att använda den i en konsolapp eller en webbapp.

Skapa projekt

Starta Visual Studio 2022.

Välj Skapa nytt projekt.

Välj WPF-program.

Projektnamnet och platsen är godtyckliga. När du har angett väljer du Nästa.

Versionen heter ". NETTO 6,0". När du har ställt in klickar du på knappen "Skapa".

NuGet-inställningar

Du kan skapa åtkomst till Microsoft Azure API från grunden, men det är enklare att använda det eftersom du redan har ett officiellt bibliotek.

Högerklicka på Beroenden för lösningen och välj Hantera NuGet-paket.

Välj fliken "Bläddra", ange "Microsoft.CognitiveServices.Speech" i sökinmatningsfältet och en lista visas, så välj "Microsoft.CognitiveServices.Speech" och klicka på Installera-knappen.

Klicka på OK knapp.

Välj Jag godkänner.

När du är klar läggs det till i paketet.

Skapa användargränssnittet

Den här gången anger vi en WAV-fil som innehåller ljud och extraherar konversationsinnehållet till text med Speech API och gör att det visas. Låt för tillfället miljön vara beroende av inmatningsfältet så att du kan använda koden genom att kopiera och klistra in.

Skärmen ska se ut så här: Eftersom endast minimibeloppet ingår, om du till exempel vill lägga till en filreferensknapp, vänligen implementera det själv.

MainWindow.xaml är följande:

<Window x:Class="MicrosoftAzureSpeechToText.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MicrosoftAzureSpeechToText"
        mc:Ignorable="d"
        Title="Microsoft Azure の音声サービスを使用したテキスト抽出" Height="450" Width="800">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="20*"/>
      <ColumnDefinition Width="80*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Label Content="キー" Margin="4"/>
    <TextBox x:Name="KeyTextBox" Grid.Column="1" HorizontalAlignment="Stretch" Margin="4" Text="" />
    <Label Content="場所/地域" Margin="4" Grid.Row="1"/>
    <TextBox x:Name="RegionTextBox" Grid.Column="1" HorizontalAlignment="Stretch" Margin="4" Text="japaneast" Grid.Row="1"/>
    <Label Content="言語" Margin="4" Grid.Row="2"/>
    <TextBox x:Name="LanguageTextBox" Grid.Column="1" HorizontalAlignment="Stretch" Margin="4" Text="ja-JP" Grid.Row="2"/>
    <Label Content="WAV ファイルパス" Margin="4" Grid.Row="3"/>
    <TextBox x:Name="WavFilePathTextBox" Grid.Column="1" HorizontalAlignment="Stretch" Margin="4" Text="" Grid.Row="3"/>
    <Button x:Name="ExecuteButton" Content="実行" Margin="4" Grid.Row="4" Grid.ColumnSpan="2" FontSize="24" Click="ExecuteButton_Click"/>
    <Label Content="結果" Margin="4,2,4,2" Grid.Row="5"/>
    <TextBox x:Name="ResultTextBox" Margin="8" TextWrapping="Wrap" Text="" Grid.Row="6" Grid.ColumnSpan="2" VerticalScrollBarVisibility="Visible" />
  </Grid>
</Window>

Skapa en process

Programmet ExecuteButton_Click är allt inslaget i metoder. Om du vill använda den i andra ramverk skriver du om den här koden som bas.

MainWindow.xaml.cs

using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using System;
using System.Media;
using System.Threading.Tasks;
using System.Windows;

namespace MicrosoftAzureSpeechToText
{
  /// <summary>
  /// MainWindow.xamlのインタラクションロジック
  /// </summary>
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }

    private void AppendLineLog(string log)
    {
      // 非同期処理から書き込むので Dispatcher.Invoke を使用
      Dispatcher.Invoke(()=>ResultTextBox.AppendText(log + Environment.NewLine));
    }

    private async void ExecuteButton_Click(object sender, RoutedEventArgs e)
    {
      // 入力内容をテキストボックスから取得
      var key = KeyTextBox.Text;
      var region = RegionTextBox.Text;
      var lang = LanguageTextBox.Text;
      var wavFilePath = WavFilePathTextBox.Text;

      try
      {
        // 音声ファイルが指定されているか確認するため再生する
        var wavPlayer = new SoundPlayer(wavFilePath);
        wavPlayer.Play();

        var stopRecognition = new TaskCompletionSource<int>();

        // 音声サービスを構成する
        var speechConfig = SpeechConfig.FromSubscription(key, region);
        AppendLineLog($"{speechConfig.Region} で音声サービスを使用する準備ができました。");

        // 音声認識言語の指定
        // 使用できる値一覧:https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/language-support?tabs=speechtotext#speech-to-text
        speechConfig.SpeechRecognitionLanguage = lang;

        // 入力を WAV ファイルとして設定
        using var audioConfig = AudioConfig.FromWavFileInput(wavFilePath);
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        // 解析結果が受信されたことを通知します。
        // このイベントは抽出が完了したものから随時発生します。
        speechRecognizer.Recognized += (s, e) =>
        {
          if (e.Result.Reason == ResultReason.RecognizedSpeech)
          {
            // 音声結果に認識されたテキストが含まれていることを示します。
            var time = TimeSpan.FromSeconds(e.Result.OffsetInTicks / 10000000).ToString(@"hh\:mm\:ss");
            var text = $"{time} {e.Result.Text}";
            AppendLineLog(text);
          }
          else if (e.Result.Reason == ResultReason.NoMatch)
          {
            // 音声を認識できなかったことを示します。
            AppendLineLog("音声を認識できませんでした。");
          }
        };

        // 音声認識が中断されたことを通知します。
        speechRecognizer.Canceled += (s, e) =>
        {
          AppendLineLog($"処理が終了しました。(Reason={e.Reason})");

          if (e.Reason == CancellationReason.Error)
          {
            AppendLineLog($"ErrorCode={e.ErrorCode}\r\n");
            AppendLineLog($"ErrorDetails={e.ErrorDetails}\r\n");
          }

          stopRecognition.TrySetResult(0);
        };

        // 継続的な処理を開始します。 StopContinuousRecognitionAsync を使用して処理を停止します。
        await speechRecognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);

        // 完了するのを待ちます。Task.WaitAny を使用して、タスクをルート化してください。
        Task.WaitAny(new[] { stopRecognition.Task });

        // 処理を停止します。
        await speechRecognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
      }
      catch (Exception ex)
      {
        // 何らかの例外が発生した場合はエラー内容を出力
        AppendLineLog(ex.Message);
      }

      MessageBox.Show("処理が終了しました。");
    }
  }
}

Eftersom förklaringen nästan är skriven i koden kommer jag inte att förklara i detalj, men om du tar upp den viktiga delen kommer det att vara enligt följande.

  • SpeechConfig Konfigurera rösttjänster i
  • AudioConfig Ställa in röstdata i
  • SpeechRecognizer Generera bearbetningsklass i
  • Taldata analyseras en efter en, och den färdiga texten SpeechRecognizer.Recognized skickas i händelsen från tid till annan.
  • Om bearbetningen är klar av någon anledning SpeechRecognizer.Canceled anropas en händelse
  • Bearbetningsstart SpeechRecognizer.StartContinuousRecognitionAsync kallas metoden, och slutförandet av behandlingen kallas SpeechRecognizer.StopContinuousRecognitionAsync metoden.

Kontroll av drift

När du har skapat programmet, kör det, ange nödvändiga objekt och tryck på exekveringsknappen. Om du har angett rätt ljudfil ska ljudet spelas upp och texten extraheras en efter en med hjälp av Microsoft Azure rösttjänsten bakom kulisserna.

Systemet för extrahering är inte perfekt eftersom det beror på Microsoft Azure rösttjänst, Om rösten är tyst och talar tydligt tror jag att den kommer att extraheras med stor noggrannhet. Eftersom det är en molntjänst, även om noggrannheten inte är så hög nu, kan det bli bättre innan du vet ordet av det, så det är lätt att inte göra någonting inom det området.