カテゴリー別アーカイブ: application

[kz] Google Spreadsheetの英文を音声にしてFlashcardsに連携するプログラム

こんにちは、@kazscapeです。

ゴールデンウィークですね。なにしてますか?

私はプログラムなんぞをつくっています。

ゴールデンウィーク前半に作ったプログラムはこちら!

”Google Spreadsheetに書いた英文をGoogle翻訳で音声にして、それをGoogle Driveにアップロードして、暗記帳アプリの「Flashcards Deluxe」に連携する”

がんばって作りましたのでご紹介

Google Spreadsheetの準備

以前の記事でご紹介した単語帳アプリ「Flashcards Deluxe

このアプリ、Google Spreadsheetと連携できるんですね。

「Flashcards Deluxe」とGoogle Driveを連携させるためには、Google Driveに「Flashcards Deluxe」というフォルダを作成して、その配下にSpreadsheetを作成しないといけないこと、さらに音声ファイルは「作成したSpreadsheet名 + <半角スペース> + “Media”」というフォルダに保存しなければならないことに注意してください。

google-drive-for-flashcards-001

今回、「Just Look ‘n Learn English Picture Dictionary」というSpreadsheetを作成したので、「Just Look ‘n Learn English Picture Dictionary Media」というフォルダを作ってあります。

google-drive-for-flashcards-002

Google Spreadsheetを「Flashcards Deluxe」で読み込めるフォーマットは、

  • Text1:いわゆる暗記帳のおもて
  • Text2:いわゆる暗記帳のうら
  • Category1:”Chapter 1″だったり、分類やグループなど
  • Sound 2:音声ファイル

といった項目名を1行目に記載して認識してもらいます

そこで、まずは、Google Spreadsheetをこんなふうに用意します。

google-spreadsheet-for-flashcards-001

Text1には単語を、Text2には英文を。Category1にはグループを入れてあります。Sound2はこのあと作るプログラムで自動で入れてもらうので空欄です。

Googleの認証情報を作ります

今回は、Google Spreadsheetを更新して、Google Driveに音声ファイルを保存するプログラムを作りますが、私以外の誰でも彼でもが好き勝手にそんなことができてはセキュリティずぶずぶですよね。そこで、「私がやってることですよ!登録してるでしょ、私!」的な認証情報を作ります。

まずは、これから作ろうとするプログラムが適切に認証されたプログラムであることを証明するための「認証情報」を取得します。認証情報の取得は「Google API Console」で取得します。

Googleのアカウントをお持ちでなかったら、作ってくださいね。

まずはプロジェクトを作成します。「プロジェクト」なんて、たいそうなものではありませんが。。。

google-api-v4-quickstart-001

自分が作ったプログラムに反応してくれるAPIが有効化されました。続けて「認証情報」を作ります。

google-api-v4-quickstart-002

「プロジェクトへの認証情報の追加」という画面になりますが、一旦、「キャンセル」してください。

google-api-v4-quickstart-003

先に認証方法の「OAuth」の同意をしますので、「OAuth同意画面」のタブを選択してください。

google-api-v4-quickstart-004

「OAuth同意画面」で必要な情報を入力していきます。メールアドレスはGoogleアカウントが自動で表示されます。「サービス名」には適当な名前を入れてください。あとの項目は省略可なので入力してもしなくてもよいです。「保存」ボタンで先に進んでください。

google-api-v4-quickstart-005

「認証情報」のタブに戻るので、ここで「認証情報を作成」に進み、「OAuthクライアントID」を選んでください。

google-api-v4-quickstart-006

今回作ろうとしているプログラムは、表示されている具体的なものとは一致しませんので「その他」を選択。名前は適当な名前を入力して、「作成」ボタンで先に進みます。

google-api-v4-quickstart-007

ここまで進むと「クライアントID」と「クライアントシークレット」という認証情報が取得できます。

google-api-v4-quickstart-008

認証情報は作成しただけでなく、ダウンロードしてください。JSONという形式のファイルがダウンロードできますので、これから作ろうとしているプログラムと同じ場所に保存してください。そして、ファイル名は変更しなくてもいいですが、私は「client_secret.json」というファイル名に変更しておきました。

