【シンジ】戦略×エンジニア×Webデザイナー

Webコンサル、デザイン、サービス開発、経営に関することを呟きます。

たったの2時間でPythonとWit.aiで日本語の発音チェッカーを作ってみた

f:id:Shinji0418s:20210308090923j:plainどうも。株式会社WIREBASEの中村です。

 

留学をしてきた身として、日本語を学びたい外国人はたくさんいるなという印象ですが、アジア圏内でも日本語の発音ってとにかく難しくて、途中で学ぶのを諦めてしまう外国人もたくさんみてきました。

 

そこで、PythonとWit.ai.を使って外国人向けの日本語発音チェッカーを作ってみようと思います。もくじは以下の通りです。

 

・wit.aiで新しいプロジェクトを立ち上げる

・音声録音プログラムを作成

・音声の認識評価プログラムを作成

・プロトタイプをテストする

・streamlitでプログラムをカスタマイズ

・完成!!

 

それでは、早速始めてみましょう。

ソースコードを書く前に、、、人の音声を認識評価する方法はいくつかあります。

 

例えば、Praatのような複合音声ソフトを使えば、ネイティブの発音とどれくらいの乖離があるのかを評価することができます。ただ、データを集めて発音を分析するのはかなりの時間がかかる為、あまり再現性のある方法ではありません。

 

そこでWit.aiを使います。Wit.aiは140以上の言語をサポートしているので、先ずデータを集める必要はないえす。オープンソースなので、人間の音声やテキストを構造化されたデータに変換してくれるので、このような会話型のアプリケーションを構築する際はめっちゃ使えます。

 

では、Wit.aiとPythonを使って以下の様なアプリケーションを作ってみようと思います。

・発音したい日本語のリストを作成

・選んだ単語の音声を録音する。(音声はテキストに変換される)

Pythonのコードで、インプットされた単語と予想される単語を比較

 

 

先ず初めに、Wit.aiで新しいプロジェクトを立ち上げます。

FacebookアカウントでWit.aiに登録

・新しいWitプロジェクトを立ち上げる

・「言語」のドロップダウンメニューから日本語を選択

・プロジェクト生成後、アプリの設定タブでアクセストークンを生成して、それをメモしておく

 

 

Pythonで音声を録音するプログラムを作成

先ずは、PyAudioという音声録音ライブラリーをインストールします。

pip3 install pyaudio

 

ファイルを作ります。ここでは、recorder.pyというファイル名で作ります。

f:id:Shinji0418s:20210308084021p:plain

 

 

日本語の発音を認識して評価するプログラムを作成

ここで、日本の文字形態(ひらがな、カタカナ、漢字)をローマ字に変換するPykakasiというライブラリが必要になります。

pip3 install pykakasi

import requests
import json
import pykakasi
from recorder import record_audio, read_audio

 

Wit.aiのコンフィギュレーションを追加します。

# Wit speech API endpoint
API_ENDPOINT = 'https://api.wit.ai/'
API_FUNCTION_SPEECH = 'speech'

# Wit API token
wit_access_token = 'VPEZHKEUXSSOGT4EVCO6JXCGTJLP'

 

音声を認識するためのコードを書きます。

f:id:Shinji0418s:20210308084319p:plain

 

次に、日本語の文字をローマ字に変換して、ユーザーがインプットした音声と、予想される単語を比較することができるようになります。

 

これができたら、評価機能をつくっていきましょう。

f:id:Shinji0418s:20210308084513p:plain

 

mainメソッドでプログラムを開始してみます。

f:id:Shinji0418s:20210308084550p:plain

 

 後々のテスト用に「猫」という単語を仮に置いておきます。

テスト後にランダムな単語を使えるようにしておきます。

 

また、録音の上限時間を4秒に設定しました。これも今後ユーザーが自由に時間を設定できるようにしていきます。

 

 

プロトタイプでテストしてみる

プログラムを開始します

python3 japan.py

 

「ねこ」と発音してみると、

Listening...
Finished recording.
{'entities': {}, 'intents': , 'text': '猫', 'traits': {}}

You said: 猫
**************************************
猫[Neko]
You said: neko which is: Correct

 

・Wi.aiが単語を認識して漢字で出力してくれました

・音声入力はローマ字に変換してくれました

Pythonで予想した単語とインプットした単語が一致しました

 

Listening...
Finished recording.
{'entities': {}, 'intents': , 'text': 'テスト', 'traits': {}}

You said: テスト
**************************************
テスト[Tesuto]
You said: tesuto which is: Incorrect

 

これでプロトタイプの完成です!

 

 

Streamlitでプログラムをカスタマイズする

「ねこ」以外の単語も扱えるようにします。

まずは、StreamlitとBokehをインストールします。

pip3 install bokeh
pip3 install streamlit

 

import streamlit as st
import random
from bokeh.models.widgets import Button
from bokeh.models import CustomJS
import SessionState

 

evaluate_speech関数を修正し、角括弧の前に対象となる単語をするようにします。

f:id:Shinji0418s:20210308085825p:plain

 

ランダムな単語を選択できるようにします。

f:id:Shinji0418s:20210308085857p:plain

 

そして、mainメソッドでUIを作っていきます。

f:id:Shinji0418s:20210308085949p:plain

 

これでユーザーは1秒~10秒までの録音時間の間で様々な単語を録音できるようになりました。

 

 

完成!!

Streamlitコマンドを実行します。

streamlit run japan.py

 

そうすると、以下の様な結果になりました。

https://miro.medium.com/max/700/1*1c0nwl34ifkRbNXkVlp9tA.gif

 

これで完成です!

 

大体2時間くらいで出来ちゃいました。

 

それでは、今日はこの辺で。

 

 

 株)WIREBASE中村LINE↓

友だち追加

株)WIREBASE中村Twitter