استفاده از سرویس گفتار Microsoft Azure برای استخراج متن از یک فایل صوتی

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط بررسی عملیات

مایکروسافت لاجورد خدمات صوتی
  • نسخه ژوئیه ۲۰۲۲
ویژوال استودیو
  • ویژوال استودیو 2022
.NET
  • 6.0

پیش شرط

قبل از اینکه شما می توانید تایید کنید که این نکات کار می کنند، شما نیاز به:

درباره مواد نمونه

فایل های صوتی را از سایت زیر قرض می کنیم. در کد نمونه گنجانده نشده است.

لینک های خارجی

در ابتدا

به عنوان مثال، برای ثبت محتویات جلسه و غیره، محتویات مکالمه ضبط می شود و بعدها به منظور ایجاد دقایق جلسه، صدای ضبط شده شنیده می شود و به متن رونویسی می شود. با این حال، به راحتی می توان تصور کرد که نوشتن محتویات مکالمه به یک جمله بسیار دردسرساز است.

در اینجا نحوه استفاده از سرویس گفتار لاجوردی مایکروسافت برای صادرات خودکار و خروجی داده های گفتار به متن است. در مثال قبلی، ضبط جلسه است، اما در این نکته، از فایل صوتی استخراج می شود، بنابراین می توان آن را به هر چیزی که حاوی محتویات مکالمه باشد، اعمال کرد.

همچنین، این بار ما در حال صحبت کردن در مورد رونویسی به متن، همچنین می توانید از سرویس صوتی Microsoft Azure برای تبدیل و ترجمه هنگام ضبط استفاده کنید.

درباره هزینه ها

این بار از طرح رایگان استفاده خواهیم کرد، بنابراین حتی اگر سعی کنید فعالیت کنید، متهم نمی توانید. با این حال ، طرح رایگان تا به زمان و محدودیت شخصیت ، بنابراین اگر شما نیاز به تبدیل بیشتر پس از در واقع عامل آن ، لطفا به یک طرح پرداخت تغییر دهید.

لطفا برای قیمت گذاری به صفحه رسمی زیر مراجعه کنید. از آنجا که یک سرویس ابری است، هزینه بسته به فصل ممکن است در نوسان باشد.

دسترسی به پورتال Microsoft Azure

دسترسی به URL زیر در یک مرورگر وب:

اگر شما در حال حاضر در امضا، شما تمام شده است. اگر قبلاً در آن شرکت نکرده باشید، صفحه نمایش زیر نمایش داده می شود، پس لطفاً ورود کنید.

هنگامی که وارد سیستم می شوید، صفحه زیر نمایش داده می شود. بسته به طراحی که تنظیم می کنید، صفحه نمایش ممکن است متفاوت باشد.

ایجاد یک سرویس صوتی در Microsoft Azure

اگر "صدا" را در زمینه ورودی جستجو در بالای پورتال وارد کنید، "سرویس صوتی" بیرون خواهد آمد، بنابراین آن را انتخاب کنید.

「 خدمات شناختی | هنگامی که صفحه نمایش "سرویس صوتی" نمایش داده می شود، "ایجاد" را انتخاب کنید.

صفحه نمایش "ایجاد خدمات گفتار" باز می شود، بنابراین موارد لازم را وارد کنید.

موارد پایه

نمونه ای
از محتویات ورودی موارد
اشتراک اشتراک هایی را که می خواهید برای آنها پرداخت کنید انتخاب کنید. حتی اگر رایگان باشد، همیشه باید آن را به نوعی اشتراک گره بزنید.
گروه های منابع مشخص می کند که سرویس صوتی ایجاد شده در کدام گروه منابع قرار است شامل شود. اگر شما یکی از ایجاد نشده است، لطفا یکی از "جدید" در زیر ایجاد کنید. شما می توانید از گروه های منابع به عنوان گروه بندی زمانی که شما ایجاد خدمات مختلف فکر می کنم.
منطقه نزدیک جایی را انتخاب کنید که ممکن است بیشتر از آن استفاده کنید. با این حال، لطفا توجه داشته باشید که قیمت ها ممکن است بر اساس منطقه متفاوت باشد. ژاپن شرق
نام هر اسمي براي اين سرويس صوتي . اگر شما در حال ایجاد بیش از یک سرویس صوتی، لطفا مطمئن شوید که نام توصیفی است. این نام جهانی و منحصر به فرد است، بنابراین شما نمی توانید از نامی استفاده کنید که در جای دیگر استفاده می شود. SpeechToText-Test
ردیف قیمت گذاری اگر می خواهید از آن به صورت رایگان استفاده کنید، "F0 رایگان" را انتخاب کنید. اگر می خواهید از آن برای هزینه ای استفاده کنید، لطفاً طرح دیگری را انتخاب کنید. البته اگر آزاد باشد محدودیت هایی وجود دارد. رایگان F0

پس از ورود، گزینه Next: Network > below را انتخاب کنید.

شبکه

نمونه ای
از محتویات ورودی موارد
نوع محدوده ای که این سرویس صوتی از آن قابل دسترسی است را مشخص می کند. اگر می خواهید بتوانید از هر جایی بدون هیچ گونه تنظیمات دقیقی به آن دسترسی پیدا کنید، "از جمله اینترنت..." را انتخاب کنید. "می توان از هر جایی به آن دسترسی پیدا کرد" همچنین به معنای "هر کسی می تواند به آن دسترسی داشته باشد"، اما در واقع تنها کسانی که "کلید" را دارند که پس از این می توانند به آن دسترسی داشته باشند، بنابراین از نظر امنیتی چندان مشکلی ندارد. از جمله اینترنت...

هنگامی که وارد آن شدید، گزینه Next: Identity > below را انتخاب کنید.

هویت

