Pythonでリアルタイムに発言者の推定をやってみた。[scikit-learn,教師あり学習,分類]

概要

  • pythonといえば機械学習。それっぽいことをやってみた。
  • 教師あり学習の分類をやった
  • 具体的には二人の人物が対談している時にどちらが声を発しているかのリアルタイム判定を行なった
  • 遊びにしてはそこそこの精度がでた。
  • 正直、機械学習はあまりくわしくないのでにわか知識の勢いだけでやりました。遊びなので動いていればOKの精神です。


はじめに

今回やりたかったことは二人の人物が対談しているときにどちらの人物がしべっているかをプログラムに判定させることです。


以下の方針で実現します


  1. 一定区間の音声データからなんらかの特徴量を取得
  2. 分類器に通す
  3. 判定結果を得る


まずは、音声データの特徴量をどうするかです。


調べたらメル周波数ケプストラム係数というのが良いらしいのでこれを使うことにしました。



次に分類器。


SVM(サポートベクターマシン)というモデルが良いらしいのでこれを使います。



色々と、難しい単語が出てきましたが、そんなに理解しなくてもライブラリをインストールすれば小難しいことはやってくれるので大丈夫です。



環境

  • OS: mac OS Big Sur バージョン 11.6.1
  • conda 4.11.0
  • Python 3.6.13


準備

諸々インストール

以下をconda install で導入する


scikit-learn

機械学習用ライブラリ。モデルを作成、使用するのに使う


conda install scikit-learn


librosa

オーディオ分析用ライブラリ。メル周波数ケプストラム係数を求めるのに使う


opencv

描画用ライブラリ。しゃべってる人を判定してその人に対応するアバターの口が動くと面白いかなと思い描画用に使う。



実践

EJPゲームズのYoutube動画用の素材データ(十数分くらい、未編集(BGM等なし))を使って試します。


ドライブに置いてあったのが映像データだったのでffmpegで音声成分を分離。soxで無音区間で分割しました。これで300と少しくらいの音声データに分割されました。これを一つずつ実際に聞いて人物毎または使えないデータに振り分けます。bashスクリプト組んでセミオートでやりましたがめんどくさかったです。振り分けた二人の音声データをそれぞれsoxで結合して学習用の音声データとします(data1.wav, data2.wav)。二人の声が重なっている部分も多くなんだかんだでそれぞれ2~3分くらいの長さです。もっとデータが多い方がいいような気もしますが、二人を判定するだけなので大丈夫だとうという希望的推測で進みます。



以下分類器作成用のコードになります。


from sklearn import svm
from sklearn.metrics import accuracy_score
import pickle
import librosa
import numpy as np

## データロード
def data_load(data_path):
	print("データ読み込み")
	data,samplerate=[],[]
	for i in range(len(data_path)):
		d, sr = librosa.load(data_path[i], sr = 44100)
		data.append(d)
		samplerate.append(sr)
		print(sr)		

	print("完了")
	return data, samplerate

## mfcc計算
def get_mfccs(data_array, sr):
	mfccs = []
	print("mfcc 変換")
	for i in range(len(data_array)):
		mfcc = librosa.feature.mfcc(y=data_array[i], sr=sr[i])
		mfccs.append(mfcc)
	print("完了")
	return mfccs

## mfccデータを整える	
def format_train_data(mfccs_data):
	data = []
	train_data, train_label = [], []
	print("学習用データ 整形")
	for i in range(len(mfccs_data)):
		for j in range(len(mfccs_data[i][0])):	
			data.append([mfccs_data[i][1:,j],i])
	np.random.shuffle(data)
	for i in range(len(data)):
		train_data.append(data[i][0])
		train_label.append(data[i][1])
	print("完了")
	return train_data, train_label

## 一部データをテスト用に退避させる
def get_test_data(data, label, num):
	print("テスト用データ 取得")
	test_data = data[:num]
	test_label = label[:num]
	train_data = data[num:]
	train_label = label[num:]
	print("完了")
	return test_data, test_label, train_data, train_label