google-api-v4-quickstart-009

さぁ、プログラミングです。

今回は、最近、勉強している「Python」というプログラミング言語でプログラムを作成してみます。

やりたいことは、

  1. Google Spreadsheetに音声ファイル名を追加すること
  2. Google Spreadsheetに記載されている英文をGoogle翻訳で音声ファイル(MP3)を作成すること
  3. 作成された音声ファイルをGoogle Driveに保存すること

です。

作成したプログラムはこちら。


from __future__ import print_function
import os
import shutil
import httplib2

from googleapiclient import discovery
from googleapiclient.http import MediaFileUpload
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage
from gtts import gTTS
from datetime import datetime as dt

SHEET_SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
DRIVE_SCOPES = 'https://www.googleapis.com/auth/drive.file'
SHEET_JSON_NAME = 'sheet2flashcards.json'
DRIVE_JSON_NAME = 'upload2gdrive.json'
SHEET_ID = <SpreadsheetのID>
DRIVE_ID = <Goggle DriveのID
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google API Python Client'
MAX_COLUMN = 4
TEXT1 = 0
TEXT2 = 1
SOUND2 = 3

try:
    import argparse
    parser = argparse.ArgumentParser(parents=[tools.argparser])
    parser.add_argument('--update',
                        action='store_true',
                        default=False,
                        help='update all contents (default: False)')
    flags = parser.parse_args()
except ImportError:
    flags = None

# 認証
def get_credentials(scopes, json_name):
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir, json_name)

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, scopes)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials

# Google SpreadsheetにMP3のファイル名を追加
def append_mp3name_to_gsheet():
    credentials = get_credentials(SHEET_SCOPES, SHEET_JSON_NAME)
    http = credentials.authorize(httplib2.Http())
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
                    'version=v4')
    service = discovery.build('sheets', 'v4', http=http,
                              discoveryServiceUrl=discoveryUrl)
                    
    result = service.spreadsheets().values().get(
        spreadsheetId=SHEET_ID, range='A2:D').execute()
    values = result.get('values', [])

    if not values:
        print('No data found.')
    else:
        for row in values:
            if len(row) < MAX_COLUMN:
                row.append(row[TEXT1] + '.mp3')

        value_range_body = {"range":"A2:D",
                            "majorDimension":"ROWS",
                            "values":values}
        response = service.spreadsheets().values().update(
                        spreadsheetId=SHEET_ID, range="A2:D",
                        valueInputOption='USER_ENTERED',
                        body=value_range_body).execute()
    return values

# MP3ファイルをGoogle Driveに追加(--updateオプションの場合は総入れ替え)
def mp3_to_gdrive(lists):
    credentials = get_credentials(DRIVE_SCOPES, DRIVE_JSON_NAME)
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('drive', 'v3', http=http)
    
    datetime = dt.now()
    dirname = datetime.strftime('%Y%m%d%H%M%S')
    os.mkdir(dirname)

    query_parents = "'" + DRIVE_ID + "'" + " in parents"

    for row in lists:
        query_mp3name = "name = " + "'" + row[SOUND2] + "'"
        results = service.files().list(
            q = query_parents + " and trashed = False and " +
                query_mp3name, 
            fields = "files(id, name)").execute()
        results = results.get('files', [])

        if not results:
            tts = gTTS(text = row[TEXT2],lang = 'en',slow = False)
            tts.save(os.path.join(dirname, row[SOUND2]))

            file_metadata = {'name':row[SOUND2], 'parents':[DRIVE_ID]}
            media_body = MediaFileUpload(os.path.join(dirname, row[SOUND2]),
                                        mimetype='audio/mp3')
            
            results = service.files().create(body=file_metadata, 
                                    media_body=media_body).execute()
        else:
            if flags.update == True:
                tts = gTTS(text = row[TEXT2], lang = 'en', slow = False)
                tts.save(os.path.join(dirname, row[SOUND2]))

                file_metadata = {'name':row[SOUND2], 'addParents':[DRIVE_ID]}
                media_body = MediaFileUpload(os.path.join(dirname, row[SOUND2]),
                                            mimetype='audio/mp3')
            
                for item in results:
                    file_id = item['id']
                    results = service.files().update(fileId=file_id,
                                        body=file_metadata, 
                                        media_body=media_body).execute()

    shutil.rmtree(dirname)
                                    
