ใช้บริการเสียงพูดของ Microsoft Azure เพื่อแยกข้อความจากไฟล์เสียง

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบการทํางาน

บริการเสียง Azure ของ Microsoft
  • ฉบับเดือนกรกฎาคม 2022
วิชวลสตูดิโอ
  • วิชวลสตูดิโอ 2022
.NET
  • 6.0

เงื่อนไขเบื้องต้น

ก่อนที่คุณจะสามารถยืนยันได้ว่าทิปนี้ใช้งานได้หรือไม่ คุณจําเป็นต้องทําสิ่งต่อไปนี้ก่อนจึงจะตรวจสอบได้

เกี่ยวกับวัสดุตัวอย่าง

เรายืมไฟล์เสียงจากเว็บไซต์ต่อไปนี้ ไม่รวมอยู่ในโค้ดตัวอย่าง

ลิงก์ภายนอก

ทีแรก

ตัวอย่างเช่นในการบันทึกเนื้อหาของการประชุม ฯลฯ เนื้อหาของการสนทนาจะถูกบันทึกและต่อมาเพื่อสร้างรายงานการประชุมเสียงที่บันทึกจะถูกได้ยินและถอดความเป็นข้อความ อย่างไรก็ตามมันเป็นเรื่องง่ายที่จะจินตนาการว่ามันยากมากที่จะเขียนเนื้อหาของการสนทนาลงในประโยค

ต่อไปนี้เป็นวิธีใช้บริการเสียงพูดของ Microsoft Azure เพื่อส่งออกและส่งออกข้อมูลคําพูดเป็นข้อความโดยอัตโนมัติ ในตัวอย่างก่อนหน้านี้เป็นการบันทึกการประชุม แต่ในเคล็ดลับนี้มันถูกดึงออกมาจากไฟล์เสียงดังนั้นจึงสามารถนําไปใช้กับอะไรก็ได้ที่มีเนื้อหาการสนทนา

นอกจากนี้คราวนี้เรากําลังพูดถึงการถอดความเป็นข้อความ คุณยังสามารถใช้บริการเสียง Microsoft Azure เพื่อแปลงและแปลขณะบันทึกได้อีกด้วย

เกี่ยวกับค่าธรรมเนียม

คราวนี้เราจะใช้แผนฟรีดังนั้นแม้ว่าคุณจะพยายามดําเนินการคุณจะไม่ถูกเรียกเก็บเงิน อย่างไรก็ตามแผนบริการฟรีมีเวลาและอักขระ จํากัด ดังนั้นหากคุณต้องการการแปลงเพิ่มเติมหลังจากใช้งานจริงโปรดเปลี่ยนเป็นแผนชําระเงิน

โปรดดูหน้าอย่างเป็นทางการต่อไปนี้สําหรับการกําหนดราคา เนื่องจากเป็นบริการคลาวด์ค่าธรรมเนียมอาจผันผวนขึ้นอยู่กับฤดูกาล

เข้าถึงพอร์ทัล Azure ของไมโครซอฟท์

เข้าถึง URL ต่อไปนี้ในเว็บเบราว์เซอร์:

หากคุณลงชื่อเข้าใช้แล้ว แสดงว่าคุณทําเสร็จแล้ว หากคุณยังไม่ได้ลงชื่อเข้าใช้หน้าจอต่อไปนี้จะปรากฏขึ้นดังนั้นโปรดลงชื่อเข้าใช้

เมื่อคุณเข้าสู่ระบบหน้าจอต่อไปนี้จะปรากฏขึ้น ขึ้นอยู่กับการออกแบบที่คุณกําลังตั้งค่าจอแสดงผลอาจแตกต่างกัน

สร้างบริการเสียงใน Microsoft Azure

หากคุณป้อน "เสียง" ในช่องป้อนข้อมูลการค้นหาเหนือพอร์ทัล "บริการเสียง" จะออกมาดังนั้นให้เลือก

「บริการความรู้ความเข้าใจ| เมื่อหน้าจอ "บริการเสียง" ปรากฏขึ้น ให้เลือก "สร้าง"

หน้าจอ "สร้างบริการเสียงพูด" จะเปิดขึ้นดังนั้นป้อนรายการที่จําเป็น

พื้นฐาน