## 分類器を作成
def creat_svm_clf(clf_name,train_label,train_data):
	print("SVM 分類器 作成")
	clf = svm.SVC(C=1,gamma=0.0001)
	clf.fit(train_data, train_label)
	print("完了")
	
	## ファイルとして保存
	with open(clf_name, mode='wb') as f:
		pickle.dump(clf,f,protocol=2)
	
	print("分類器を保存しました:",clf_name)
	return clf

if __name__ == '__main__':
	DATA_PATH1 = 'data1.wav'
	DATA_PATH2 = 'data2.wav'
	CLF_FILE_NAME = 'svm_clf.pickle'
	TEST_NUM = 100
	data, sr = data_load([DATA_PATH1, DATA_PATH2])
	mfccs = get_mfccs(data, sr)
	train_data, train_label = format_train_data(mfccs)	
	test_data, test_label, train_data, train_label = get_test_data(
		train_data, train_label, TEST_NUM)
	
	clf = creat_svm_clf(CLF_FILE_NAME,train_label,train_data)

	## テスト
	predict_label = clf.predict(test_data)
	print("テストデータ数:%d"%len(test_label))
	print("正解率 = %f"%accuracy_score(test_label, predict_label))



実行結果


データ読み込み
完了
mfcc 変換
完了
学習用データ 整形
完了
テスト用データ 取得
完了
SVM 分類器 作成
完了
分類器を保存しました: svm_clf.pickle
テストデータ数:100
正解率 = 0.980000


ランダムに100個を学習用データから退避させてテスト用のデータに使っていますので、実行ごとに正解率は変わりますが大体95%以上は出ています。(ロジックを間違えていない前提ですが)



これでsvm_clf.pickleというモデルを保存したファイルができますのでこれを使って発言者のリアルタイム判定を行います。



作成したコードが以下です。


import pickle
import librosa
import pyaudio
import numpy as np
import cv2

BUFSIZE = 8192
SMPL_RATE = 44100 ## サンプリングレート

## pcの標準音声入力から音声取得
audio = pyaudio.PyAudio()
stream = audio.open( rate=SMPL_RATE,
				channels=1,
				format=pyaudio.paFloat32,
				input=True,
				frames_per_buffer=BUFSIZE)

## 描画画像準備
img1 = cv2.resize(cv2.imread('img001.png'), (800,450))
img2 = cv2.resize(cv2.imread('img002.png'), (800,450))
img3 = cv2.resize(cv2.imread('img003.png'), (800,450))
status = 0

## 分類器を取り込む
with open('svm_clf.pickle', mode='rb') as f:
    clf = pickle.load(f)

while True:
	try:
		## 推測結果に応じて描画を変更
		if status == 0:
			show_image = img1
		elif status == 1:
			show_image = img2
		else:
			show_image = img3
		cv2.imshow('sample',show_image)
		cv2.waitKey(1)
		
		## 音声取得
		audio_data=stream.read(BUFSIZE)
		data=np.frombuffer(audio_data,dtype='float32')
		if max(data) < 0.05: ## 無音判定
			status = 0
			continue

		## mfccを算出
		mfcc = librosa.feature.mfcc(y=data, sr=SMPL_RATE)
		mfcc_mean = np.array([])
		for i in range(1,len(mfcc)):
			mfcc_mean = np.append(mfcc_mean,np.mean(mfcc[i]))

		## 分類器に入れる
		predicted_value= clf.predict([mfcc_mean])
		## 推測結果
		print(predicted_value[0])

		## アバターのくちに反映
		if predicted_value[0] == 0:
			status = 1 if np.random.randint(0,3) != 1 else 0
		else:
			status = 2 if np.random.randint(0,3) != 1 else 0

	except KeyboardInterrupt: ## ctrl + c
		break

## 後始末
cv2.destroyAllWindows()
stream.stop_stream()
stream.close()
audio.terminate()



