Microsoft Azure 음성 서비스를 사용하여 오디오 파일에서 텍스트 추출

페이지 업데이트 :
페이지 생성 날짜 :

작업 확인 환경

Microsoft Azure Voice Services
  • 칠월 2022 판
비주얼 스튜디오
  • 비주얼 스튜디오 2022
.NET
  • 6.0

전제 조건

이 팁이 작동하는지 확인하려면 먼저 다음을 수행해야 합니다.

견본 물자에 관하여

우리는 다음 사이트에서 오디오 파일을 빌립니다. 샘플 코드에는 포함되지 않습니다.

외부 링크

처음에

예를 들어, 회의 등의 내용을 기록하기 위해 대화의 내용이 기록되고 나중에 회의록을 작성하기 위해 녹음 된 오디오가 들리고 텍스트로 전사됩니다. 그러나 대화의 내용을 문장으로 적어 두는 것이 매우 번거롭다고 상상하기 쉽습니다.

Microsoft Azure 음성 서비스를 사용하여 음성 데이터를 텍스트로 자동으로 내보내고 출력하는 방법은 다음과 같습니다. 이전 예제에서는 모임의 기록이지만 이 팁에서는 오디오 파일에서 추출되므로 대화 내용이 포함된 모든 항목에 적용할 수 있습니다.

또한, 이번에는 텍스트로 전사하는 것에 대해 이야기하고 있습니다. Microsoft Azure 음성 서비스를 사용하여 녹음하는 동안 변환하고 번역할 수도 있습니다.

수수료 정보

이번에는 무료 플랜을 사용하므로 작동하려고해도 요금이 청구되지 않습니다. 그러나 무료 플랜에는 시간과 캐릭터 제한이 있으므로 실제로 운영 한 후 더 많은 전환이 필요한 경우 유료 계획으로 변경하십시오.

가격은 다음 공식 페이지를 참조하십시오. 클라우드 서비스이기 때문에 계절에 따라 요금이 변동될 수 있습니다.

Microsoft Azure 포털에 액세스

웹 브라우저에서 다음 URL에 액세스합니다.

이미 로그인한 경우 완료된 것입니다. 아직 로그인하지 않은 경우 다음 화면이 표시되므로 로그인하십시오.

로그인하면 다음 화면이 표시됩니다. 설정하는 디자인에 따라 디스플레이가 다를 수 있습니다.

Microsoft Azure에서 음성 서비스 만들기

포털 위의 검색 입력 필드에 "음성"을 입력하면 "음성 서비스"가 나오므로 선택하십시오.

「코그너티브 서비스 | "음성 서비스" 화면이 표시되면 "만들기"를 선택합니다.

"음성 서비스 만들기" 화면이 열리므로 필요한 항목을 입력합니다.

기본

의 입력 예
항목내용
구독 결제할 구독을 선택합니다. 무료일지라도 항상 어떤 종류의 구독에 연결해야합니다.
리소스 그룹 음성 서비스를 포함할 리소스 그룹을 지정합니다. 아직 만들지 않았다면 아래의 "새로 만들기"에서 하나를 만드십시오. 다양한 서비스를 만들 때 리소스 그룹을 그룹으로 생각할 수 있습니다.
부위 가장 자주 사용할 수있는 장소 근처를 선택하십시오. 그러나 가격은 지역에 따라 다를 수 있습니다. 일본 동부
이름 이 음성 서비스의 모든 이름입니다. 둘 이상의 음성 서비스를 만드는 경우 이름이 설명적인지 확인하십시오. 이 이름은 전역적이고 고유하므로 다른 곳에서 사용되는 이름은 사용할 수 없습니다. SpeechToText-Test
가격 책정 계층 무료로 사용하려면 "무료 F0"을 선택하십시오. 유료로 사용하려면 다른 계획을 선택하십시오. 물론 무료라면 제한이 있습니다. 무료 F0

입력되면 아래> 다음: 네트워크 연결을 선택합니다.

네트워크

의 입력 예
항목내용
종류 이 음성 서비스에 액세스할 수 있는 범위를 지정합니다. 자세한 설정없이 어디서나 액세스 할 수있게하려면 "인터넷 포함 ..."을 선택하십시오. "어디서나 액세스 할 수 있습니다"는 "누구나 액세스 할 수 있음"을 의미하지만 실제로이 후에 얻을 수있는 "키"를 가진 사람 만 액세스 할 수 있으므로 보안 측면에서는 그리 큰 문제가 없습니다. 인터넷 포함...

입력했으면 아래> 다음: ID를 선택합니다.

신원

