使用 Microsoft Azure 語音服務從音訊檔中提取文字

更新頁 :
頁面創建日期 :

操作確認環境

Microsoft Azure 音聲服務
  • 2022年7月版
Visual Studio
  • Visual Studio 2022
.NET
  • 6.0

先決條件

在驗證此提示是否正常工作之前,必須執行以下操作:

關於樣品材料

我們從以下網站借用音訊檔: 它不包括在範例代碼中。

參考網站

入門

例如,我有時錄製對話內容以記錄會議內容,然後在聽錄音以製作會議記錄時將其轉錄為文本。 然而,很容易想像,從對話中寫到句子是非常麻煩的。

本節介紹如何使用 Microsoft Azure 語音服務自動從語音數據匯出和輸出文本。 在前面的示例中,我們使用會議錄製數據,但在此提示中,我們從音訊檔中提取,因此您可以將任何包含對話的數據應用於任何內容。

此外,這一次,我將解釋轉錄到文本, 您可以使用 Microsoft Azure 語音服務進行其他錄製、轉換和翻譯。

關於價格

這一次,我們將使用免費計劃,因此,即使您嘗試了該操作,也不會產生任何費用。 但是,由於免費計劃的時間和字元數有限,因此,如果您需要實際操作並轉換更多內容,請更改為付費計劃。

有關價格,請參閱下面的官方頁面。 因為它是雲服務,價格可能會因時間而異。

訪問 Microsoft Azure 門戶

在 Web 瀏覽器中存取以下 URL:

如果您已經登錄,您就完成了。 如果您尚未登錄,您將看到以下螢幕,請登錄。

登錄后,您將看到以下螢幕。 根據您設置的設計,顯示可能會有所不同。

在 Microsoft Azure 中創建語音服務

在門戶上方的搜索輸入字段中輸入「語音」 然後選擇「語音服務」 因為我認為會出現。

「Cognitive Services | 當語音服務螢幕出現時,選擇“創建”。

此時將打開「創建語音服務」螢幕,並輸入所需的欄位。

Basics

輸入欄位輸入範例
訂閱 選擇要支付的訂閱。 您始終需要將其綁定到某些訂閱,即使它是免費的。
資源組 指定要創建的語音服務應包含在哪些資源組中。 如果尚未創建任何內容,請從下面的“新建”創建它。 資源組可以像創建各種服務時的分組一樣。
區域 選擇靠近繁忙位置。 但是,請注意,價格可能因地區而異。 Japan East
名稱 此語音服務的任何名稱。 如果您有多個語音服務,請確保名稱易於理解。 此名稱是全域的和唯一的,不能用於任何其他名稱。 SpeechToText-Test
價格水準 要免費使用,請選擇「免費 F0」。。 如果您想付費使用,請選擇其他計劃。 當然,免費是有限制的。 Free F0

鍵入后,選擇下面的“下一步:網络>”。

網路

輸入欄位輸入範例
類型 指定此語音服務可從何處訪問。 如果要在不進行詳細設置的情況下從任何位置訪問它,請選擇“包括 Internet...”。“從任何位置訪問”也意味著“任何人都可以訪問”,但實際上,只有擁有“密鑰”的人才能訪問它,因此安全性不會成為問題。 包括互聯網...

鍵入后,選擇下面的「下一個:標識>」。。

Identity

輸入欄位輸入範例
系統分配的託管標識 這一次,語音服務是單獨使用的,所以關閉是不錯的。 關閉
使用者分配的託管標識 這一次,我不需要添加它,因為我不創建任何使用者。

鍵入后,選擇下面的“下一個:標記>”。

標籤

這一次,我將不使用標記,因此未設置它。

鍵入后,選擇下面的“下一步:確認和創建>”。

查看和創建

如果您對輸入感到滿意,您將看到“驗證成功”。 如果出現問題,您將收到一條錯誤消息,請返回並重新配置。

如果您對輸入感到滿意,請按兩下「創建」 按鈕。 然後,部署將開始。

部署完成後,您將看到以下螢幕: 部署名稱很長,但部署是臨時的,因此您不必擔心。

按兩下「轉到資源」按鈕以驗證是否已創建語音服務。

