0
1

More than 1 year has passed since last update.

PyAudio+SpeechRecognitionからマイク入力を受け取りSofTalkで出力

Last updated at Posted at 2022-08-14

挨拶

初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
本稿は議事録の作成補助システムを作成した際に試作したシステムについての内容です。

環境

この記事では以下の環境を用いています。
・Python3.8.1
・SpeechRecognition 3.8.1
・PyAudio 0.2.11
・SofTalk Ver 1.93.45

概要

Pythonを用いてマイクから入力された音声データを他のソフトウェアに渡すことを考えます。
今回はPythonの音声認識ライブラリーの一つ、SpeechRecognitionを用いてマイク入力をテキストに変換します。変換後テキストは音声合成ソフトSofTalkに読み込ませ合成音声に変換します。

実装

 大まかに音声の認識、テキスト変換→変換テキストをSoftalkに渡し実行という流れで処理を行います。

MicrophoneToSoftalk.py
import speech_recognition as sr
import subprocess
import tempfile
import os
import subprocess


os.chdir(os.path.dirname(os.path.abspath(__file__)))
# start以下にSofTalk.exeのPathを指定する
_start = "start SofTalk.exe"
_word = "/W:初期テキスト"

# 音声入力
while True:
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("音声受付中")
        audio = r.listen(source)
        print("音声を認識します")

    try:
        # Google Web Speech APIで音声認識
        text = r.recognize_google(audio, language="ja-JP")
    except sr.UnknownValueError:
        print("音声を認識できませんでした。")
    except sr.RequestError as e:
        print("音声認識リクエストを要求できませんでした;"
              " {0}".format(e))
    else:
        #認識成功(SofTalkへ渡す)
        _word = "/W:"+text
        _command = [_start, _word]
        subprocess.run(' '.join(_command), shell=True)
        print(' '.join(_command))
    if text == "切り替え":
        break
print("完了。")

音声認識

SpeechRecognitionはGoogle Cloud Speech APIを利用できるPythonのライブラリの一種です。メインループ内のelse節までで音声認識を行っています。
音声認識自体はRecognizer.listen()メソッドを用いて行い認識に失敗した場合はexcept句でそのエラーをキャッチ、エラーが起きなかった場合(認識に成功した場合)はtextに認識結果を保持しておきSofTalkに渡します。
なお、日本語を認識できるのはrecognize_googleメソッド(Google Cloud Speech)のみのようです。

SofTalkの起動

SofTalkはコマンドライン起動をします。コマンドラインの起動はPython標準のsubprocessを用いて行います。Sokftalkはコマンドラインにて
start (Softalk.exeのパス) /W:(出力したいテキスト)
を入力することで音声出力できるためあらかじめ用意しておいた起動コマンド(_start)に音声認識部分から渡されたテキストを読み込ませることで出力をします。

プログラムの終了処理

メインループはwhile True:で回しているためどこかで中断しない限りは音声認識をし続けます。今回は認識したテキストが「切り替え」の時(「切り替え」と発声したとき)ループを抜けるようにします。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1