ตัวอย่างของอินพุต
เนื้อหาของรายการ
การสมัครสมาชิก เลือกการสมัครใช้บริการที่คุณต้องการชําระเงิน แม้ว่าจะฟรี แต่คุณต้องผูกมันไว้กับการสมัครสมาชิกบางประเภทเสมอ
กลุ่มทรัพยากร ระบุว่าจะรวมบริการเสียงลงในกลุ่มทรัพยากรใด หากคุณยังไม่ได้สร้างโปรดสร้างจาก "ใหม่" ด้านล่าง คุณสามารถคิดว่ากลุ่มทรัพยากรเป็นการจัดกลุ่มเมื่อคุณสร้างบริการต่างๆ
บริเวณ เลือกใกล้กับสถานที่ที่คุณอาจใช้งานบ่อยที่สุด อย่างไรก็ตาม โปรดทราบว่าราคาอาจแตกต่างกันไปตามภูมิภาค ญี่ปุ่นตะวันออก
ชื่อ ชื่อใด ๆ สําหรับบริการเสียงนี้ หากคุณกําลังสร้างบริการเสียงมากกว่าหนึ่งบริการ โปรดตรวจสอบให้แน่ใจว่าชื่อนั้นสื่อความหมาย ชื่อนี้เป็นชื่อสากลและไม่ซ้ํากัน ดังนั้นคุณจึงไม่สามารถใช้ชื่อที่ใช้ที่อื่นได้ SpeechToText-Test
ระดับราคา หากคุณต้องการใช้งานฟรีให้เลือก"ฟรี F0" หากคุณต้องการใช้โดยมีค่าธรรมเนียมโปรดเลือกแผนอื่น แน่นอนว่ามีข้อ จํากัด หากฟรี ฟรี F0

เมื่อป้อนแล้ว ให้เลือก ถัดไป: >เครือข่าย ด้านล่าง

เครือข่าย

ตัวอย่างของอินพุต
เนื้อหาของรายการ
ชนิด ระบุช่วงที่สามารถเข้าถึงบริการเสียงนี้ได้ หากคุณต้องการสามารถเข้าถึงได้จากทุกที่โดยไม่มีการตั้งค่าโดยละเอียดให้เลือก "รวมถึงอินเทอร์เน็ต ... "" "สามารถเข้าถึงได้จากที่ใดก็ได้" ยังหมายถึง "ทุกคนสามารถเข้าถึงได้" แต่ในความเป็นจริงเฉพาะผู้ที่มี "คีย์" ที่จะได้รับหลังจากนี้สามารถเข้าถึงได้ดังนั้นจึงไม่เป็นปัญหามากนักในแง่ของความปลอดภัย รวมถึงอินเทอร์เน็ต...

เมื่อคุณป้อนแล้ว ให้เลือก ถัดไป: >ข้อมูลประจําตัว ด้านล่าง

เอกลักษณ์

ตัวอย่างของอินพุต
เนื้อหาของรายการ
รหัสที่มีการจัดการที่กําหนดโดยระบบ คราวนี้ฉันใช้บริการเสียงเพียงอย่างเดียวดังนั้นจึงเป็นการดีที่จะปิด ไป
รหัสที่มีการจัดการที่ผู้ใช้กําหนด ฉันไม่จําเป็นต้องเพิ่มเพราะฉันไม่ได้สร้างผู้ใช้ในครั้งนี้ ปราศจาก

เมื่อคุณป้อนแล้ว ให้เลือก ถัดไป: แท็ก >ด้านล่าง

ฉลาก

เนื่องจากแท็กไม่ได้ใช้ในครั้งนี้จึงไม่ได้ตั้งค่า

เมื่อป้อนแล้ว ให้เลือก ถัดไป: ตรวจสอบและสร้าง>ด้านล่าง

ตรวจสอบและสร้าง

ถ้าไม่มีปัญหากับเนื้อหาอินพุต "การตรวจสอบความถูกต้องสําเร็จ" จะปรากฏขึ้น หากมีปัญหาข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นดังนั้นให้ย้อนกลับและตั้งค่าอีกครั้ง

หากไม่มีปัญหากับเนื้อหาที่ป้อนข้อมูลให้คลิกปุ่ม "สร้าง" จากนั้นการปรับใช้จะเริ่มขึ้น

หลังจากนั้นสักครู่การปรับใช้จะเสร็จสมบูรณ์และหน้าจอต่อไปนี้จะปรากฏขึ้น ชื่อการปรับใช้มีความยาว แต่คุณไม่จําเป็นต้องกังวลเกี่ยวกับชื่อนั้นเนื่องจากเป็นชื่อชั่วคราวในการปรับใช้

คุณสามารถคลิกปุ่ม ไปที่ทรัพยากร เพื่อตรวจสอบว่ามีการสร้างบริการเสียงแล้ว

การสร้างและการดึงข้อมูลคีย์

ต้องใช้คีย์การรับรองความถูกต้องเพื่อเข้าถึงบริการเสียงนี้จากไคลเอนต์ เนื่องจากสามารถเข้าถึงได้โดยโปรแกรมที่มีคีย์นี้เท่านั้นจึงจําเป็นต้องป้องกันไม่ให้คีย์นี้ถูกขโมยโดยบุคคลที่สาม

"ไคลเอ็นต์" ในที่นี้หมายถึงโปรแกรมทั้งหมดที่ใช้ Microsoft Azure เช่น แอปเดสก์ท็อป แอปสมาร์ทโฟน และเว็บแอป