def main():
    lists = append_mp3name_to_gsheet()
    mp3_to_gdrive(lists)

if __name__ == '__main__':
    main()

「SHEET_ID」と「DRIVE_ID」はご自身のものに書き換えてください。

「SHEET_ID」は、

google-spreadsheet-for-flashcards-002

「DRIVE_ID」は、

google-drive-for-flashcards-003

それぞれ、URLのところの一部の箇所にあります。

Google SpreadSheetに単語、英文、カテゴリーを入力して、このプログラムを起動すると、音声ファイルを作成してくれて、所定のGoogle Driveに音声ファイルを保存してくれます。

起動方法は

python gtts2flashcards.py

もちろんPythonが動く環境であることが前提です。

「–update」オプションをつけて

python gtts2flashcards.py --update

と起動すると、既存のMP3ファイルも洗い替えてくれるようにしました。

どんなふうな結果になるかというと

Spreadsheetの空だった「Sound 2」の項目に、

google-spreadsheet-for-flashcards-003

音声ファイル名が追加されます。

google-spreadsheet-for-flashcards-004

そして、Mediaのフォルダには、音声ファイルが保存されます。

google-drive-for-flashcards-004

Flashcards Deluxeへの読み込み

ここまでくれば、あとはFlashcards Delexe側で単語帳を読み込むことができます。

単語帳の追加元からGoogle Driveを選択します。

flashcards-deluxe-mp3-download-001

今回作ったSpreadsheetをダウンロードします。

flashcards-deluxe-mp3-download-002

単語を選択すると、

flashcards-deluxe-mp3-download-003

英文が表示されて、その下に再生ボタンが現れます。

flashcards-deluxe-mp3-download-004

再生ボタンを押すと、Google翻訳で作成した音声ファイルが再生されるようになりました。

出来上がりです。

まとめ

ちょっとマニアックな記事でしたでしょうか?

こういうのを作っている時が楽しいんですね。夢中になって作ってました。

これで出先のちょっとした時間でSpreadsheetを更新して、プログラムを動かせば、単語帳を増やせるようになりました。

GoogleのAPIにはこのほかに、カレンダー用のAPIもあるので、次はカレンダーの更新にチャレンジしてみたいと思います。

ゴールデンウィーク前半の成果でした。

ではっ!


[kz] 20版に改版された逐条解説のアプリみっけ!

こんにちは、@kazscapeです。

はやいもので、4月ですね。慣れ親しんだ場所を離れる方も、新たなスタートをきられる方もいらっしゃるのではないでしょうか?

そんな私も心引き締めて、取り組んでいきたい!

ということで、本日は、知的財産関係の勉強に役立つアプリをご紹介。

逐条解説の改定キターーーっ!

長らく改定がなく、19版止まりとなっていた「工業所有権法(産業財産権法)逐条解説」が先月3月16日に20版へと改定されました。

そこで、これまでの19版で使っていたiPadアプリに20版を取り込もうとチャレンジしていたのですが、どうにもうまくいかない。。。

そこで、「他にはアプリはないのか!」と探していたら、見つけました。

青本アプリ!

その名も「(第20版)『工業所有権法(産業財産権法)逐条解説』ブラウザ書き込み青本アプリ」

そのまんまですね(笑)

chikuzyokaisetsu-app-1

20版に対応したアプリを探しているときに、このアプリの19版用は見つけていて、アプリ登録の時期が最近であったことと、19版と銘打っているのですから、もちろん20版に対応してくるだろうと予想していたら、やっぱり見つけました。

主な機能は、

chikuzyokaisetsu-app-2

  • 高速起動
  • 高速全文検索
  • 目的の条文に瞬時にジャンプ
  • ハイライト&メモ書き
  • 第19条からの変更箇所を傍線で表示
  • iPhoneでもiPadでも。
  • 「法令ブラウザ」アプリとリンク

