使用 Microsoft Azure 语音服务从音频文件中提取文本
操作确认环境
- Microsoft Azure 音声服务
-
- 2022 年 7 月版
- Visual Studio
-
- Visual Studio 2022
- .NET
-
- 6.0
先决条件
在验证此提示是否正常工作之前,必须执行以下操作:
- 创建微软帐户(请参阅创建微软帐户)
- 创建 Microsoft Azure 帐户(请参阅在 Microsoft Azure 中创建帐户)
关于样品材料
我们从以下网站借用音频文件: 它不包括在示例代码中。
参考网站
入门
例如,我有时录制对话内容以记录会议内容,然后在听录音以制作会议记录时将其转录为文本。 然而,很容易想象,从对话中写到句子是非常麻烦的。
本节介绍如何使用 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 语音服务。 我认为,如果声音说话清晰,噪音小,它会以相当高精度提取。 因为它是云服务,即使现在精度不高,在不知情的情况下,它也可能变得更好,所以很容易不需要做任何事情。