上記コードではPCの標準音声入力からの一定サイズごとの音声データをmfccに変換して分類器clfに入れて推測結果を得ます。そして推測結果から二人に対応する2種類のアバターのクチを開けたり閉じたりさせます(img001.png:二人とも口を閉じている、img002.pngとimg003.pngはそれぞれ口を開いている)。


今回はYoutubeから最新のEJPラジオ(編集済み(BGMあり))をPCで実際に物理的な音として流しながらそれをPCのマイクで拾っています。BGMがのっていたり、外部雑音が気になりますがまあたぶんに大丈夫だと真して実行です。(ctrl+cで終了)



実行結果



まあ、データが少なくかつテキトーな実装の割にはそこそこの精度はあるように思えます。遊びに使うなら十分です。



所感

  • なんとなく機械学習的なことを試せて楽しかった。
  • 素人のにわか知識でも便利なライブラリのおかげでなんとなく動けるものが作れるのは良いです。
  • 今回やったものに対して判定できる発言者の人数を増やしたり、笑い声の判定を入れたり他にも色々と追加で出来そう。


2

Game Up Your Life.

Skimieアプリをダウンロードして、タスク管理をゲーム化しよう

Skimieは、仕事や勉強にゲーミフィケーションを取り入れ、モチベーションアップをサポートする情報管理サービスです。

新着記事

誰もいない…?

一番上の投稿が3ヶ月前…

『ワードカスケード』って知ってますか?

ブックマークの整理をしていた際に、以下のサイトが目に留まりました。だいぶ前になるのですが、気になってブックマークしたのを思い出しました。https://river.tango-gacha.com/Cascade(カスケード)とは小滝・階段状に連続する滝のことを意味するようです。アイディア出しや頭の中を整理する時に、しばらく眺めるのは効果ありそうですね。クリックすると背景色が変わったり、しばらくすると左下にXへ遷移できるアイコンが出てきたりとする楽しい動きも良いですね!

Stable Diffusion オススメアプリと使い方

初心者から上級者まで、無料でもアニメ系のイラストを描きやすい、個人的にオススメなStable Diffusionベースアプリです。 【DaysAI】 レベルアップ報酬が手に入るようになったことで、無料〜ゴールド課金で充分使えるアプリです。 (プレミアム課金は費用対効果的によほど使い倒さない限り他のアプリの年額と同時に使った方が良いです) 「うちの子」と付くアプリだけあり、作成したキャラをベースに描いてくれるので、髪型、表情、服装の一部を修正もできます。 日本語、ポジティブプロンプトやしきい値対応。有料会員になればネガティブプロンプトにも対応します。 「(全身)、上から、ビューアを見る」とかでいけます。

Skimie のバトルのお気に入りパーティ

