שימוש בשירות Microsoft Azure Speech כדי לחלץ טקסט מקובץ שמע

עודכן דף :
תאריך יצירת דף :

סביבת בדיקת תפעול

Microsoft Azure Voice Services
  • מהדורת יולי 2022
סטודיו חזותי
  • סטודיו חזותי 2022
.NET
  • 6.0

תנאי מקדים

לפני שתוכל לוודא שטיפים אלה פועלים, עליך:

אודות חומרים לדוגמה

אנו שואלים קבצי שמע מהאתר הבא. הוא אינו כלול בקוד לדוגמה.

קישורים חיצוניים

בהתחלה

לדוגמה, על מנת להקליט את תוכן הפגישה וכו', מוקלט תוכן השיחה, ומאוחר יותר על מנת ליצור את הפרוטוקולים של הפגישה, השמע המוקלט נשמע ומתועתק לטקסט. עם זאת, קל לדמיין שזה מאוד בעייתי לרשום את תוכן השיחה למשפט.

כך תוכל להשתמש בשירות Microsoft Azure Speech כדי לייצא ולהפיק באופן אוטומטי נתוני דיבור לטקסט. בדוגמה הקודמת, זוהי הקלטה של הפגישה, אך בטיפים אלה, היא מופקת מקובץ השמע, כך שניתן להחיל אותה על כל דבר המכיל תוכן שיחה.

כמו כן, הפעם אנחנו מדברים על תמלול לטקסט, באפשרותך גם להשתמש בשירות הקולי Microsoft Azure כדי להמיר ולתרגם בזמן ההקלטה.

על עמלות

הפעם, נשתמש בתוכנית החינמית, כך שגם אם תנסה לפעול, לא תחויב. עם זאת, לתוכנית החינמית יש מגבלות זמן ואופי, כך שאם אתה זקוק להמרה נוספת לאחר הפעלתה בפועל, אנא שנה לתוכנית בתשלום.

אנא עיין בדף הרשמי הבא לקבלת תמחור. מכיוון שמדובר בשירות ענן, העמלה עשויה להשתנות בהתאם לעונה.

גישה לפורטל Microsoft Azure

גש לכתובת ה-URL הבאה בדפדפן אינטרנט:

אם אתה כבר מחובר, סיימת. אם עדיין לא נכנסת, המסך הבא יוצג, לכן אנא היכנס.

בעת הכניסה, המסך הבא יוצג. בהתאם לעיצוב שאתה מגדיר, התצוגה עשויה להיות שונה.

יצירת שירות קולי ב- Microsoft Azure

אם תזין "קול" בשדה הקלט של החיפוש מעל הפורטל, "שירות קולי" ייצא, אז בחר אותו.

「שירותים קוגניטיביים | כאשר מסך "שירות הקול" מוצג, בחר "צור".

המסך "צור שירותי דיבור" נפתח, לכן הזן את הפריטים הדרושים.

בסיסי

דוגמה קלט
לתוכןשל פריטים
מנוי בחר את המנויים שעבורם ברצונך לשלם. גם אם זה בחינם, אתה תמיד צריך לקשור את זה לאיזשהו מנוי.
קבוצות משאבים מציין באיזו קבוצת משאבים יש לכלול את השירות הקולי שייווצר. אם עדיין לא יצרת אחד, אנא צור אחד מתוך "חדש" להלן. באפשרותך לחשוב על קבוצות משאבים כקבוצות בעת יצירת שירותים שונים.
אזור בחר ליד מקום שבו אתה עשוי להשתמש בו לעתים קרובות ביותר. עם זאת, אנא שימו לב כי המחירים עשויים להשתנות בהתאם לאזור. מזרח יפן
שם כל שם לשירות הקולי הזה. אם אתה יוצר יותר משירות קולי אחד, ודא שהשם הוא תיאורי. שם זה הוא גלובלי וייחודי, כך שלא ניתן להשתמש בשם המשמש במקום אחר. SpeechToText-Test
תמחור שכבת אם אתה רוצה להשתמש בו בחינם, בחר "חינם F0". אם ברצונך להשתמש בו תמורת תשלום, אנא בחר תוכנית אחרת. כמובן, יש הגבלות אם זה בחינם. חינם F0

לאחר ההזנה, בחר הבא: רשת > להלן.

רשת

דוגמה קלט
לתוכןשל פריטים
סוג מציין את הטווח שממנו שירות קולי זה נגיש. אם אתה רוצה להיות מסוגל לגשת אליו מכל מקום ללא כל הגדרות מפורטות, בחר "כולל האינטרנט ...". "ניתן לגשת מכל מקום" פירושו גם "כל אחד יכול לגשת אליו", אבל למעשה רק אלה שיש להם את "המפתח" להירכש לאחר מכן יכול לגשת אליו, אז זה לא כל כך הרבה בעיה במונחים של אבטחה. כולל האינטרנט...

לאחר שהזנת אותו, בחר הבא: זהות > להלן.

זהות