生成和檢索金鑰

用戶端需要身份驗證金鑰才能存取此語音服務。 相反,此金鑰不應被第三方竊取,因為只有具有此密鑰的程式才能訪問它。

此處的“用戶端”適用於使用 Microsoft Azure 的所有程式,包括桌面應用、智慧手機應用和 Web 應用。

若要獲取金鑰,請轉到您創建的語音服務。 可從儀錶板、資源組等訪問。

打開語音服務頁面后,從左側功能表中選擇「金鑰和終結點」。。

然後,將打開「金鑰和終結點」頁,顯示「金鑰 1」、「金鑰 2」、「位置/區域」和「終結點」字段。

兩個專案都是必需的,但在大多數情況下不使用,因為「鍵 2」是備用框架。

記下每個值。 在描述中也有,但不要與開發人員共用密鑰。

如果金鑰洩露,請按兩下上面的「重新生成金鑰 1」以頒發新密鑰。 當然,在這種情況下,您將無法使用以前的金鑰。

使用語音服務從程式中提取文字

從這裡,語音服務的使用方式取決於您使用的程式。 這一次,您將從 .NET 桌面應用程式存取它,但如果您使用的是其他框架,請嘗試在Internet上使用它。 官方網站上還用了幾種語言寫著如何使用它。

這一次,我們正在 Visual Studio 2022 中創建 WPF 桌面應用。 在 Visual Studio 代碼的情況下,由於沒有設計器,因此有點麻煩,但如果只提取程式部分,則可以在控制台應用或 Web 應用中使用它。

創建專案

啟動視覺工作室 2022。

選擇創建新專案。

選擇 WPF 應用程式。

項目名稱和位置是可選的。 輸入后,選擇“下一步”。

版本是“。 NET 6.0“。 設置后,按兩下「創建」 按鈕。

NuGet 設置

您可以從 1 開始訪問 Microsoft Azure API,但使用起來更容易,因為您已經有一個官方庫。

右鍵按兩下解決方案的依賴項,然後選擇管理 NuGet 包。

選擇「瀏覽」選項卡,在搜索輸入欄位中輸入「微軟.認知服務.語音」,您將看到一個清單,選擇「微軟.認知服務.語音」,然後按兩下安裝按鈕。

按兩下確定按鈕。

選擇“我同意”。

完成後,它將添加到包中。

創建UI

這一次,我們將指定包含語音的 WAV 檔,並使用語音 API 將對話內容提取到文本中並顯示。 現在,將與環境相關的內容保留為輸入字段,以便代碼可以在複製和粘貼中使用。

螢幕如下所示。 例如,如果要添加文件瀏覽按鈕,請自行實現它,因為您只包含最少的按鈕。

MainWindow.xaml 如下所示。

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

創建操作

程式都 ExecuteButton_Click 分組到方法中。 如果要在其他框架中使用,請將此代碼重寫為基礎。

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("処理が終了しました。");
    }
  }
}

我很少詳細解釋它,因為大部分描述都寫在代碼中,但當我提出一個重要部分時,它感覺如下。

  • SpeechConfig 在中設置語音服務
  • AudioConfig 在中設置語音數據
  • SpeechRecognizer 在中生成處理類
  • 逐個分析語音資料,並在事件中傳遞隨時生成的文字 SpeechRecognizer.Recognized
  • 當由於某種原因處理完時 SpeechRecognizer.Canceled ,將調用事件。
  • 處理開始 SpeechRecognizer.StartContinuousRecognitionAsync 調用 方法,處理完成 SpeechRecognizer.StopContinuousRecognitionAsync 調用 方法。

檢查操作

創建程式後,運行它,輸入所需的專案,然後按「運行」按鈕。 如果指定了正確的音訊檔,則應播放音訊,並在背面使用 Microsoft Azure 語音服務逐個提取文本。

數據提取系統並不完美,因為提取系統依賴於 Microsoft Azure 語音服務。 我認為,如果聲音說話清晰,噪音小,它會以相當高精度提取。 因為它是雲服務,即使現在精度不高,在不知情的情況下,它也可能變得更好,所以很容易不需要做任何事情。