音声録音内の異なる話者の分離

は、

このページでは、Cloud Speech-to-Text で音声文字変換する音声データ内の話者ごとにラベル付けする方法について説明します。

音声データに複数の人が話しているサンプルが含まれていることがあります。たとえば、電話の通話には 2 人以上の音声が含まれていることが一般的です。そのため、通話の音声文字変換では、その都度、話者が誰であるのかを示すことが理想的です。

話者ダイアライゼーション

Cloud Speech-to-Text は、音声クリップ内の複数の話者を認識できます。音声文字変換リクエストを Cloud Speech-to-Text に送信するときに、音声サンプル内の異なる話者を識別するように指示するパラメータを指定できます。この機能は「話者ダイアライゼーション」と呼ばれ、音声内で話者が変わったことを検出して、検出した各音声に番号でラベル付けします。

音声文字変換リクエストで話者ダイアライゼーションを有効にすると、Cloud Speech-to-Text は音声サンプルに含まれる異なる音声を識別するようになります。音声文字変換された各単語には、話者ごとに割り当てられた番号のタグがつけられます。同じ話者が話した単語は同じ数字になります。音声文字変換の結果に含まれる話者の最大数は、Cloud Speech-to-Text が音声サンプル内で一意に特定可能な話者の数です。

Cloud Speech-to-Text で話者ダイアライゼーションを使用すると、音声文字変換のすべての結果について、その時点までの集計情報が生成されます。各結果には前の結果の単語が含まれます。したがって、最終結果の words 配列が、音声文字変換の完全なダイアライゼーションの結果になります。

リクエストで話者ダイアライゼーションを有効にする

話者ダイアライゼーションを有効にするには、リクエストの際に RecognitionConfig パラメータの enableSpeakerDiarization フィールドを true に設定する必要があります。音声文字変換の結果を向上させるためには、RecognitionConfig パラメータの diarizationSpeakerCount フィールドで音声クリップ内の話者の数も指定します。diarizationSpeakerCount の値を指定しない場合は、デフォルト値が使用されます。

Speech-to-Text では、speech:recognizespeech:longrunningrecognizeストリーミングのどの音声認識メソッドでも話者ダイアライゼーションをサポートしています。

次のコード スニペットは、Cloud Speech-to-Text への音声文字変換リクエストで話者ダイアライゼーションを有効にする方法を示しています。

プロトコル

詳しくは、speech:recognize API エンドポイントをご覧ください。

同期音声認識を実行するには、POST リクエストを作成し、適切なリクエスト本文を指定します。次は、curl を使用した POST リクエストの例です。この例では、Google Cloud Platform Cloud SDK を使ってプロジェクト用に設定されたサービス アカウントのアクセス トークンを使用しています。Cloud SDK のインストール、サービス アカウントを使用したプロジェクトの設定、アクセス トークンの取得については、クイックスタートをご覧ください。

curl -s -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    https://speech.googleapis.com/v1p1beta1/speech:recognize \
    --data '{
    "config": {
        "encoding":"LINEAR16",
        "languageCode": "en-US",
        "enableSpeakerDiarization": true,
        "diarizationSpeakerCount": 2,
        "model": "phone_call"
    },
    "audio": {
        "uri":"gs://cloud-samples-tests/speech/commercial_mono.wav"
    }
}' > speaker-diarization.txt

リクエストが成功すると、サーバーは 200 OK HTTP ステータス コードと JSON 形式のレスポンス(speaker-diarization.txt というファイル名で保存される)を返します。

{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "hi I'd like to buy a Chromecast and I was wondering whether you could help me with that certainly which color would you like we have blue black and red uh let's go with the black one would you like the new Chromecast Ultra model or the regular Chrome Cast regular Chromecast is fine thank you okay sure we like to ship it regular or Express Express please terrific it's on the way thank you thank you very much bye",
          "confidence": 0.92142606,
          "words": [
            {
              "startTime": "0s",
              "endTime": "1.100s",
              "word": "hi",
              "speakerTag": 2
            },
            {
              "startTime": "1.100s",
              "endTime": "2s",
              "word": "I'd",
              "speakerTag": 2
            },
            {
              "startTime": "2s",
              "endTime": "2s",
              "word": "like",
              "speakerTag": 2
            },
            {
              "startTime": "2s",
              "endTime": "2.100s",
              "word": "to",
              "speakerTag": 2
            },
            ...
            {
              "startTime": "6.500s",
              "endTime": "6.900s",
              "word": "certainly",
              "speakerTag": 1
            },
            {
              "startTime": "6.900s",
              "endTime": "7.300s",
              "word": "which",
              "speakerTag": 1
            },
            {
              "startTime": "7.300s",
              "endTime": "7.500s",
              "word": "color",
              "speakerTag": 1
            },
            ...
          ]
        }
      ],
      "languageCode": "en-us"
    }
  ]
}