نمونه ای
از محتویات ورودی موارد
شناسه مدیریت شده توسط سیستم اختصاص داده شده این بار به تنهایی از سرویس صوتی استفاده می کنم، بنابراین خوب است که آن را خاموش کنم. خاموش
شناسه مدیریت شده توسط کاربر اختصاص داده شده لازم نیست آن را اضافه کنم چون این بار کاربر ایجاد نمی کنم. بدون

هنگامی که شما آن را وارد کرده ام, انتخاب بعدی: برچسب > زیر.

برچسب

از آنجا که این بار از تگ استفاده نمی شود، تنظیم نشده است.

پس از ورود، گزینه Next: Review را انتخاب کنید و > کنید.

نقد و بررسی و ایجاد

اگر مشکلی در محتویات ورودی وجود ندارد، "اعتبارسنجی موفق" نمایش داده می شود. اگر مشکلی پیش آمد، یک پیام خطا نمایش داده می شود، پس به عقب برگردید و دوباره آن را تنظیم کنید.

اگر مشکلی در محتویات ورودی وجود ندارد، روی دکمه "ایجاد" کلیک کنید. سپس استقرار آغاز خواهد شد.

پس از مدتی استقرار کامل شده و صفحه نمایش زیر نمایش داده می شود. نام استقرار طولانی است، اما لازم نیست نگران آن باشید زیرا در استقرار موقت است.

شما می توانید روی دکمه Go to Resource کلیک کنید تا تأیید کنید که سرویس صوتی ایجاد شده است.

تولید و بازیابی کلید

یک کلید احراز هویت برای دسترسی به این سرویس صوتی از سرویس گیرنده مورد نیاز است. از آنجا که تنها توسط برنامه ای که این کلید را دارد قابل دسترسی است، باید از دزدیده شدن این کلید توسط شخص ثالث جلوگیری کرد.

"مشتری" در اینجا به تمام برنامه هایی اشاره دارد که از Microsoft Azure استفاده می کنند، مانند برنامه های رومیزی، برنامه های گوشی های هوشمند، و برنامه های وب.

برای دریافت کلید به سرویس صوتی که ایجاد کرده اید بروید. می توان آن را از داشبوردها، گروه های منابع، و مانند آن دسترسی داشت.

هنگامی که صفحه خدمات صوتی باز می شود، Keys & Endpoints را از منوی سمت چپ انتخاب کنید.

سپس صفحه "کلید و نقطه پایانی" باز می شود و موارد "کلید ۱"، "کلید ۲"، "مکان/منطقه" و "نقطه پایانی" نمایش داده می شوند.

هر دو مورد لازم است، اما "کلید ۲" یک قاب یدکی است، بنابراین در بیشتر موارد از آن استفاده نمی شود.

یک یادداشت از هر مقدار. همانطور که در توضیحات ذکر شد، لطفا کلید را با احزاب توسعه به طور غیر منتظره به اشتراک بگذارید.

اگر کلید به بیرون درز کرد، روی "بازسازی کلید ۱" در بالا کلیک کنید تا کلید جدیدی صادر شود. البته آگاه باشید که در این صورت دیگر کلید قبلی قابل استفاده نخواهد بود.

استفاده از یک سرویس گفتار از یک برنامه برای استخراج متن از گفتار

از این پس استفاده از سرویس صوتی بسته به برنامه مورد استفاده تغییر خواهد کرد. این بار از یک برنامه دسکتاپ .NET به آن دسترسی پیدا می کنم، اما اگر از چارچوب دیگری استفاده می کنید، سعی کنید از آن در اینترنت استفاده کنید. وب گاه رسمی همچنین دستورالعمل هایی در مورد چگونگی استفاده از آن به چندین زبان دارد.

این بار در حال ایجاد یک برنامه رومیزی WPF در Visual Studio 2022 هستیم. در مورد ویژوال استودیو کد، کمی دردسرساز است زیرا طراح وجود ندارد، اما اگر تنها بخش برنامه را استخراج کنید، می توان از آن در یک برنامه کنسول یا یک برنامه وب استفاده کرد.

ایجاد پروژه

Start Visual Studio 2022.

گزینه Create New Project را انتخاب کنید.

برنامه WPF را انتخاب کنید.

نام پروژه و محل خودسرانه است. پس از ورود، Next را انتخاب کنید.

نسخه "" نامیده می شود. NET 6.0". پس از تنظیم، روی دکمه "ایجاد" کلیک کنید.

تنظیمات NuGet

شما می توانید دسترسی به API Microsoft Azure را از ابتدا ایجاد کنید، اما استفاده از آن آسان تر است زیرا شما در حال حاضر یک کتابخانه رسمی داشته باشید.

وابستگی های راست کلیک کنید برای راه حل و انتخاب مدیریت بسته های NuGet.

زبانه "مرور" را انتخاب کنید، "Microsoft.CognitiveServices.Speech" را در زمینه ورودی جستجو وارد کنید، و یک لیست نمایش داده خواهد شد، بنابراین "Microsoft.CognitiveServices.Speech" را انتخاب کنید و روی دکمه Install کلیک کنید.

روی دکمه OK کلیک کنید.

انتخاب کنید من موافقم.

هنگامی که شما انجام می شود، آن را به بسته اضافه خواهد شد.

ایجاد رابط کاربر

این بار، ما یک فایل 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..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 دارد، اگر صدا ساکت باشد و به وضوح صحبت کند، فکر می کنم با دقت قابل توجهی استخراج خواهد شد. از آنجا که این یک سرویس ابری است، حتی اگر دقت در حال حاضر چندان بالا نیست، ممکن است قبل از اینکه شما آن را بدانید بهتر شود، بنابراین انجام ندادن کاری در آن منطقه آسان است.