Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonで声・音を扱ってみた(pyaudio,GCP)

 Pythonで声・音を扱ってみた(pyaudio,GCP)

Pythonで声・音を扱ってみた(pyaudio,GCP)

6c8a918f4e4734c92e53a28f5556e432?s=128

vinorthman

May 18, 2020
Tweet

Transcript

  1. Pythonで声・⾳を扱ってみた (Pyaudio,GCP編) . @vinorthman 2020/05/15 はんなりPythonの会 #27 LT会

  2. ・01.⾃⼰紹介 @vinorthman : ⾼橋 びわ湖のあるところ北の⽅在住 製造IoT屋さん(NN書きも経験) その他、 ・欧州鉄道好き(特に乗ったSBB,Rhb,DB) ・カミさんと美術館巡り(関⻄&上野あたり) ・アナログシンセ周りなどなど

    ・⾷べ歩きも多し。
  3. ・02.これまでのLT会と今回の経緯 これまで2回のLT会発表 1.NVIDIA JetsonNanoの PythonによるGPU利⽤(cupy)と⾞窓画像認識(YOLO)実験 2.Docker初⼼者がVscode+Dockerを利⽤したPython開発環境を作る 今回は、… 昨今の事情が発端 …

  4. ・02.これまでのLT会と今回の経緯 昨今の事情で、 ①友⼈にも会えない ②在宅やサテライト的なところでの仕事 →特に②︕ほぼリモートでの会議打ち合わせが多い+参加⼈数も最⼩限 ↓ このGW前に思った事… ・リモート会議の議事メモ取るの⾯倒︔︔ (リモートツールでチャットや動画⾳声は残るが…やはり発⾔を⽂字に起こしたい) ・リモートツールが相⼿によってバラバラ;;;Zoom,Skype,Teams,CiscoWebEX,FaceTimeなどなど;;

    ・スマホのアプリで代⽤も考えたが、⻑い会話が無理&やはり変換間違いが多い︔ ・MS Office Word,PPに⽂字起こし(ディクテーション)があるが…バックグランドでは 解除されてしまう;; ・GoogleMeet ⽂字起こしあり︕だが英語のみ;;;(5/15現在)
  5. ・03.それで今回は、 GW前に、 ・GoogleCloudPlatform 上の SpeechToText が最近効率良くなっている︕⽇本語がっ︕ ・それは、Pythonから呼び出しサンプルソースも⽤意されている︕ と聞き、 ⭐リモート会議の発⾔をPCのマイクで拾い、テキストに変換し、wordのような⽂書に 追記する、⾃動議事メモの仕組み作れるんじゃないか︖

    クラウドAWSしか使った事がなかったので、GCPも経験してみよう︕ と、⾔う事で、どこにも⾏けないGWにトライしてみました。
  6. ・04.⾃動議事メモの仕組みを考えてみた ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text
  7. ・05.順に解説 ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text ▪PyAudio PyAudioは、Pythonのオーディオ関連ライブラリ ⾳声の録⾳、再⽣、書き出しに対応 Pip install pyaudio 例1) import pyaudio p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paFloat32, channels=1, rate=44100, frames_per_buffer=1024, output=True) stream.write(stream,261.626(周波数),40(⾳の⻑さ),1)… ドレミのドの⾳ 例2) CHUNK = 1024 FORMAT = pyaudio.paInt16 # 16bit CHANNELS = 1 # monaural RATE = 48000 # sampling frequency [Hz] data = stream.read(CHUNK) ‘⾳声読み込み
  8. ・05.順に解説 ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text ▪google.cloud.speech ⾳声情報をCloud Speech-to-Text APIに渡し、Textを受け取る →⾳声ストリーム情報(⾳声,レート,モノラル,…)でAPIコール、 変換されたテキスト受け取り [設定] GCP側 ・Googleアカウントを作成→GCPコンソールにログイン&プロジェクト ・Google Speech-to-Text APIを有効にします。 「認証情報」→「認証情報を作成」→「サービスアカウントキー」→、jsonファイルを作成 PC側 pip install google gcloud google-auth google-cloud-speech grpc-google-cloud-speech-v1 pyaudio ・サービスアカウントキーを登録 Windowsの場合︓ set GOOGLE_APPLICATION_CREDENTIALS=[PATH]
  9. ・05.順に解説 ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text ▪google.cloud.speech ★Google Cloud Speech-to-Text API 認識モデル command_and_search ・・・ ⾳声検索やコマンドコールに適したモデル [以下、⽇本語対応していません] phone-call ・・・ 電話から発せられた⾳声に適したモデル video ・・・ 動画の字幕作成などに適したモデル
  10. ・05.順に解説 ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text ▪google.cloud.speech ⾳声情報をCloud Speech-to-Text APIに渡し、Textを受け取る →⾳声ストリーム情報(⾳声,レート,モノラル,…)でAPIコール、 変換されたテキスト受け取り 例) from google.cloud import speech_v1 as speech client = speech.SpeechClient() config = types.RecognitionConfig( encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, sample_rate_hertz=self.rate, model=None, speech_contexts=[types.SpeechContext( )], language_code=language_code) streaming_config = types.StreamingRecognitionConfig( config=config, single_utterance=True, interim_results=True ) audio_generator = stream.generator() requests = (types.StreamingRecognizeRequest(audio_content=content) for content in audio_generator) responses = client.streaming_recognize(streaming_config, requests) GCP上のサンプルソース参照 してください。
  11. ・05.順に解説 ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text ▪gspread 前処理で⾳声から変換されたテキスト(⽇本語)を Google Spreadに追記する 例) import gspread →spreadのdoc_id(URLから)のsheet1を指定 →テキストを⾏追記していく doc_id = '1tUYPnGdUu8Nbzgu_exvVbUdqoPrDAKNNPJSweiCFOxM' client = gspread.authorize(credentials) googlefile = client.open_by_key(doc_id) worksheet = googlefile.sheet1 worksheet.append_row([text])
  12. ・06.とにかくこれで、⾃宅でテストして動作した︕ ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text ポッドキャストでNHK ニュースを流してみた。 ニュース⾳声から変換されたテキストが追記されていった︕ 例) 東京都は、13⽇都内で新たに10⼈が新型コロナウイルスに感染していることを確認したと発表し ました。また、12⽇の都内の陽性率は暫定値で5.0%でした。 ⭐良かった点 ・かなり正確変換、⽇本語特有の同⾳異義語も息継ぎや⽂終了までに⽂脈から推定して訂正して くれる。 ・専⾨⽤語の変換ミスがあるが、時事ネタもキチンと変換。
  13. ・ ところが、 そううまく いかない

  14. ・07.うまくいかない理由、また考慮する必要がある事 ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text 1.Cloud Speech-to-Text API のレスポンスが悪い。 ①特に⾳声6〜7秒以上の場合。処理が追いつかないと、 読み漏れで変換を⾶ばしてしまう。 →これが致命的。(⽇本語だからか︖) (テストしたリソースは⼗分なハズだが…︓eo光、PC︓i5 MEM16G) 2.課⾦が発⽣する,受ける⾳声データの上限がある。 今は…無料で$300分のサービス利⽤中だが、$0.006/15 秒 ⾳声データ,1回利⽤5分まで、1⽇:1728秒=19分弱 3.Proxy環境でポート制限(ssh)があると、利⽤できない
  15. ・07.うまくいかない理由、また考慮する必要がある事 ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text 3.pyaudio ①端末の環境に依存する部分が⼤きい︕ ・pythonは、3.6までしか対応していない(最近更新されていない) ・OS︓macOS,ubuntu,windows10proと試したが…唯⼀win10proのみ動作 →ネット上では、⾳声のサンプリングレートや1回の採取時間 を調整すれば…など情報があったが、うまく⾏きませんでした。
  16. ・08.今回、トライしてみて ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream 発⾳レスポンスあれば 取込んだ⾳声Buff

    Cloud Speech-to-Text API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text 今回、トライしてみて、 ①⾳声データのAPIへの受け渡しなどで改善の余地ありだが、 やはり⽇本語&複数⼈の会話の⽂字起こしは、まだハードルが⾼い いずれ…ZoomやGoogleMeetで⽇本語⽂字起こし機能がでてくるだろうが… ②とはいえ、GCPのAPI、制限があるもの、簡単に利⽤できたかな。 (もう⾳声の話で無くなっていますが…) APIサービスの組み合わせで、様々な仕組みが作れそうだと実感 ③もうひとつ、副産物として…
  17. ・09.もうひとつ、副産物として… ローカルPC Python3.6 PCのマイク google.cloud .speech PyAudio audio_stream Cloud Speech-to-Text

    API GoogleCloudPlatform ⾳声Buff Text Google Sheets API 事前にSpredSheet⽤意(共有(Doc_idで) Textを Cellに追加 gspread Text Text もうひとつ、副産物として…趣味のアナログシンセの⾳の⾒える化︔︔ せっかく⾳声データの取り込めるようになったので、 ⾳声の⾒える化、やってみた。 ①オシロスコープ X軸︓時間、Y軸︓⾳の⼤きさ、周波数の波 ↓フーリエ変換掛けると… ②スペクトルアナライザー x:周波数 , y:周波数毎の⾳の⼤きさ PyQt5 pyqtgraph
  18. ご清聴ありがとうございました。 (質疑応答)