의 입력 예
항목내용
시스템 할당 관리 ID 이번에는 음성 서비스만 사용하므로 끄는 것이 좋습니다. 꺼짐
사용자 할당 관리 ID 이번에는 사용자를 만들지 않기 때문에 추가 할 필요가 없습니다. 없이

입력했으면 아래> 다음: 태그 지정을 선택합니다.

태그

태그는 이번에는 사용되지 않으므로 설정되지 않습니다.

입력되면 다음: 검토를 선택하고 아래> 만듭니다.

검토 및 만들기

입력 내용에 문제가 없으면 "유효성 검사 성공"이 표시됩니다. 문제가 있으면 오류 메시지가 표시되므로 돌아가서 다시 설정하십시오.

입력 내용에 문제가 없으면 "만들기"버튼을 클릭하십시오. 그런 다음 배포가 시작됩니다.

잠시 후 배포가 완료되고 다음 화면이 표시됩니다. 배포 이름은 길지만 배포 시 임시적이므로 걱정할 필요가 없습니다.

리소스로 이동 단추를 클릭하여 음성 서비스가 만들어졌는지 확인할 수 있습니다.

키 생성 및 검색

클라이언트에서 이 음성 서비스에 액세스하려면 인증 키가 필요합니다. 이 키가있는 프로그램에서만 액세스 할 수 있으므로이 키가 타사에 의해 도난 당하지 않도록해야합니다.

여기서 "클라이언트"는 데스크톱 앱, 스마트폰 앱 및 웹앱과 같이 Microsoft Azure를 사용하는 모든 프로그램을 나타냅니다.

키를 가져오려면 만든 음성 서비스로 이동합니다. 대시보드, 리소스 그룹 등에서 액세스할 수 있습니다.

음성 서비스 페이지가 열리면 왼쪽 메뉴에서 키 및 끝점을 선택합니다.

그런 다음 "키 및 끝점"페이지가 열리고 "키 1", "키 2", "위치 / 지역"및 "끝점"항목이 표시됩니다.

두 항목 모두 필요하지만 "키 2"는 예비 프레임이므로 대부분의 경우 사용되지 않습니다.

각 값을 기록해 둡니다. 설명에서 언급했듯이 예기치 않게 개발 당사자와 키를 공유하지 마십시오.

키가 유출되면 위의 "키 1 다시 생성"을 클릭하여 새 키를 발급하십시오. 물론이 경우 이전 키를 더 이상 사용할 수 없습니다.

프로그램에서 음성 서비스를 사용하여 음성에서 텍스트 추출

이제부터는 음성 서비스의 사용이 사용되는 프로그램에 따라 변경됩니다. 이번에는 .NET 데스크톱 응용 프로그램에서 액세스하지만 다른 프레임 워크를 사용하는 경우 인터넷에서 사용해보십시오. 공식 웹 사이트에는 여러 언어로 사용하는 방법에 대한 지침도 있습니다.

이번에는 Visual Studio 2022에서 WPF 데스크톱 앱을 만듭니다. Visual Studio Code의 경우 디자이너가 없기 때문에 약간 번거롭지 만 프로그램 부분 만 추출하면 콘솔 응용 프로그램이나 웹 응용 프로그램에서 사용할 수 있습니다.

프로젝트 만들기

비주얼 스튜디오 2022를 시작합니다.

새 프로젝트 만들기를 선택합니다.

WPF 응용 프로그램을 선택합니다.

프로젝트 이름과 위치는 임의적입니다. 입력되면 다음을 선택합니다.

버전을 ". NET 6.0". 설정되면 "만들기"버튼을 클릭하십시오.

누겟 설정

Microsoft Azure API에 대한 액세스를 처음부터 만들 수 있지만 이미 공식 라이브러리가 있으므로 사용하기가 더 쉽습니다.

솔루션에 대한 종속성을 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다.

"찾아보기" 탭을 선택하고 검색 입력 필드에 "Microsoft.CognitiveServices.Speech"를 입력하면 목록이 표시되므로 "Microsoft.CognitiveServices.Speech"를 선택하고 설치 단추를 클릭합니다.

확인 단추를 클릭합니다.

동의함을 선택합니다.

완료되면 패키지에 추가됩니다.

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 프로그램은 모두 메소드로 포장되어 있습니다. 다른 프레임 워크에서 사용하려면 이 코드를 기반으로 다시 작성하십시오.

메인윈도우.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 음성 서비스에 따라 달라지기 때문에 완벽하지 않습니다. 목소리가 조용하고 명확하게 말하면 상당한 정확도로 추출 될 것이라고 생각합니다. 클라우드 서비스이기 때문에 정확도가 현재 그렇게 높지 않더라도 알기도 전에 더 좋아질 수 있으므로 해당 영역에서 아무 것도하지 않는 것이 쉽습니다.