使用 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 語音服務。 我認為,如果聲音說話清晰,噪音小,它會以相當高精度提取。 因為它是雲服務,即使現在精度不高,在不知情的情況下,它也可能變得更好,所以很容易不需要做任何事情。