หากต้องการรับคีย์ ให้ไปที่บริการเสียงที่คุณสร้างขึ้น สามารถเข้าถึงได้จากแดชบอร์ดกลุ่มทรัพยากรและอื่น ๆ

เมื่อหน้าบริการเสียงเปิดขึ้น ให้เลือก คีย์ & ปลายทาง จากเมนูทางด้านซ้าย

จากนั้นหน้า "คีย์และปลายทาง" จะเปิดขึ้นและรายการ "คีย์ 1", "คีย์ 2", "ตําแหน่ง / ภูมิภาค" และ "จุดสิ้นสุด" จะปรากฏขึ้น

ทั้งสองรายการมีความจําเป็น แต่ "Key 2" เป็นเฟรมสํารองดังนั้นจึงไม่ได้ใช้ในกรณีส่วนใหญ่

จดบันทึกค่าแต่ละค่า ดังที่ได้กล่าวไว้ในคําอธิบายโปรดอย่าแบ่งปันกุญแจกับฝ่ายพัฒนาโดยไม่คาดคิด

หากคีย์รั่วไหล ให้คลิก "สร้างคีย์ใหม่ 1" ด้านบนเพื่อออกคีย์ใหม่ แน่นอนโปรดทราบว่าในกรณีนี้คีย์ก่อนหน้าจะไม่สามารถใช้งานได้อีกต่อไป

ใช้บริการเสียงจากโปรแกรมเพื่อแยกข้อความจากคําพูด

จากนี้ไปการใช้บริการเสียงจะเปลี่ยนไปขึ้นอยู่กับโปรแกรมที่ใช้ คราวนี้ฉันจะเข้าถึงได้จากแอปพลิเคชันเดสก์ท็อป. NET แต่ถ้าคุณใช้เฟรมเวิร์กอื่นให้ลองใช้บนอินเทอร์เน็ต เว็บไซต์อย่างเป็นทางการยังมีคําแนะนําเกี่ยวกับวิธีการใช้งานในหลายภาษา

คราวนี้ เรากําลังสร้างแอปเดสก์ท็อป WPF ใน Visual Studio 2022 ในกรณีของ Visual Studio Code มันค่อนข้างลําบากเพราะไม่มีตัวออกแบบ แต่ถ้าคุณแยกเฉพาะส่วนโปรแกรมคุณสามารถใช้มันในแอปคอนโซลหรือเว็บแอปได้

สร้างโครงการ

เริ่มการทํางานของ Visual Studio 2022

เลือก "สร้างโครงการใหม่"

เลือกแอปพลิเคชัน WPF

ชื่อโครงการและที่ตั้งเป็นไปตามอําเภอใจ เมื่อป้อนแล้ว ให้เลือก ถัดไป

รุ่นนี้เรียกว่า ". เน็ต 6.0". เมื่อตั้งค่าแล้วให้คลิกปุ่ม "สร้าง"

การตั้งค่า NuGet

คุณสามารถสร้างการเข้าถึง Microsoft Azure API ตั้งแต่เริ่มต้น แต่ใช้งานได้ง่ายขึ้นเนื่องจากคุณมีไลบรารีอย่างเป็นทางการอยู่แล้ว

คลิกขวาที่ การขึ้นต่อกัน สําหรับโซลูชัน และเลือก จัดการแพคเกจ NuGet

เลือกแท็บ "เรียกดู" ป้อน "Microsoft.CognitiveServices.Speech" ในช่องป้อนข้อมูลการค้นหาและรายการจะปรากฏขึ้นดังนั้นเลือก "Microsoft.CognitiveServices.Speech" แล้วคลิกปุ่มติดตั้ง

คลิก ตกลง ปุ่ม.

เลือกฉันยอมรับ

เมื่อคุณทําเสร็จแล้วมันจะถูกเพิ่มลงในแพ็คเกจ

การสร้าง UI

คราวนี้เราจะระบุไฟล์ WAV ที่มีเสียงและแยกเนื้อหาการสนทนาเป็นข้อความด้วย Speech 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 ถูกห่อหุ้มด้วยวิธีการทั้งหมด หากคุณต้องการใช้ในเฟรมเวิร์กอื่น ให้เขียนโค้ดนี้เป็นฐานใหม่

เมนวินโดว์.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 หากเสียงเงียบและพูดอย่างชัดเจนฉันคิดว่ามันจะถูกดึงออกมาด้วยความแม่นยํามาก เนื่องจากเป็นบริการคลาวด์แม้ว่าความแม่นยําจะไม่สูงนักในตอนนี้ แต่ก็อาจดีขึ้นก่อนที่คุณจะรู้ดังนั้นจึงเป็นเรื่องง่ายที่จะไม่ทําอะไรในพื้นที่นั้น