バッチ文字起こしの使用方法How to use batch transcription

バッチ文字起こしは、ストレージ内の大量のオーディオを文字起こしする場合に最適です。Batch transcription is ideal for transcribing a large amount of audio in storage. 専用の REST API を使用すると、Shared Access Signatures (SAS) URI でオーディオ ファイルを示して、非同期に文字起こしの結果を受け取ることができます。By using the dedicated REST API, you can point to audio files with a shared access signature (SAS) URI and asynchronously receive transcription results.

API によって、音声からテキストへの非同期文字起こしと他の機能が提供されます。The API offers asynchronous speech-to-text transcription and other features. REST API を使用すると、以下を行うためのメソッドを公開できます。You can use REST API to expose methods to:

  • バッチ処理要求を作成するCreate a batch processing requests
  • 状態を照会するQuery the status
  • 文字起こしの結果をダウンロードするDownload transcription results
  • サービスから文字起こしの情報を削除するDelete transcription information from the service

詳細な API は、Swagger のドキュメントの見出し Custom Speech transcriptions の下にあります。The detailed API is available as a Swagger document, under the heading Custom Speech transcriptions.

バッチ文字起こしジョブは、ベスト エフォート ベースでスケジュールされます。Batch transcription jobs are scheduled on a best effort basis. 現時点では、ジョブがいつ実行状態になるかについて予測できません。Currently there is no estimate for when a job will change into the running state. 通常のシステム負荷では、この処理は数分以内に行われます。Under normal system load, it should happen within minutes. いったん実行状態になると、実際の文字起こしはリアルタイムのオーディオより速く処理されます。Once in the running state, the actual transcription is processed faster than the audio real time.

使用しやすい API のほかに、カスタム エンドポイントをデプロイする必要はなく、監視する必要のある同時実行要件もありません。Next to the easy-to-use API, you don't need to deploy custom endpoints, and you don't have any concurrency requirements to observe.

前提条件Prerequisites

サブスクリプション キーSubscription Key

Speech Service の他の機能と同様に、使用開始ガイドに従って Azure portal でサブスクリプション キーを作成します。As with all features of the Speech service, you create a subscription key from the Azure portal by following our Get started guide.

注意

バッチ文字起こしを使用するには、音声サービスの Standard サブスクリプション (S0) が必要です。A standard subscription (S0) for Speech service is required to use batch transcription. Free サブスクリプション キー (F0) は機能しません。Free subscription keys (F0) will not work. 詳細については、価格と制限に関するページを参照してください。For more information, see pricing and limits.

カスタム モデルCustom models

音響モデルまたは言語モデルをカスタマイズする場合は、音響モデルのカスタマイズおよびカスタマイズ言語モデルの設計に関するページの手順に従ってください。If you plan to customize acoustic or language models, follow the steps in Customize acoustic models and Design customization language models. 作成されたモデルをバッチ文字起こしで使用するには、モデル ID が必要です。To use the created models in batch transcription, you need their model IDs. モデルの詳細を調べると、モデル ID を取得できます。You can retrieve the model ID when you inspect the details of the model. デプロイされたカスタム エンドポイントは、バッチ文字起こしサービスには必要ありません。A deployed custom endpoint is not needed for the batch transcription service.

Batch 文字起こし APIThe Batch Transcription API

サポートされるフォーマットSupported formats

Batch 文字起こし API では、次の形式がサポートされています。The Batch Transcription API supports the following formats:

FormatFormat コーデックCodec BitrateBitrate サンプル レートSample Rate
WAVWAV PCM 0PCM 16 ビット16-bit 8 kHz または 16 kHz、モノラルまたはステレオ8 kHz or 16 kHz, mono or stereo
MP3MP3 PCM 0PCM 16 ビット16-bit 8 kHz または 16 kHz、モノラルまたはステレオ8 kHz or 16 kHz, mono or stereo
OGGOGG OPUSOPUS 16 ビット16-bit 8 kHz または 16 kHz、モノラルまたはステレオ8 kHz or 16 kHz, mono or stereo

ステレオ オーディオ ストリームの場合、文字起こし中に左チャンネルと右チャンネルが分離されます。For stereo audio streams, the left and right channels are split during the transcription. 各チャネルに対して、JSON 結果ファイルが作成されます。For each channel, a JSON result file is being created. 発話ごとに生成されるタイムスタンプにより、開発者は時間順の最終文字起こしを作成できます。The timestamps generated per utterance enable the developer to create an ordered final transcript.