iPhoneでも使えるのがいいな。

早速インストールしてみましょう!

アプリインストール

さて、インストールをしていきますが、まずは何よりも逐条解説をダウンロードしなければなりません。

はて?iPadでインターネットのサイトにあるPDFをダウンロードするのって、どうやるんだっけ?

とりあえず、アプリを起動して、「ヘルプ」でもみてみましょうかね。

chikuzyokaisetsu-app-20

おお〜っ!PDFダウンロードの動画解説が用意されてる。親切〜!

chikuzyokaisetsu-app-4

ふむふむ。ということで、アプリに戻って、特許庁のダウンロードページに行きましょう。

chikuzyokaisetsu-app-3

おおっ!20版だ!

目的のものは「全体版一括ダウンロード」です。

chikuzyokaisetsu-app-5

タップをしますが、すぐにはダウンロードは始まりません。逐条解説が表示されたら、ここで一手間、「その他」をタップします。

chikuzyokaisetsu-app-6

出てきたメニューから「iCloud Driveに追加」を選択します。アプリへの逐条解説の読み込みはiCloud Driveのみが読み込み可能なクラウドサービスになっているようなので、Dropboxなどは利用できませんので、ご注意を!

chikuzyokaisetsu-app-7

「ダウンロード終わりました」的な表示がないので、本当にダウンロードされたかな?って感じにになります。iCloud Driveのアプリで中を確認します。「all.pdf」というPDFがダウンロードされていれば問題なしです。

chikuzyokaisetsu-app-8

アプリに戻って、いよいよ逐条解説を読み込みます。

chikuzyokaisetsu-app-9

iCloud Driveの中にある「all.pdf」を選択してください。

chikuzyokaisetsu-app-10

お?!何やら注意書き。

新旧箇所の表示は独自につけたもので、原著作物および著作権者とは何ら関係がなく、正確性を保障するものではないと。

なんか、ものがものだけにって感じで面白い。OKタップして進みましょう。

chikuzyokaisetsu-app-11

使ってみよう!

ここまででインストールは終わり。さぁ〜、使ってみましょう!

このアプリでは、旧版との間で、新規追加されたものは緑、変更・追加されたものは黄、削除位置は赤で表示されるとのこと。

20版での「改定にあたって」は黄色で表示されていますね。

chikuzyokaisetsu-app-12

条文をみてみましょう。

右下のメニューの「123」と書いてあるのが、条文へのジャンプ機能です。

特許法、実用新案法、意匠法、商標法のいずれかにチェックを入れて、条文番号を入力し、ジャンプです。

chikuzyokaisetsu-app-13

113条「特許意義の申立て」にジャンプしてみました。変更・追加の黄色表示ですね。

chikuzyokaisetsu-app-14

この新旧比較の表示が邪魔くさい場合は、右下の歯車マークの設定メニューで、「旧版からの変更箇所の表示」を「いいえ」にすると消えますよ。

chikuzyokaisetsu-app-15

消えましたね。

chikuzyokaisetsu-app-16

その他の機能としては検索機能があります。アプリ解説に「高速全文検索」と書いてあるだけに、かなり早いです。

chikuzyokaisetsu-app-18

また、以前まで使用していたアプリではマーキングやメモ書きができなかったのが残念だったのですが、このアプリではいずれも可能になってます。これはいい!

chikuzyokaisetsu-app-19

そして、マーキングしたところだけを見ることもできるなんて、なんて素晴らしいんでしょう!

chikuzyokaisetsu-app-17

まとめ

20版は出ないのではないかなんて声も聞こえていた逐条解説ですが、現行の条文との差から、「ここの解説読みたいのにな〜」ってところが埋まったのはとてもうれしい。そして、こんな便利なアプリがあって、以前までこの分野を勉強された先輩方の時代にはなかったものが、私の時代ではいとも簡単に手に入れられることに感謝です。

さて、4月だ。いろいろ頑張らないと!

ではっ!

〔第20版〕『工業所有権法(産業財産権法)逐条解説』ブラウザ 書き込み青本アプリ
カテゴリ: ブック, 辞書/辞典/その他