使用 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 语音服务。 我认为,如果声音说话清晰,噪音小,它会以相当高精度提取。 因为它是云服务,即使现在精度不高,在不知情的情况下,它也可能变得更好,所以很容易不需要做任何事情。