質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python

    11799questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    9879questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Google Cloud Platform

    237questions

    Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Python3 Google Cloud Speech APIの表示

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 307

kuroto-ra

score 1

この記事GitHubのソースを参考にGoogle Cloud Speech APIを利用できるところまではできたのですが、

音声
音声の
音声のに
音声の認識
音声の認識で
音声の認識です
 テスト
 テスト
 テスト
 テスト
音声の認識 テスト


といった感じで不要な部分を少し削ることはできたのですが認識中の言葉も表示されてしまい、最終的な認識された結果(音声の認識 テストの部分)だけを取得することができず、困っています。

GitHubのソース
ほとんどこちらの方の引用ですが、該当ソースです。
リアルタイムに取得した音声の最終結果を拾う方法を教えて頂きたいです。

import pyaudio, time, audioop, math, sys, argparse
from gcloud.credentials import get_credentials
from google.cloud.speech.v1beta1 import cloud_speech_pb2
from google.rpc import code_pb2
from grpc.beta import implementations

class stdout:
    BOLD = "\033[1m"
    END = "\033[0m"
    CLEAR = "\033[2K"

def bold(string):
    return stdout.BOLD + string

def printr(string):
    sys.stdout.write("\r")
    sys.stdout.write(string)
    sys.stdout.flush()

frames = []
silent_frames = []
is_recording = False
should_finish_stream = False

class Result:
    def __init__(self):
        self.transcription = ""
        self.confidence = ""
        self.is_final = False

recognition_result = Result()

def make_channel(host, port):
    ssl_channel = implementations.ssl_channel_credentials(None, None, None)
    creds = get_credentials().create_scoped(args.speech_scope)
    auth_header = ("authorization", "Bearer " + creds.get_access_token().access_token)
    auth_plugin = implementations.metadata_call_credentials(lambda _, func: func([auth_header], None), name="google_creds")
    composite_channel = implementations.composite_channel_credentials(ssl_channel, auth_plugin)
    return implementations.secure_channel(host, port, composite_channel)

def listen_loop(recognize_stream):
    global should_finish_stream
    global recognition_result

    for resp in recognize_stream:
        if resp.error.code != code_pb2.OK:
            raise RuntimeError(resp.error.message)

        for result in resp.results:
            for alt in result.alternatives:
                recognition_result.transcription = alt.transcript
                recognition_result.confidence = alt.confidence
                recognition_result.stability = result.stability
                #print(" ".join(alt.transcript))
                #printr(" ".join((alt.transcript, "    ", "stability: ", str(int(result.stability * 100)), "%")))

            if result.is_final:
                recognition_result.is_final = True
                should_finish_stream = True
                return
        printr(recognition_result.transcription)
        print()

def request_stream():
    recognition_config = cloud_speech_pb2.RecognitionConfig(
        encoding=args.audio_encoding,
        sample_rate=args.sampling_rate,
        language_code=args.lang_code,
        max_alternatives=1,
    )
    streaming_config = cloud_speech_pb2.StreamingRecognitionConfig(
        config=recognition_config,
        interim_results=True, 
        single_utterance=True
    )

    yield cloud_speech_pb2.StreamingRecognizeRequest(streaming_config=streaming_config)

    while True:
        time.sleep(args.frame_seconds / 4)

        if should_finish_stream:
            return

        if len(frames) > 0:
            yield cloud_speech_pb2.StreamingRecognizeRequest(audio_content=frames.pop(0))

def pyaudio_callback(in_data, frame_count, time_info, status):
    # in_data = b"".join(in_data)
    assert isinstance(in_data, bytes)
    frames.append(in_data)
    return (None, pyaudio.paContinue)

def run_recognition_loop():
    global frames
    global silent_frames
    global is_recording
    global should_finish_stream

    if len(silent_frames) > 4:
        silent_frames = silent_frames[-4:]

    while not is_recording:
        time.sleep(args.frame_seconds // 4)

        if len(frames) > 4:
            for frame_index in range(4):
                data = frames[frame_index]
                rms = audioop.rms(data, 2)
                decibel = 20 * math.log10(rms) if rms > 0 else 0
                if decibel < args.silent_decibel:
                    silent_frames += frames[0:frame_index+1]
                    del frames[0:frame_index + 1]
                    return

            is_recording = True
            frames = silent_frames + frames
            silent_frames = []

    with cloud_speech_pb2.beta_create_Speech_stub(make_channel(args.host, args.ssl_port)) as service:
        try:
            listen_loop(service.StreamingRecognize(request_stream(), args.deadline_seconds))
            #printr(" ".join((bold(recognition_result.transcription), "    ",str(int(recognition_result.confidence * 100)), "%")))
            #printr(" ",str(int(recognition_result.confidence * 100)), "%")
            #print()
        except Exception as e:
            print(str(e))

def main():
    global is_recording
    global should_finish_stream

    pa = pyaudio.PyAudio()
    devices = []
    for device_index in range(pa.get_device_count()):
        metadata = pa.get_device_info_by_index(device_index)
        #print(device_index, metadata["name"])

    stream = pa.open(format=pa.get_format_from_width(2),
                    channels=1,
                    rate=args.sampling_rate,
                    input_device_index=args.device_index,
                    input=True,
                    output=False,
                    frames_per_buffer=int(args.sampling_rate * args.frame_seconds),
                    stream_callback=pyaudio_callback)

    stream.start_stream()

    while True:
        is_recording = False
        should_finish_stream = False
        run_recognition_loop()

    stream.stop_stream()
    stream.close()

    pa.terminate()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--sampling-rate", "-rate", type=int, default=16000)
    parser.add_argument("--device-index", "-device", type=int, default=0)
    parser.add_argument("--lang-code", "-lang", type=str, default="ja-JP")
    parser.add_argument("--audio-encoding", "-encode", type=str, default="LINEAR16")
    parser.add_argument("--frame-seconds", "-fsec", type=float, default=0.1, help="1フレームあたりの時間(秒). デフォルトは100ミリ秒")
    parser.add_argument("--deadline-seconds", "-dsec", type=int, default=60*3+5)
    parser.add_argument("--silent-decibel", "-decibel", type=int, default=40)
    parser.add_argument("--speech-scope", "-scope", type=str, default="https://www.googleapis.com/auth/cloud-platform")
    parser.add_argument("--ssl-port", "-port", type=int, default=443)
    parser.add_argument("--host", "-host", type=str, default="speech.googleapis.com")
    args = parser.parse_args()
    main()

環境
windows10
python3.7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • Python

    11799questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    9879questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Google Cloud Platform

    237questions

    Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。