rainit2006 / Python-room

my python room
0 stars 0 forks source link

常用package #11

Open rainit2006 opened 6 years ago

rainit2006 commented 6 years ago

rainit2006 commented 6 years ago

re 正規表現を扱うためのライブラリです。 re = Regular Expression の略.

rainit2006 commented 6 years ago

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 ファイルの変更が検出されたときに実行したいコマンド。

rainit2006 commented 6 years ago

lxml.etree XML形式のデータをPythonで手軽に扱えるようにするためのライブラリです。XML形式のデータがカンタンに扱えるさまざまな機能を備えています。

rainit2006 commented 6 years ago

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()
rainit2006 commented 6 years ago

doctest ドキュメントによってテストを行うためのライブラリ 対話的な実行例をテストする. https://docs.python.jp/3/library/doctest.html

if name == "main": import doctest # ライブラリの読み込み doctest.testmod() # このモジュール内のテストの実行


example.py をコマンドラインから直接実行すると、 doctest はその魔法を働かせます..........
出力は何もありません!しかしこれが正常で、すべての実行例が正しく動作することを意味しています。スクリプトに -v を与えると、 doctest は何を行おうとしているのかを記録した詳細なログを出力し、最後にまとめを出力します.
rainit2006 commented 6 years ago

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)

rainit2006 commented 6 years ago

Jieba(结巴中文分词)

在线演示 jiebademo (Powered by Appfog)

网站代码: https://github.com/fxsjy/jiebademo

rainit2006 commented 6 years ago

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!'
rainit2006 commented 6 years ago

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