Open rainit2006 opened 6 years ago
re 正規表現を扱うためのライブラリです。 re = Regular Expression の略.
re.search()
探索のための関数です。与えられたテキストの中の正規表現パターンを探索します。
result = re.search(r"\w+d", text)
re.findall() 探索のための関数です。 re.search() が最初に一致したパターンをひとつだけ返すのに対し、 re.findall() は対象文字列の中から一致したパターンをすべて返します。戻り値はリストで、その各要素は文字列です( re.search() が返すようなマッチオブジェクトではありません)。
re.split() 分割のための関数です。指定した正規表現パターンを区切り文字にしてテキストを分割します。結果はリストで返ってきます。
re.sub() 置換のための関数です。正規表現パターンと一致する部分を別の文字列に置換した文字列を返します。
watchdog ファイルの変更を監視して、ファイルが変更されたら何らかの処理を行う自動化ツール作成のためのライブラリです。 使い方はシンプルで、 watchmedo コマンドに監視対象と実行したいコマンドをオプションでただ渡すだけで OK です。
watchmedo shell-command \
--patterns="*Test.php" \
--ignore-directories \
--recursive \
--command='./vendor/bin/phpunit ${watch_src_path} && echo ""'
watchmedo にサブコマンド shell-command を指定して実行しています。使用しているオプションについて以下にかんたんに説明します。 --patterns 対象のファイル名のパターン。 --ingore-directories ディレクトリを無視する場合につける。 --recursive 再帰的に子孫ディレクトリをウォッチする場合につける。 --command ファイルの変更が検出されたときに実行したいコマンド。
lxml.etree XML形式のデータをPythonで手軽に扱えるようにするためのライブラリです。XML形式のデータがカンタンに扱えるさまざまな機能を備えています。
Request Python の HTTP ライブラリ.
Python には urllib2 というライブラリがあるが, 公式サイトに Requests is an Apache2 Licensed HTTP library, written in Python, for human beings. という説明がある通り, 人類にとって読みやすくコーディングできる.
# GET
requests.get('URL')
# POST
requests.post('URL')
# PUT
requests.put('URL')
# DELETE
requests.delete('URL')
# header の取得
requests.head('URL')
GET リクエストで UA を指定するとき
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get('URL', params=payload)
POST リクエストで HTTP ヘッダーにデータを追加する時
>>> payload = {'send': 'data'}
>>> requests.post('URL', data=json.dumps(payload))
レスポンスの中身の関数 text: 返ってきたレスポンスボディをテキスト形式で取得. リクエストは自動的に unicode にデコードされている.
>>> r = requests.get('http://yahoo.com/')
>>> r.text
'<!DOCTYPE html>\n<html lang="en-US" class="dev-desktop uni-purple-border bkt901 https uni-dark-purple sasb-space" style="">\n<!-- m2 template -->\n<head>\n <meta http-equiv="Content-Type" ...
encoding :エンコーディング情報を取得 content:レスポンスボディをバイナリ形式で取得.
html = requests.get(url).content.decode('utf8')
a = html.index('<td>新西兰元</td>') # 取得“新西兰元”当前位置
s = html[a:a + 300] # 截取新西兰元汇率那部分内容(从a到a+300位置)
各種レスポンス毎の処理 画像:PIL の Image モジュール を使う.
>>> from PIL import Image
>>> from StringIO import StringIO
>>> r = requests.get('http://www.fnal.gov/faw/designstandards/filesfordownload/FermiLogo_blue.gif')
>>> i = Image.open(StringIO(r.content))
JSON
>>> requests.get('http://ci.nii.ac.jp/ncid/BB08796640.json').json()
{'@context': {'foaf': 'http://xmlns.com/foaf/0.1/', 'prism': 'http://prismstandard.org/namespaces/basic/2.0/', 'rdfs': 'http://www.w3.org/2000/01/rdf-schema#', 'owl': 'http://www.w3.org/2002/07/ ...
サンプル
# -*- coding: utf-8 -*-
import doctest
import requests
def sample(query):
""" requests sample that use qiita search api
>>> 'title' in sample('python')
True
>>> 'totle' in sample('python')
False
"""
q = {'q': query}
r = requests.get('https://qiita.com/api/v1/search', params=q)
return list(r.json()[0].keys())
if __name__ == "__main__":
doctest.testmod()
doctest ドキュメントによってテストを行うためのライブラリ 対話的な実行例をテストする. https://docs.python.jp/3/library/doctest.html
偶数かどうかをチェックチェックする関数
def is_even1(number):
"""check if number is even or not
if even, return true, else false.
>>> is_even1(2)
True
>>> is_even1(5)
False
"""
return number % 2 == 0
if name == "main": import doctest # ライブラリの読み込み doctest.testmod() # このモジュール内のテストの実行
example.py をコマンドラインから直接実行すると、 doctest はその魔法を働かせます..........
出力は何もありません!しかしこれが正常で、すべての実行例が正しく動作することを意味しています。スクリプトに -v を与えると、 doctest は何を行おうとしているのかを記録した詳細なログを出力し、最後にまとめを出力します.
wget 批量下载不再那么复杂 只要wget
import wget
result = wget.download(imageUrl, out=fileName)
import wget
url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3'
filename = wget.download(url)
Google声音识别 Google Speech APIは,Googleの音声認識の技術を利用するためのAPI. このAPIは,音声ファイルを入力に取り,その音声に対応するもっともらしい自然文を確信度付きで出力する. Google Speech APIの利用にはGoogle Developer Consoleでの登録が必要. 日本からSpeech APIを有効化するには,Chrome-devグループに加入する必要があるらしい.
無料版では1日50回程度の実行に限られる(実際にはもう少し動かせるらしいが). 思いの外実行時間がかかる(10秒弱の音声ファイルに対して,実行時間が約10秒程度). 自分が確認した限りでは,16bitPCM,44,100Hzと16,000Hzの音声ファイルについて,うまく認識できた(1チャンネルのもののみ).flac形式にも対応しているらしいが,よくわからない.
https://qiita.com/sayonari/items/a70118a468483967ad34
pip安装必要的库文件
pip install grpc-google-cloud-speech-v1beta1
代码如下: https://github.com/sayonari/GoogleSpeechAPI_stream/blob/master/GoogleSpeechAPI_stream.py -- 簡易的な音声開始検出を実装し,音声が開始するまではPC側で監視 -- 音声開始を検出してから,googleに接続開始 -- 接続中の音声もバッファしておき,googleに繋がったらバッファから順に送信
#!/usr/bin/python
# -*- coding: utf-8 -*-
# ベースのソースは以下のものです
# https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/speech/grpc/transcribe_streaming.py
import pyaudio
import time
import wave
import audioop
import math
import sys
import re
from gcloud.credentials import get_credentials
from google.cloud.speech.v1beta1 import cloud_speech_pb2 as cloud_speech
from google.rpc import code_pb2
from grpc.beta import implementations
# 各種設定 #########################
flag_recogRepeat = True # 音声認識を繰り返し行う場合 Trueにする
EXIT_WORD = u"(音声認識を終了します|ちちんぷいぷい|さようなら)" # 音声認識を終了させる合言葉
LANG_CODE = 'ja-JP' # a BCP-47 language tag
RATE = 16000 # サンプリングレート
CHANNELS = 1 # 録音チャンネル数
RECORD_SEC = 5 # 録音時間(sec)
DEV_INDEX = 0 # デバイスを指定
FRAME_SEC = 0.1 # 1フレームの時間(秒) (0.1sec = 100ms)
CHUNK = int(RATE * FRAME_SEC) # 1フレーム内のサンプルデータ数
SLEEP_SEC = FRAME_SEC / 4 # メインループ内でのスリープタイム(秒)
BUF_SIZE = CHUNK * 2 # 音声のバッファ・サイズ(byte)
DECIBEL_THRESHOLD = 50 # 録音開始のための閾値(dB)
START_FRAME_LEN = 4 # 録音開始のために,何フレーム連続で閾値を超えたらいいか
START_BUF_LEN = 5 # 録音データに加える,閾値を超える前のフレーム数 (START_FRAME_LENの設定によって,促音の前の音が録音されない問題への対処用)
# Google のサンプルプログラムより (Keep the request alive for this many seconds)
DEADLINE_SECS = 8 * 60 * 60
SPEECH_SCOPE = 'https://www.googleapis.com/auth/cloud-platform'
# バッファ用変数 #####################
frames = []
frames_startbuf = []
flag_RecordStart = False # 音量が規定フレーム分,閾値を超え続けたらTRUE
flag_RecogEnd = False # 音声認識が終わったらTrueにする
recog_result = "" # 音声認識結果
# コールバック関数 ###################
def callback(in_data, frame_count, time_info, status):
frames.append(in_data)
return (None, pyaudio.paContinue)
# Creates an SSL channel ###########
def make_channel(host, port):
ssl_channel = implementations.ssl_channel_credentials(None, None, None)
creds = get_credentials().create_scoped([SPEECH_SCOPE])
auth_header = (
'Authorization',
'Bearer ' + creds.get_access_token().access_token)
auth_plugin = implementations.metadata_call_credentials(
lambda _, cb: cb([auth_header], None),
name='google_creds')
composite_channel = implementations.composite_channel_credentials(
ssl_channel, auth_plugin)
return implementations.secure_channel(host, port, composite_channel)
# listen print loop ##################
def listen_print_loop(recognize_stream):
global flag_RecogEnd
global recog_result
for resp in recognize_stream:
if resp.error.code != code_pb2.OK:
raise RuntimeError('Server error: ' + resp.error.message)
# 音声認識結果&途中結果の表示 (受け取るデータの詳細は以下を参照のこと)
#
https://cloud.google.com/speech/reference/rpc/google.cloud.speech.v1beta1#google.cloud.speech.v1beta1.SpeechRecognitionAlternative
for result in resp.results:
if result.is_final:
print "is_final: " + str(result.is_final)
for alt in result.alternatives:
print "conf:" + str(alt.confidence) + " stab:" + str(result.stability)
print "trans:" + alt.transcript
recog_result = alt.transcript
# 音声認識終了(is_final: True)
if result.is_final:
flag_RecogEnd = True
return
# request stream ####################
def request_stream(channels=CHANNELS, rate=RATE, chunk=CHUNK):
global flag_RecogEnd
global LANG_CODE
recognition_config = cloud_speech.RecognitionConfig(
encoding='LINEAR16', # raw 16-bit signed LE samples
sample_rate=rate, # the rate in hertz
language_code=LANG_CODE, # a BCP-47 language tag
)
streaming_config = cloud_speech.StreamingRecognitionConfig(
config=recognition_config,
interim_results=True, single_utterance=True
)
yield cloud_speech.StreamingRecognizeRequest(
streaming_config=streaming_config)
while True:
time.sleep(SLEEP_SEC)
if flag_RecogEnd:
return
# バッファにデータが溜まったら,データ送信
if len(frames) > 0:
data_1frame = frames.pop(0)
data_l2s = b''.join(map(str, data_1frame))
wf.writeframes(data_l2s) # waveファイルに書き込み
yield cloud_speech.StreamingRecognizeRequest(audio_content=data_l2s) # google ASR
# main ##############################
if __name__ == '__main__':
print 'Start Rec!'
# pyaudioオブジェクトを作成 --------------------
p = pyaudio.PyAudio()
# ストリームを開始 (録音は別スレッドで行われる) ----
stream = p.open(format=p.get_format_from_width(2),
channels=CHANNELS,
rate=RATE,
input_device_index=DEV_INDEX,
input=True,
output=False,
frames_per_buffer=CHUNK,
stream_callback=callback)
stream.start_stream()
# 録音用waveファイルのFileStream作成 ------------
wf = wave.open("wave_buf_write.wav", 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
wf.setframerate(RATE)
while True:
# フラグ初期化 ##################################
flag_RecordStart = False # 音量が規定フレーム分,閾値を超え続けたらTRUE
flag_RecogEnd = False # 音声認識が終わったらTrueにする
# 録音開始までの処理 ##############################
while not flag_RecordStart:
time.sleep(SLEEP_SEC)
# 促音用バッファが長過ぎたら捨てる(STARTフレームより更に前のデータを保存しているバッファ)
if len(frames_startbuf) > START_BUF_LEN:
del frames_startbuf[0:len(frames_startbuf) - START_BUF_LEN]
# バッファにデータが溜まったら,録音開始するべきか判定 ---------
if len(frames) > START_FRAME_LEN:
# 1フレーム内の音量計算--------------------------------
for i in range(START_FRAME_LEN):
data = frames[i]
rms = audioop.rms(data, 2)
decibel = 20 * math.log10(rms) if rms > 0 else 0
sys.stdout.write("\rrms %3d decibel %f" %(rms,decibel))
sys.stdout.flush()
# 音量が閾値より小さかったら,データを捨てループを抜ける ----
if decibel < DECIBEL_THRESHOLD:
frames_startbuf.append(frames[0:i + 1])
del frames[0:i + 1]
break
# 全フレームの音量が閾値を超えていたら,録音開始!! ----
# 更に,framesの先頭に,先頭バッファをプラス
# これをしないと「かっぱ」の「かっ」など,促音の前の音が消えてしまう
if i == START_FRAME_LEN - 1:
flag_RecordStart = True
frames = frames_startbuf + frames
# googleサーバに接続 ############################
print "\nconnecting ...."
with cloud_speech.beta_create_Speech_stub(
make_channel('speech.googleapis.com', 443)) as service:
try:
print "success to connect."
except:
print "connection error."
# 録音開始後の処理 ###############################
listen_print_loop(
service.StreamingRecognize(
request_stream(), DEADLINE_SECS))
# 音声認識 繰り返しの終了判定 #####################
if re.match(EXIT_WORD, recog_result):
print('Exiting..')
break
# 音声認識繰り返ししない設定 ######################
if not flag_recogRepeat:
break
# ストリームを止めて,クローズ
print 'Closing audio stream....'
stream.stop_stream()
stream.close()
p.terminate() # pyaudioオブジェクトを終了
wf.close() # wavefile stream クローズ
print 'End Rec!'
pyaudio https://people.csail.mit.edu/hubert/pyaudio/
音声再生。
"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(CHUNK)
while data != '':
stream.write(data)
data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()
"""PyAudio Example: Play a wave file (callback version)"""
import pyaudio
import wave
import time
import sys
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
p = pyaudio.PyAudio()
def callback(in_data, frame_count, time_info, status):
data = wf.readframes(frame_count) #この中で別スレッドの処理
return (data, pyaudio.paContinue)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
stream_callback=callback)
stream.start_stream()
while stream.is_active():
time.sleep(0.1)
stream.stop_stream()
stream.close()
wf.close()
p.terminate()
マイクからの音を録音(pyaudio使用) https://www.ningendesu.net/blog/entry/655 まず最初に、音声入力に使うデバイスのインデックス番号を確認する。使えるデバイスのインデックス番号とそのデバイス名が出力されるので確認する。
# -*- coding: utf-8 -*-
import sys
import pyaudio
#インデックス番号の確認
p = pyaudio.PyAudio()
count = p.get_device_count()
devices = []
for i in range(count):
devices.append(p.get_device_info_by_index(i))
for i, dev in enumerate(devices):
print (i, dev['name'])
録音する。さっき確認したインデックス番号はinput_device_indexのパラメータへ設定する。
# -*- coding: utf-8 -*-
import pyaudio
import wave
FORMAT = pyaudio.paInt16
CHANNELS = 1 #モノラル
RATE = 44100 #サンプルレート
CHUNK = 2**11 #データ点数
RECORD_SECONDS = 10 #録音する時間の長さ
WAVE_OUTPUT_FILENAME = "file.wav"
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True,
input_device_index=4, #デバイスのインデックス番号
frames_per_buffer=CHUNK)
print ("recording...")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print ("finished recording")
stream.stop_stream()
stream.close()
audio.terminate()
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()
另一个例子: http://takeshid.hatenadiary.jp/entry/2016/01/10/153503