דוגמה קלט
לתוכןשל פריטים
מזהה מנוהל שהוקצה על-ידי המערכת הפעם אני משתמש בשירות הקולי בלבד, כך שטוב לכבות אותו. כבוי
מזהה מנוהל שהוקצה על-ידי המשתמש אני לא צריך להוסיף את זה כי אני לא יוצר משתמש הפעם. בלי

לאחר שהזנת אותו, בחר הבא: תייג > למטה.

תג

מכיוון שהתג אינו בשימוש הפעם, הוא אינו מוגדר.

לאחר ההזנה, בחר הבא: סקור וצור > להלן.

סקירה ויצירה

אם אין בעיות עם תוכן הקלט, "האימות הצליח" מוצג. אם קיימת בעיה, תוצג הודעת שגיאה, לכן חזור והגדר אותה שוב.

אם אין בעיה עם תוכן הקלט, לחץ על כפתור "צור". לאחר מכן תחל הפריסה.

לאחר זמן מה, הפריסה הושלמה והמסך הבא מוצג. שם הפריסה ארוך, אך אינך צריך לדאוג לגביו מכיוון שהוא זמני בפריסה.

באפשרותך ללחוץ על לחצן עבור אל משאב כדי לוודא שהשירות הקולי נוצר.

יצירה ואחזור של מפתחות

נדרש מפתח אימות כדי לגשת לשירות קולי זה מהלקוח. מכיוון שהוא נגיש רק על ידי התוכנית שיש לה מפתח זה, יש צורך למנוע גניבת מפתח זה על ידי צד שלישי.

"לקוח" כאן מתייחס לכל התוכניות המשתמשות ב- Microsoft Azure, כגון אפליקציות שולחן עבודה, אפליקציות לסמארטפון ואפליקציות אינטרנט.

כדי לקבל את המפתח, עבור אל השירות הקולי שיצרת. ניתן לגשת אליו מלוחות מחוונים, קבוצות משאבים וכן הלאה.

כאשר הדף 'שירותים קוליים' נפתח, בחר מפתחות ונקודות קצה מהתפריט מימין.

לאחר מכן, ייפתח הדף "מפתח ונקודת קצה" ויציגו את הפריטים "מפתח 1", "מפתח 2", "מיקום/אזור" ו"נקודת קצה".

שני הפריטים נחוצים, אבל "מפתח 2" הוא מסגרת רזרבית, ולכן הוא אינו בשימוש ברוב המקרים.

רשום לב לכל ערך. כפי שצוין בתיאור, אנא אל תשתף את המפתח עם גורמי הפיתוח באופן בלתי צפוי.

אם המפתח הודלף, לחץ על "Regenerate Key 1" לעיל כדי להנפיק מפתח חדש. כמובן, להיות מודעים לכך שבמקרה זה, המפתח הקודם כבר לא יהיה שמיש.

שימוש בשירות דיבור מתוכנית כדי לחלץ טקסט מדיבור

מעתה ואילך, השימוש בשירות הקול ישתנה בהתאם לתוכנית שבה נעשה שימוש. הפעם, אני אגיש אליו מיישום שולחן עבודה של .NET, אך אם אתה משתמש במסגרת אחרת, נסה להשתמש בו באינטרנט. באתר הרשמי יש גם הוראות כיצד להשתמש בו במספר שפות.

הפעם, אנו יוצרים אפליקציית שולחן עבודה WPF ב- Visual Studio 2022. במקרה של Visual Studio Code, זה קצת בעייתי מכיוון שאין מעצב, אבל אם אתה מחלץ רק את חלק התוכנית, ניתן להשתמש בו באפליקציית קונסולה או באפליקציית אינטרנט.

יצירת פרוייקט

התחל את Visual Studio 2022.

בחר צור פרוייקט חדש.

בחר יישום WPF.

שם הפרויקט ומיקוםו שרירותיים. לאחר הכניסה, בחר הבא.

הגרסה נקראת ". NET 6.0". לאחר ההגדרה, לחץ על כפתור "צור".

NuGetהגדרות

באפשרותך ליצור גישה ל- API של Microsoft Azure מאפס, אך קל יותר להשתמש בו מכיוון שכבר יש לך ספריה רשמית.

לחץ באמצעות לחצן העכבר הימני על יחסי תלות עבור הפתרון ובחר נהל את חבילות NuGet.

בחר בכרטיסייה "עיון", הזן "Microsoft.CognitiveServices.Speech" בשדה הקלט של החיפוש, ותוצג רשימה, לכן בחר "Microsoft.CognitiveServices.Speech" ולחץ על לחצן התקן.

לחץ על הלחצן אישור.

בחר אני מסכים.

כשתסיים, הוא יתווסף לחבילה.

יצירת ממשק המשתמש

הפעם, נציין קובץ 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, אם הקול שקט ומדבר בצורה ברורה, אני חושב שהוא יחולץ בדיוק רב. מכיוון שמדובר בשירות ענן, גם אם הדיוק לא כל כך גבוה עכשיו, ייתכן שהוא משתפר לפני שאתה יודע את זה, כך שקל לא לעשות שום דבר בתחום הזה.