Java

/**
 * Transcribe the given audio file using speaker diarization.
 *
 * @param fileName the path to an audio file.
 */
public static void transcribeDiarization(String fileName) throws Exception {
  Path path = Paths.get(fileName);
  byte[] content = Files.readAllBytes(path);

  try (SpeechClient speechClient = SpeechClient.create()) {
    // Get the contents of the local audio file
    RecognitionAudio recognitionAudio =
        RecognitionAudio.newBuilder().setContent(ByteString.copyFrom(content)).build();

    // Configure request to enable Speaker diarization
    RecognitionConfig config =
        RecognitionConfig.newBuilder()
            .setEncoding(AudioEncoding.LINEAR16)
            .setLanguageCode("en-US")
            .setSampleRateHertz(8000)
            .setEnableSpeakerDiarization(true)
            .setDiarizationSpeakerCount(2)
            .build();

    // Perform the transcription request
    RecognizeResponse recognizeResponse = speechClient.recognize(config, recognitionAudio);

    // Print out the results
    for (SpeechRecognitionResult result : recognizeResponse.getResultsList()) {
      // There can be several alternative transcripts for a given chunk of speech. Just
      // use the first (most likely) one here.
      SpeechRecognitionAlternative alternative = result.getAlternatives(0);
      System.out.format("Transcript : %s\n", alternative.getTranscript());
      // The words array contains the entire transcript up until that point.
      // Referencing the last spoken word to get the associated Speaker tag
      System.out.format(
          "Speaker Tag %s: %s\n",
          alternative.getWords((alternative.getWordsCount() - 1)).getSpeakerTag(),
          alternative.getTranscript());
    }
  }
}

Node.js

const fs = require('fs');

// Imports the Google Cloud client library
const speech = require('@google-cloud/speech').v1p1beta1;

// Creates a client
const client = new speech.SpeechClient();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const fileName = 'Local path to audio file, e.g. /path/to/audio.raw';

const config = {
  encoding: `LINEAR16`,
  sampleRateHertz: 8000,
  languageCode: `en-US`,
  enableSpeakerDiarization: true,
  diarizationSpeakerCount: 2,
  model: `phone_call`,
};

const audio = {
  content: fs.readFileSync(fileName).toString('base64'),
};

const request = {
  config: config,
  audio: audio,
};

const [response] = await client.recognize(request);
const transcription = response.results
  .map(result => result.alternatives[0].transcript)
  .join('\n');
console.log(`Transcription: ${transcription}`);
console.log(`Speaker Diarization:`);
const result = response.results[response.results.length - 1];
const wordsInfo = result.alternatives[0].words;
// Note: The transcript within each result is separate and sequential per result.
// However, the words list within an alternative includes all the words
// from all the results thus far. Thus, to get all the words with speaker
// tags, you only have to take the words list from the last result:
wordsInfo.forEach(a =>
  console.log(` word: ${a.word}, speakerTag: ${a.speakerTag}`)
);

Python

from google.cloud import speech_v1p1beta1 as speech
client = speech.SpeechClient()

speech_file = 'resources/commercial_mono.wav'

with open(speech_file, 'rb') as audio_file:
    content = audio_file.read()

audio = speech.types.RecognitionAudio(content=content)

config = speech.types.RecognitionConfig(
    encoding=speech.enums.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=8000,
    language_code='en-US',
    enable_speaker_diarization=True,
    diarization_speaker_count=2)

print('Waiting for operation to complete...')
response = client.recognize(config, audio)

# The transcript within each result is separate and sequential per result.
# However, the words list within an alternative includes all the words
# from all the results thus far. Thus, to get all the words with speaker
# tags, you only have to take the words list from the last result:
result = response.results[-1]

words_info = result.alternatives[0].words

# Printing out the output:
for word_info in words_info:
    print("word: '{}', speaker_tag: {}".format(word_info.word,
                                               word_info.speaker_tag))

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。