みなさんのお気に入りのキャラクターはなんですか? 自分は ・タダシ ・ヴァール ・羽柴シバ です。 ![](https://skimie.com/uploads/u/IEozBO1uEfWNYUwdTgAeADBUU4F3/img/090938062c2ca448d931523f898d4b4a229dc0f3833b087fe.png)

Days AI 7/27 挑戦分

使用アプリ:Days AI テーマ:「夏の温泉」 テーマに組み込まれているはずの浴衣が吹っ飛びました。多分、表情や髪型描き込み過ぎました…。 このアプリの仕様上、キャラの雛形はあるしので、髪の纏め方も「花の髪飾り」と「まとめ上げたポニーテール」くらいで良かったんだろうと反省…。 夏の温泉で足湯&冷酒呑んで酔っ払ってる、オッサン寄りな亜人種イケオジを描きたかっただけなんです…。

使い方がわからない!助けて!

使う練習であげてみました。 このアプリまだ使い方が わからないので ヒントをもらえると嬉しいです。

本日も毎日1筆です♪

![](https://skimie.com/uploads/u/8N0K1D3KdpeWs9IUaBbNTtqmjmv2/img/072628348c2ca448d931523f898d4b4a229dc0f3833b087fe.png) ゲーム、OMORIのファンアートです。

生成AI検索『Perplexity』とは?

『Perplexity』というサービスを耳にして、とても気になったので調べてみました。検索に利用できるサービスで、Google検索よりも便利とか、、、実際に利用してみた感じ、とても便利そうです!『Perplexity』とは?AI チャットボットを活用した調査および会話型検索エンジンのこと。「Perplexity AI」は、元Google AI研究者らによって提供されるAIアシスタントです。参考ページhttps://www.sbbit.jp/article/cont1/134482https://meet.acesinc.co.jp/blog/perplexityai/運営元:Perplexity AI, Inc.設立:2022年8月所在地: アメリカ合衆国に拠点事業内容:会話型人工知能(AI)を専門とするソフトウェア会社会話型AIを用いた回答エンジンを提供。Perplexity AIの特徴情報源がわかる自動で情報源が表示される。検索範囲を絞ることができる「YouTubeから」「学術論文から」など、検索範囲をプラットフォームやカテゴリに絞ってリサーチができる。目的により最適な情報源を選ぶことが可能です。自動で要約してくれる返答の文章を箇条書き形式で端的にまとめて生成がされる。最新データを基にした回答が可能インターネット上の情報から回答を生成するブラウジング機能が搭載されている。日本語にも対応しているスマホアプリで利用ができる『Perplexity』のURLhttps://www.perplexity.ai/

色覚検定3級クイズについて

何問かは伏せますが、「敵を警戒させる色」で、誤入力かと思いますが、同じ回答が2つあります。 正解は上の方です。これは問題側にミスがあるのでネタバレしていいかと思い描きました。 普段私は、短編小説(SS)、小説、AI生成イラストで自分のキャラクターの可視化などしています。

お気に入りの謎解きイベント

西武線沿線の駅周辺を散策しながら謎を解き明かしていく周遊型の謎解き宝探しイベントがやっていて、ここ3年くらい参加しています。Webページを確認すると、2019年より毎年開催しているとのことです。こちらイベントですが参加は無料!※ただし、西武線沿線でたくさん駅を乗り降りするため、西武線全線を自由に乗り降りできる切符を購入する必要があります。【2024年】WEST CODE 第六弾 見知らぬ絵日記と約束の列車期間:2024.4.26~9.16https://www.seiburailway.jp/newsroom/news/20240417_WESTCODE/西武線の色々な駅を知れる良い機会で、子供を含めて家族で参加しています。駅で冊子が配られているので、シーズンの休日は多くの参加者を目にするイベントです。謎のレベルは高めで、去年はゴールできなかったので、今年こそはクリアしたいです!

LINE新機能「スタンプアレンジ機能」とは?

5/8より、複数のLINEスタンプを組み合わせて送信できる機能がスタートしました!簡単に利用が出来て楽しいです。参考ページhttps://news.yahoo.co.jp/articles/695c6ea72b6a7a6746a0af4fd8376c8f34dfdd43やり方はとても簡単で、スタンプを長押しすると複数を選択できるモードになります。組み合わせたいスタンプを選択し、後は自由にレイアウトして送るだけです。以下、注意点です。スタンプアレンジできる物とできない物があるパソコンは、送信も表示もできない

私なりの Skimie の使い方。ゲーミフィケーションで楽しく日々のタスク管理や備忘録。

Skimie というこのサービス。まだ、色々な機能が成熟してないようだがゲーミフィケーションとタスク管理の組み合わせは面白いなと思って使ってみています。主な使い方は・タスク管理機能日々のタスクを管理するのはもちろん。買い物リストなどとしても活用しています。iPhone でいうリマンイダーみたいな使い方。・ナレッジ機能思いついたことなど備忘録をつらつらとメモするのに活用しています。基本的には非公開にして、自分用のメモです。今回はみなさんが活用するヒントになればと思い、ナレッジを一般公開してみます。タスクをこなしたり、ナレッジを書き溜めるとコインがもらえるので、それを使ってとりあえずキャラクターを育てるために日々コツコツと続けてます。Skimie を使うヒントになれば幸いです。

複数の写真を1つにする方法が知りたい

Xで投稿する際に、やりたいと思ったので調べてみました。意外と簡単な方法が見つからなかったので、もう少し調べたり、周りに聞こうと思います。とりあえずは、Androidユーザーの私が一番簡単にできそうな方法をご紹介します。参考サイトhttps://support.google.com/photos/answer/12637115?hl=ja&co=GENIE.Platform%3DAndroidツール「Googleフォト」アプリ機能「コラージュ」という機能を利用します。手順は参考サイトに記載ありますが、とても簡単です。テンプレートは無料なのは4つほどです。私のスマホにあるラーメン画像だとこんな感じ。

イオンクレジットカードの付帯保険「ショッピングセーフティ保険」が気になる

最近、イオンクレジットカードの広告を見て、気になる内容があったのでピックアップします。それは、イオンクレジットカードの付帯保険で「ショッピングセーフティ保険」のサービスです。とてもお得なサービスなので、他のクレジットカードなどにも同様のサービスがないか調べたいです。また、スマホやパソコンなどWeb購入する機会もあるので、ぜひ利用したいと思います。▶公式サイトhttps://www.aeon.co.jp/service/safety/イオンクレジットカードの「ショッピングセーフティ保険」はどんなサービスこちらの記事の最後に公式サイトのスクショも添付します。約半年間になりますが、偶然による事故の補償するサービスです。【対象】イオン銀行が発行したクレジットカードでクレジット決済する5,000円以上の商品【対象範囲】偶然による事故破損事故火災事故盗難事故【保証期間】購入日から180日以内

複数のPDFファイルを結合したい

最近、複数のPDFの資料を確認する作業があり、PDFを結合するサービスを探していました。検索すると、Webサービスを利用してオンラインでやる方法とツールをインストールする方法の2つがあるようです。今回は、ツールをインストールしてみました。見つけたツールCubePDF Pagehttps://www.cube-soft.jp/cubepdfpage/評判以下のサイトを参考にしました。ざっと読んでみると評価は良さそうな感じでした。https://www.itreview.jp/products/cubepdf-page/reviews感想利用方法がとてもシンプルで、特にマニュアルことなく利用ができました。注意点こちらのソフトをインストールすると、一緒に「CubeWidet」というソフトもインストールされるようです。こちらは、最小化してニュースが表示するようになり気になったのでアンインストールしました。補足こちら、pdfファイルの他にpngファイルでも同様の事ができないか試してみたところ対応できました!

ウェブサイトのパスワードをスマートに管理したい

色々なWebサービスを利用していると、パスワードの管理は困りませんか?最近、Googleで「Google パスワード マネージャー」というサービスがあることを知りました。パスワードを考えたり、メモしたり、管理したり、思い出したりするストレスから解放されるので、とても便利なサービスなので、ぜひ活用しましょう。公式サイトhttps://support.google.com/chrome/answer/95606?hl=JA&ref_topic=7438325サービス概要Chromeを利用して様々なサイトのパスワードを保存することができますパスワードの保存方法Chromeにて、ウェブサイトで新しいパスワードを入力すると、Chromeでパスワードを保存するかダイアログが表示されますので、こちらで [保存] をクリックするだけです。保存したパスワードの利用方法パスワード保存したウェブサイトのログインフォームを表示すると、自動的に入力されます。便利な点パスワードを覚える必要がないGoogleアカウントに連携しているため、スマホ・パソコンのどちらでもパスワード管理ができる操作がとても簡単

詳細を見る
開発ツール
コンピュータ ハードウェア
スクリプト言語
ソフトウェア
プログラミング
機械学習、人工知能
コンピュータ サイエンス
オープンソース