import warnings warnings.simplefilter('ignore') import nussl import numpy as np # from common import viz mix = nussl.AudioSignal('pop.mp3') # stft = signal1.stft() repet = nussl.separation.primitive.Repet(mix) repet.run() repet_bg, repet_fg = repet.make_audio_signals() # Will run the algorithm and return AudioSignals in one step repet = nussl.separation.primitive.Repet(mix) repet_bg, repet_fg = repet() repet_bg.istft() repet_bg.embed_audio() repet_fg.istft() repet_fg.embed_audio() repet_bg.write_audio_to_file('bg2.wav') repet_fg.write_audio_to_file('fg2.wav')
Category: Python
パスポートの文字をtesseractで読み込む
try: from PIL import Image except ImportError: import Image import pytesseract FILENAME = 'test.jpg' text = pytesseract.image_to_string(Image.open(FILENAME)) lines = text.split("\n") for line in lines: if '<<<' in line: t = line.replace(' ', '') print(t)
test1.png P<GBRUK<SPECIMEN<<ANGELA<ZOE<<<<<<<<<<<<<<<< 5334755143GBR8812049F2509286<<<<<<<<<<c<<<04 test2.png PDCYPPOLITIS<<ZINONAS<<<<<<<<<<<<<<KKKKKKKKK FOOOOOD005CYP8012148M3006151<<<<<<<<<<<<<<02 test3.png PTNOROESTENBYEN<<AASAMUND<SPECIMEN<<<<<<<<<< FHCO023539NOR5604230M2506126<<<<<<<<<<<<<<00
なぜか変な文字列が混ざりますね
def convert(Filename): img = Image.open(Filename) img=img.convert('RGB') size=img.size img2=Image.new('RGB',size) border=110 for x in range(size[0]): for y in range(size[1]): r,g,b=img.getpixel((x,y)) if r > border or g > border or b > border: r = 255 g = 255 b = 255 img2.putpixel((x,y),(r,g,b)) return img2 text = pytesseract.image_to_string(convert('test.jpg')) lines = text.split("\n") for line in lines: if '<<<' in line: print(line)
うーむ、ちょっと違うかな
[音声認識] librosaで音声の波形を描写したい
まず、mp3の音声ファイルを用意します。
ubuntuにlibrosaをinstall
$ pip3 install librosa
$ sudo apt-get install libsndfile1
$ sudo apt install ffmpeg
import librosa import numpy as np import matplotlib.pyplot as plt file_name = "./test.mp3" y, sr = librosa.load(str(file_name)) time = np.arange(0, len(y)) / sr plt.plot(time, y) plt.xlabel("Time(s)") plt.ylabel("Sound Amplitude") plt.savefig('image.jpg',dpi=100)
うおおおおおおおお、なるほど
PythonでUnitTest
import unittest def add(a, b): return a + b class TestAdd(unittest.TestCase): def test_add(self): value1 = 3 value2 = 5 expected = 8 actual = add(value1, value2) self.assertEqual(expected, actual) if __name__ == "__main__": unittest.main()
unittest.main()を実行すると、対象スクリプトのなかでスクリプト内でunittest.TestCaseを継承した全てのクラスを認識し、そのメソッドのうちtestで始まる名称を持つものが全てテストケースとして実行
なるほどー
[Python3] 保存している文章の最後の文章のみS3にupload
f.readlines()は1行ずつ
f.read()は全て
# -*- coding: utf-8 -*- #! /usr/bin/python3 import boto3 import json accesskey = "" secretkey = "" region = "ap-northeast-1" f = open('2021-11-04.txt', 'r', encoding='UTF-8') # data = f.read() datalist = f.readlines() for data in datalist: result = data str = { "text":result, } with open("speech.json", "w") as f: json.dump(str, f, ensure_ascii=False) s3 = boto3.client('s3', aws_access_key_id=accesskey, aws_secret_access_key= secretkey, region_name=region) filename = "speech.json" bucket_name = "speech-dnn" s3.upload_file(filename,bucket_name,filename, ExtraArgs={'ACL':'public-read'}) print("upload {0}".format(filename))
{“text”: “今日イチの雄叫びとガッツポーズが此処まで聞こえてきます\n”}
良いね、あとはラズパイのcron設定
Pythonでlistから最も近い数字を抽出し、辞書の値をprint
numpyを使う
# -*- coding: utf-8 -*- import numpy as np def getNearestValue(list, num): idx = np.abs(np.asarray(list) - num).argmin() return list[idx] # 辞書 d = {} d[0.743722677230835] = 'value1' d[0.9442239999771118] = 'value2' d[0.8997899889945984] = 'value3' print(d) # リスト list = [] list.append(0.743722677230835) list.append(0.9442239999771118) list.append(0.8997899889945984) # 最も近い数字 nearest = getNearestValue(list, 0.9602155685424805) # 最も近い数字のvalue print(nearest) print(d[nearest])
$ python3 test.py
{0.743722677230835: ‘value1’, 0.9442239999771118: ‘value2’, 0.8997899889945984: ‘value3’}
0.9442239999771118
value2
やりたいことはできた。
これをNLPでやる。
[自然言語処理] word2vecによる類似単語を検索
$ pip3 install gensim==3.8.1
### word2vecのファイルをDL
$ wget http://public.shiroyagi.s3.amazonaws.com/latest-ja-word2vec-gensim-model.zip
$ unzip latest-ja-word2vec-gensim-model.zip
app.py
# -*- coding: utf-8 -*- from gensim.models import word2vec model = word2vec.Word2Vec.load('word2vec.gensim.model') results = model.wv.most_similar(positive=['日本']) for result in results: print(result)
$ python3 app.py
(‘韓国’, 0.7088127732276917)
(‘台湾’, 0.6461570262908936)
(‘日本国内’, 0.6403890252113342)
(‘欧米’, 0.6350583434104919)
(‘日本国外’, 0.6200590133666992)
(‘台湾出身’, 0.6174061894416809)
(‘中華圏’, 0.612815260887146)
(‘日本の経済’, 0.6088820099830627)
(‘日本の歴史’, 0.6070738434791565)
(‘韓国国内’, 0.6054152250289917)
gensimはバージョンを指定しないとエラーになるので注意が必要
OK
これを繋げていく
さくらレンタルサーバーにPython3とPip3を入れる手順
さくらレンタルサーバーにPython3をPip3を入れて動かそうとすると、
ModuleNotFoundError: No module named ‘_ctypes’ となるので、
あらかじめlibffiをインストールする必要がある。
### libffiインストール
mkdir -p ~/work/libffi
cd work/libffi
wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
tar xvfz libffi-3.2.1.tar.gz
cd libffi-3.2.1
./configure –prefix=$HOME/local/libffi/3_2_1
make
% mkdir -p ~/local/include
% ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffi.h $HOME/local/include/
% ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffitarget.h $HOME/local/include/
% mkdir -p ~/local/lib
% ln -s $HOME/local/libffi/3_2_1/lib/libffi.a $HOME/local/lib/
% ln -s $HOME/local/libffi/3_2_1/lib/libffi.la $HOME/local/lib/
% ln -s $HOME/local/libffi/3_2_1/lib/libffi.so $HOME/local/lib/
% ln -s $HOME/local/libffi/3_2_1/lib/libffi.so.6 $HOME/local/lib/
% mkdir -p ~/local/lib/pkgconfig/
% ln -s $HOME/local/libffi/3_2_1/lib/pkgconfig/libffi.pc $HOME/local/lib/pkgconfig/
% cd ~/
% vi .cshrc
// パスを最終行に追加
setenv LD_LIBRARY_PATH $HOME/local/lib setenv PKG_CONFIG_PATH $HOME/local/lib/pkgconfig
% source ~/.cshrc
% rehash
### Python3インストール
% mkdir -p ~/work/python3
% cd ~/work/python3
% wget –no-check-certificate https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
% tar zxf Python-3.9.0.tgz
% cd ./Python-3.9.0
% ./configure –prefix=$HOME/local/python/ –with-system-ffi LDFLAGS=”-L $HOME/local/lib/” CPPFLAGS=”-I $HOME/local/include/”
% make
% make install
% cd ~/
%vi .cshrc
// 最終行に以下を追加
set path = ($path $HOME/local/python/bin)
% source ~/.cshrc
% rehash
% python3 –version
Python 3.9.0
% pip3 –version
pip 20.2.3
$ pip3 install ${package}
libffiが無くて、何度もNo module named ‘_ctypes’となり、焦りました。
[Python] 画像を圧縮
まず画像を用意します。
#! /usr/bin/python3 # -*- coding: utf-8 -*- from PIL import Image from io import BytesIO import os COMPRESS_QUALITY = 30 path = "./src" images = os.listdir(path) for image in images: if image.endswith('.jpg'): with open("./src/" + image, 'rb') as inputfile: im = Image.open(inputfile) im_io = BytesIO() im.save(im_io,'JPEG', quality=COMPRESS_QUALITY) with open("./src/comp_" + image, mode='wb') as outputfile: outputfile.write(im_io.getvalue()) if image.endswith('.jpeg'): with open("./src/" + image, 'rb') as inputfile: im = Image.open(inputfile) im_io = BytesIO() im.save(im_io,'JPEG', quality=COMPRESS_QUALITY) with open("./src/comp_" + image, mode='wb') as outputfile: outputfile.write(im_io.getvalue()) if image.endswith('.png'): with open("./src/" + image, 'rb') as inputfile: im = Image.open(inputfile) im_p = im.convert('P') with open("./src/comp_" + image, mode='wb') as outputfile: im_p.save(outputfile)
我ながらよく出来ています。
[Python] リストで重複を調べる
& 演算子で取得
l1 = ['今日', '形態素', '解析', '研究'] l2 = ['明日', '研究', '麦芽', '形態素'] l1l2 = set(l1) & set(l2) print(l1l2)
$ python3 app.py
{‘研究’, ‘形態素’}
lenを使って重複率を調べて分岐処理を行う
l1 = ['今日','の','形態素', '解析', '研究'] l2 = ['明日', '研究', '麦芽', '形態素', '研究'] l1l2 = set(l1) & set(l2) if(len(l1l2) / len(l1) > 0.2): print('重複した文章です') else: print('異なる文章です')
$ python3 app.py
重複した文章です
OK、意外と直ぐに行けた