構成Configuration

構成パラメーターは JSON として提供されます。Configuration parameters are provided as JSON:

{
  "recordingsUrl": "<URL to the Azure blob to transcribe>",
  "models": [{"Id":"<optional acoustic model ID>"},{"Id":"<optional language model ID>"}],
  "locale": "<locale to use, for example en-US>",
  "name": "<user defined name of the transcription batch>",
  "description": "<optional description of the transcription>",
  "properties": {
    "ProfanityFilterMode": "None | Removed | Tags | Masked",
    "PunctuationMode": "None | Dictated | Automatic | DictatedAndAutomatic",
    "AddWordLevelTimestamps" : "True | False",
    "AddSentiment" : "True | False",
    "AddDiarization" : "True | False",
    "TranscriptionResultsContainerUrl" : "<service SAS URI to Azure container to store results into (write permission required)>"
  }
}

構成プロパティConfiguration properties

次の省略可能なプロパティを使用して、文字起こしを構成します。Use these optional properties to configure transcription:

パラメーターParameter 説明Description
ProfanityFilterMode 認識結果内の不適切な表現をどう扱うかを指定します。Specifies how to handle profanity in recognition results. 指定できる値は、None (不適切な表現のフィルターを無効にする)、Masked (不適切な表現をアスタリスクに置き換える)、Removed (すべての不適切な表現を結果から除去する) または Tags ("不適切な表現" のタグを追加する) です。Accepted values are None which disables profanity filtering, Masked which replaces profanity with asterisks, Removed which removes all profanity from the result, or Tags which adds "profanity" tags. 既定の設定は Masked です。The default setting is Masked.
PunctuationMode 認識結果内の句読点をどう扱うかを指定します。Specifies how to handle punctuation in recognition results. 指定できる値は、None (句読点を無効にする)、Dictated (明示的な句読点)、Automatic (デコーダーで句読点を処理する)、DictatedAndAutomatic (指定された句読点、または自動) です。Accepted values are None which disables punctuation, Dictated which implies explicit punctuation, Automatic which lets the decoder deal with punctuation, or DictatedAndAutomatic which implies dictated punctuation marks or automatic.
AddWordLevelTimestamps 単語レベルのタイムスタンプを出力に追加するかどうかを指定します。Specifies if word level timestamps should be added to the output. true を指定すると単語レベルのタイムスタンプが有効になり、false (既定値) を指定すると無効になります。Accepted values are true which enables word level timestamps and false (the default value) to disable it.
AddSentiment センチメントを発話に追加するかどうかを指定します。Specifies sentiment should be added to the utterance. true を指定すると発話ごとのセンチメントが有効になり、false (既定値) を指定すると無効になります。Accepted values are true which enables sentiment per utterance and false (the default value) to disable it.
AddDiarization 2 つの音声を含むモノラル チャネルであることが予測される入力に対してダイアライゼーション分析を実行する必要があることを指定します。Specifies that diarization analysis should be carried out on the input which is expected to be mono channel containing two voices. 指定できる値は、ダイアライゼーションを有効にする true と、それを無効にする false (既定値) です。Accepted values are true which enables diarization and false (the default value) to disable it. さらに、AddWordLevelTimestamps を true に設定する必要があります。It also requires AddWordLevelTimestamps to be set to true.
TranscriptionResultsContainerUrl Azure の書き込み可能なコンテナーに対するサービス SAS のオプションの URL。Optional URL with service SAS to a writeable container in Azure. 結果はこのコンテナーに格納されます。The result will be stored in this container.

ストレージStorage

Batch 文字起こしでは、オーディオの読み取りや、文字起こしのストレージへの書き込みに Azure Blob Storage をサポートしています。Batch transcription supports Azure Blob storage for reading audio and writing transcriptions to storage.

バッチ文字起こしの結果The batch transcription result

モノラル入力オーディオの場合、1 つの文字起こし結果ファイルが作成されます。For mono input audio, one transcription result file is being created. ステレオ入力オーディオの場合、2 つの文字起こし結果ファイルが作成されます。For stereo input audio, two transcription result files are being created. それぞれ次のような構造です。Each has this structure:

{
  "AudioFileResults":[ 
    {
      "AudioFileName": "Channel.0.wav | Channel.1.wav"      'maximum of 2 channels supported'
      "AudioFileUrl": null                                  'always null'
      "AudioLengthInSeconds": number                        'Real number. Two decimal places'
      "CombinedResults": [
        {
          "ChannelNumber": null                             'always null'
          "Lexical": string
          "ITN": string
          "MaskedITN": string
          "Display": string
        }
      ]
      SegmentResults:[                                      'for each individual segment'
        {
          "RecognitionStatus": "Success | Failure"
          "ChannelNumber": null
          "SpeakerId": null | "1 | 2"                       'null if no diarization
                                                             or stereo input file, the
                                                             speakerId as a string if
                                                             diarization requested for
                                                             mono audio file'
          "Offset": number                                  'time in ticks (1 tick is 100 nanosec)'
          "Duration": number                                'time in ticks (1 tick is 100 nanosec)'
          "OffsetInSeconds" : number                        'Real number. Two decimal places'
          "DurationInSeconds" : number                      'Real number. Two decimal places'
          "NBest": [
            {
              "Confidence": number                          'between 0 and 1'
              "Lexical": string
              "ITN": string
              "MaskedITN": string
              "Display": string
              "Sentiment":
                {                                           'this is omitted if sentiment is
                                                             not requested'
                  "Negative": number                        'between 0 and 1'
                  "Neutral": number                         'between 0 and 1'
                  "Positive": number                        'between 0 and 1'
                }
              "Words": [
                {
                  "Word": string
                  "Offset": number                          'time in ticks (1 tick is 100 nanosec)'
                  "Duration": number                        'time in ticks (1 tick is 100 nanosec)'
                  "OffsetInSeconds": number                 'Real number. Two decimal places'
                  "DurationInSeconds": number               'Real number. Two decimal places'
                  "Confidence": number                      'between 0 and 1'
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

結果には、次の形式が含まれます。The result contains these forms:

FormForm コンテンツContent
Lexical 実際に認識された単語。The actual words recognized.
ITN 認識されたテキストの逆テキスト正規化形式。Inverse-text-normalized form of the recognized text. 略語 ("doctor smith" から "dr smith")、電話番号、およびその他の変換が適用されます。Abbreviations ("doctor smith" to "dr smith"), phone numbers, and other transformations are applied.
MaskedITN 不適切表現のマスキングを適用した ITN 形式。The ITN form with profanity masking applied.
Display 認識されたテキストの表示形式。The display form of the recognized text. これには、追加された句読点と大文字化が含まれます。This includes added punctuation and capitalization.

話者の分離 (ダイアライゼーション)Speaker separation (Diarization)

ダイアライゼーションは、音声に含まれる話者を分離するプロセスです。Diarization is the process of separating speakers in a piece of audio. ダイアライゼーションはバッチ パイプラインによってサポートされ、モノラル チャンネル レコーディングの 2 人の話者を認識できます。Our Batch pipeline supports diarization and is capable of recognizing two speakers on mono channel recordings. この機能は、ステレオ録音では使用できません。The feature is not available on stereo recordings.

すべての文字起こし出力には SpeakerId が含まれます。All transcription output contains a SpeakerId. ダイアライゼーションが使用されていない場合、JSON 出力では "SpeakerId": null が示されます。If diarization is not used, it will show "SpeakerId": null in the JSON output. ダイアライゼーションでは 2 つの音声がサポートされるため、話者は "1" または "2" として識別されます。For diarization we support two voices, so the speakers will be identified as "1" or "2".

ダイアライゼーションを要求するには、次に示すように、HTTP 要求に関連するパラメーターを追加する必要があります。To request diarization, you simply have to add the relevant parameter in the HTTP request as shown below.

{
 "recordingsUrl": "<URL to the Azure blob to transcribe>",
 "models": [{"Id":"<optional acoustic model ID>"},{"Id":"<optional language model ID>"}],
 "locale": "<locale to us, for example en-US>",
 "name": "<user defined name of the transcription batch>",
 "description": "<optional description of the transcription>",
 "properties": {
   "AddWordLevelTimestamps" : "True",
   "AddDiarization" : "True"
 }
}

単語レベルのタイムスタンプも、上の要求に示されているように、パラメーターとして "有効にする" 必要があります。Word-level timestamps would also have to be 'turned on' as the parameters in the above request indicate.

センチメント分析Sentiment analysis

センチメント機能によって、オーディオで表現されたセンチメント (感情) が推測されます。The sentiment feature estimates the sentiment expressed in the audio. センチメントは、NegativeNeutral、および Positive センチメントについて、0 から 1 の値で表されます。The sentiment is expressed by a value between 0 and 1 for Negative, Neutral, and Positive sentiment. たとえば、感情分析は、コール センターのシナリオで使用できます。For example, sentiment analysis can be used in call center scenarios:

  • 顧客満足度に関する分析情報を得るGet insight on customer satisfaction
  • エージェント (通話を受けるチーム) のパフォーマンスに関する分析情報を得るGet insight on the performance of the agents (team taking the calls)
  • 通話がネガティブな方向に向かったときの正確なポイントインタイムを見つけるFind the exact point in time when a call took a turn in a negative direction
  • ネガティブ通話がポジティブな方向に向かったときに何が良かったのか特定するWhat went well when turning a negative call into a positive direction
  • 製品やサービスについて、お客様が何を気に入り、何を好まないかを特定するIdentify what customers like and what they dislike about a product or a service

センチメントは、語彙形式に基づいてオーディオ セグメントごとにスコア付けされます。Sentiment is scored per audio segment based on the lexical form. そのオーディオ セグメント内のテキスト全体が、センチメントの計算に使用されます。The entire text within that audio segment is used to calculate sentiment. 文字起こし全体に対して集計センチメントは計算されません。No aggregate sentiment is being calculated for the entire transcription.

JSON の出力サンプルは、次のようになります。A JSON output sample looks like below:

{
  "AudioFileResults": [
    {
      "AudioFileName": "Channel.0.wav",
      "AudioFileUrl": null,
      "SegmentResults": [
        {
          "RecognitionStatus": "Success",
          "ChannelNumber": null,
          "Offset": 400000,
          "Duration": 13300000,
          "NBest": [
            {
              "Confidence": 0.976174,
              "Lexical": "what's the weather like",
              "ITN": "what's the weather like",
              "MaskedITN": "what's the weather like",
              "Display": "What's the weather like?",
              "Words": null,
              "Sentiment": {
                "Negative": 0.206194,
                "Neutral": 0.793785,
                "Positive": 0.0
              }
            }
          ]
        }
      ]
    }
  ]
}

ベスト プラクティスBest practices

文字起こしサービスは、送信された多数の文字起こしを処理できます。The transcription service can handle large number of submitted transcriptions. 文字起こしメソッドGET を使用して、文字起こしの状態を照会できます。You can query the status of your transcriptions through a GET on the transcriptions method. take パラメーター (数百) を指定することで、返される情報を妥当なサイズに保つようにします。Keep the information returned to a reasonable size by specifying the take parameter (a few hundred). 結果を取得した後、サービスから定期的に文字起こしを削除してください。Delete transcriptions regularly from the service once you retrieved the results. これにより、文字起こし管理の呼び出しからの迅速な応答が保証されます。This will guarantee quick replies from the transcription management calls.

サンプル コードSample code

完全なサンプルは、GitHub サンプル リポジトリsamples/batch サブディレクトリにあります。Complete samples are available in the GitHub sample repository inside the samples/batch subdirectory.

自分のサブスクリプション情報、サービス リージョン、文字起こしするオーディオ ファイルをポイントする SAS URI、カスタムの音響モデルまたは言語モデルを使用する場合のモデル ID で、サンプル コードをカスタマイズする必要があります。You have to customize the sample code with your subscription information, the service region, the SAS URI pointing to the audio file to transcribe, and model IDs in case you want to use a custom acoustic or language model.

// Replace with your subscription key
private const string SubscriptionKey = "YourSubscriptionKey";

// Update with your service region
private const string Region = "YourServiceRegion";
private const int Port = 443;

// recordings and locale
private const string Locale = "en-US";
private const string RecordingsBlobUri = "<SAS URI pointing to an audio file stored in Azure Blob Storage>";

// For usage of baseline models, no acoustic and language model needs to be specified.
private static Guid[] modelList = new Guid[0];

// For use of specific acoustic and language models:
// - comment the previous line
// - uncomment the next lines to create an array containing the guids of your required model(s)
// private static Guid AdaptedAcousticId = new Guid("<id of the custom acoustic model>");
// private static Guid AdaptedLanguageId = new Guid("<id of the custom language model>");
// private static Guid[] modelList = new[] { AdaptedAcousticId, AdaptedLanguageId };

//name and description
private const string Name = "Simple transcription";
private const string Description = "Simple transcription description";

サンプル コードでは、クライアントが設定されて、文字起こし要求が送信されます。The sample code will set up the client and submit the transcription request. その後、状態情報がポーリングされて、文字起こしの進行状況に関する詳細が表示されます。It will then poll for status information and print details about the transcription progress.

// get all transcriptions for the user
transcriptions = await client.GetTranscriptionsAsync().ConfigureAwait(false);

completed = 0; running = 0; notStarted = 0;
// for each transcription in the list we check the status
foreach (var transcription in transcriptions)
{
    switch (transcription.Status)
    {
        case "Failed":
        case "Succeeded":
            // we check to see if it was one of the transcriptions we created from this client.
            if (!createdTranscriptions.Contains(transcription.Id))
            {
                // not created form here, continue
                continue;
            }
            completed++;

            // if the transcription was successful, check the results
            if (transcription.Status == "Succeeded")
            {
                var resultsUri0 = transcription.ResultsUrls["channel_0"];

                WebClient webClient = new WebClient();

                var filename = Path.GetTempFileName();
                webClient.DownloadFile(resultsUri0, filename);
                var results0 = File.ReadAllText(filename);
                var resultObject0 = JsonConvert.DeserializeObject<RootObject>(results0);
                Console.WriteLine(results0);

                Console.WriteLine("Transcription succeeded. Results: ");
                Console.WriteLine(results0);
            }
            else
            {
                Console.WriteLine("Transcription failed. Status: {0}", transcription.StatusMessage);
            }
            break;

        case "Running":
            running++;
            break;

        case "NotStarted":
            notStarted++;
            break;
    }
}

前の呼び出しに関する詳細については、Swagger ドキュメントを参照してください。For full details about the preceding calls, see our Swagger document. ここに示すすべてのサンプルについては、GitHubsamples/batch サブディレクトリにアクセスしてください。For the full sample shown here, go to GitHub in the samples/batch subdirectory.

オーディオを渡して文字起こしの状態を受け取る非同期セットアップに注意してください。Take note of the asynchronous setup for posting audio and receiving transcription status. 作成されるクライアントは .NET HTTP クライアントです。The client that you create is a .NET HTTP client. PostTranscriptions メソッドはオーディオ ファイルの詳細を送信し、GetTranscriptions メソッドは結果を受け取ります。There's a PostTranscriptions method for sending the audio file details and a GetTranscriptions method for receiving the results. PostTranscriptions はハンドルを返し、GetTranscriptions はそのハンドルを使用して文字起こしの状態を取得するためのハンドルを作成します。PostTranscriptions returns a handle, and GetTranscriptions uses it to create a handle to get the transcription status.

現在のサンプル コードでは、カスタム モデルは指定されていません。The current sample code doesn't specify a custom model. サービスは、ベースライン モデルをファイルの文字起こしに使用します。The service uses the baseline models for transcribing the file or files. モデルを指定するために、音響モデルと言語モデルのモデル ID と同じメソッドに渡すことができます。To specify the models, you can pass on the same method as the model IDs for the acoustic and the language model.

注意

ベースライン文字起こしの場合は、ベースライン モデルの ID を宣言する必要はありません。For baseline transcriptions, you don't need to declare the ID for the baseline models. 言語モデル ID だけを指定すると (音響モデル ID を指定しない)、一致する音響モデルが自動的に選択されます。If you only specify a language model ID (and no acoustic model ID), a matching acoustic model is automatically selected. 音響モデル ID だけを指定すると、一致する言語モデルが自動的に選択されます。If you only specify an acoustic model ID, a matching language model is automatically selected.

サンプルのダウンロードDownload the sample

サンプルについては、GitHub のサンプル リポジトリsamples/batch ディレクトリをご覧ください。You can find the sample in the samples/batch directory in the GitHub sample repository.

次のステップNext steps