和英朗読AI~こりゃえーわai~

英語の勉強に便利な和英朗読AI~こりゃえーわai~
和英朗読AI~こりゃえーわai~

英語の勉強に便利な和英朗読AI~こりゃえーわai~
↓↓↓
和英朗読AI~こりゃえーわai~

和英朗読AI~こりゃえーわai~

日本語テキストを英語と日本語で交互に朗読する英語勉強用アプリを作りました。指一本動かせない満員電車の中でも英語の勉強が出来る優れものです。是非、使ってみて下さい。

1.和英朗読AI~こりゃえーわai~はこんなアプリ

アプリの概要

和英朗読AI~こりゃえーわai~は、英語学習のためのAndroidアプリです。その名の通り、日本語テキストを英語で朗読します。一文ずつ日本語と英語で朗読するので、意味を確認しながら英語を聴くことができます。
和英朗読AI~こりゃえーわai~

和英朗読AI~こりゃえーわai~の使い方

画面上部のテキストエリアに朗読したい日本語テキストをコピペする

和英朗読AI~こりゃえーわai~の使い方

朗読ボタンを押す

和英朗読AI~こりゃえーわai~の使い方

AIが日本語と英語を交互に朗読してくれる

和英朗読AI~こりゃえーわai~の使い方

和英朗読AI~こりゃえーわai~の機能

  • 日本語テキスト朗読
  • 朗読の一時中断
  • 同じ文を複数回繰り返し朗読機能
  • 朗読テキストフォーカス機能
  • 英語テキスト朗読
    和英と言いつつ、英和にもこっそり対応(^^;
  • 英語朗読スピード変更機能
  • 英語のみ朗読、日本語と英語の両方朗読の切り替え機能
  • 翻訳のみ、翻訳と朗読の切り替え機能

ネーミング

英和だから「えーわ」では無いです。
和英アプリなので。
「えーわai」→「えー和英」と「AI」をかけてます。
読み方は「えーわぁい」です。

説明しないと分からないだろうネーミング・・・💧

2.和英朗読AI~こりゃえーわai~のインストール

Google Playストアからインストールして下さい。


和英朗読AI~こりゃえーわai~

play.google.com/store

3.和英朗読AI~こりゃえーわai~の活用方法

和英朗読AI~こりゃえーわai~の用途

英語の勉強用にどうぞ😄

利用方法1. 手が離せない時間で英語勉強

満員電車、運転中、料理中など、手が離せない何も出来ない時は、このアプリで英語の勉強をしてみて下さい。
何も出来ない時間が有意義な時間に変わります。

利用方法2. しっかり英語の勉強

何も出来ない満員電車で使うために作ったアプリなのですが、実は聴くだけでなく、テキストも見れる時に使って貰いたいです。
朗読している文書にフォーカスする機能を付けているので、英文を見ながらリスニング出来ます。英文を見た方が聴くだけよりしっかり英語が頭に入ると思うので、出来れば隙間時間ではなくしっかり時間を取って勉強して頂きたいなー。

4.和英朗読AI~こりゃえーわai~の仕組み

Google Cloud APIで翻訳して、Android APIで朗読してます。
Google Cloud API使っているから、使うと少し私が課金されるので、このアプリ広告載せてます・・・。広告見てねm(__)m

Google Cloud API ~Translation API~

Googleの機械学習を使用して、言語翻訳を行うAPI。
今の世の中、翻訳と言ったらGoogle翻訳!!Googleに勝るものはありません。

ソースサンプル

final String CLOUD_TRANSLATE_URL = "https://translation.googleapis.com/language/translate/v2?key=%s";

// HTTP通信クラス生成(自前クラスです)
HttpRequestor http = new HttpRequestor(this);
// APIのURL設定
http.setURL(String.format(CLOUD_TRANSLATE_URL, CLOUD_API_KEY));

// APIのリクエストパラメタ設定
// mimeType:mimeType
http.addRequest("mimeType", "text/plain");
// source:翻訳元言語
http.addRequest("source", "ja");
// source:翻訳先言語
http.addRequest("target", "en");
// q:翻訳対象テキスト
EditText textSource = (EditText)findViewById(R.id.textSource);
List inputList = new LinkedList();
String sourceStr = textSource.getText().toString();
for(String text : sourceStr.split("。")){
    inputList.add(text + "。");
}
http.addRequest("q", inputList);

// API呼び出し中のメッセージ設定
http.setMessage(getString(R.string.message_loading));
// API成功時のコールバック処理
http.setCallback((c, b) -> {
    StringBuilder stb = new StringBuilder();
    Gson gson = new Gson();
    Map map = gson.fromJson(new String(b), Map.class);
    List outputList = (List)(((Map)map.get("data")).get("translations"));
    for(int i = 0; i < outputList.size(); i++){
        resultList.add(new ResultText(
            resultList.size(), "ja", inputList.get(i)));
        resultList.add(new ResultText(
            resultList.size(), "en", (String)outputList.get(i).get("translatedText")));
    }
});
// API失敗時のコールバック処理
http.setErrorCallback((c, e) -> {
    resultList.add(new ResultText(
            resultList.size(), "ja", getString(R.string.message_error) + e.toString()));
    talkFinish();
});
// API呼び出し
http.execute();

自前HTTP通信クラス(HttpRequestor)

package com.piyonekochannel.util.http;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

import com.google.gson.Gson;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * 非同期通信HTTPリクエスト実行クラス
*

[使用方法]

* new HttpRequestor( * this, * "http://xxxx.xx", * "処理中メッセージ", * b -> { * // rはバイト配列のレスポンスデータ。 * // 正常時の処理を記載。 * }, * e -> { * // eはエクセプション。 * // エラー時の処理を記載。 * } * ).execute(); */ public class HttpRequestor extends AsyncTask { private Context context = null; private String url = null; private Map body = new HashMap(); private String message = null; private Callback callback = null; private ErrorCallback errorCallback = null; private Exception exception = null; private ProgressDialog progressDialog = null; /** * コンストラクタ * @param context コンテキスト */ public HttpRequestor(Context context) { this.context = context; } /** * 通信先URLセッター * @param url 通信先URL */ public void setURL(String url){ this.url = url; } /** * 送信データセッター * @param key データキー * @param value データ値 */ public void addRequest(String key, Object value){ this.body.put(key, value); } /** * 処理中メッセージセッター * @param message 処理中メッセージ */ public void setMessage(String message){ this.message = message; } /** * 正常時のコールバック関数セッター * @param callback 正常時のコールバック関数(Callback) */ public void setCallback(Callback callback){ this.callback = callback; } /** * エラー時のコールバック関数セッター * @param errorCallback エラー時のコールバック関数(ErrorCallback) */ public void setErrorCallback(ErrorCallback errorCallback){ this.errorCallback = errorCallback; } @Override protected void onPreExecute() { super.onPreExecute(); if(this.message != null){ // 砂時計表示 this.progressDialog = new ProgressDialog(context); this.progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); this.progressDialog.setMessage(this.message); progressDialog.setCancelable(false); this.progressDialog.show(); } } @Override protected byte[] doInBackground(Void... params) { HttpURLConnection con = null; try { // HTTPリクエスト final URL url = new URL(this.url); con = (HttpURLConnection) url.openConnection(); con.setDoOutput(true); con.setRequestMethod("POST"); con.setRequestProperty("Content-Type", "application/json"); con.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"); OutputStreamWriter bodyOut = new OutputStreamWriter(con.getOutputStream()); Gson gson = new Gson(); bodyOut.write(gson.toJson(this.body)); bodyOut.close(); con.connect(); final int status = con.getResponseCode(); if (status == HttpURLConnection.HTTP_OK) { final InputStream in = con.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte [] buffer = new byte[1024]; while(true) { int len = in.read(buffer); if(len < 0) { break; } out.write(buffer, 0, len); } in.close(); out.close(); return out.toByteArray(); } else { throw new IOException("HTTP status:" + status); } } catch (Exception e) { this.exception = e; errorCallback.accept(context, e); return null; } finally { if (con != null) { con.disconnect(); } } } @Override protected void onPostExecute(byte[] response) { super.onPostExecute(response); // コールバック処理実行 if (this.exception == null) { callback.accept(context, response); } else { errorCallback.accept(context, this.exception); } if(this.message != null){ // 砂時計解除 this.progressDialog.dismiss(); } } public interface Callback { void accept(Context context, byte[] bytes); } public interface ErrorCallback { void accept(Context context, Exception e); } }

Android API ~TextToSpeech~

GoogleはCloud APIで機械学習を使って流暢な音声合成が出来るAPI、Cloud Text-to-Speechを提供していますが、実は、Android APIで音声合成が出来ます。
Android APIはローカル環境で動くのでインターネット接続が要りません。しかもAPIと違って無料です。
Cloud Text-to-Speechの方が流暢なんですが、Android APIも十分に自然な発音です。手軽に音声合成を実現したい場合には、Android API ~TextToSpeech~がお薦めです。

ソースサンプル


// TextToSpeech生成
TextToSpeech tts = new TextToSpeech(this, (status)->{
    // 端末で英語と日本語のTTSが使えるかチェックする
    if (TextToSpeech.SUCCESS == status) {
        if ((tts.isLanguageAvailable(Locale.JAPANESE) >= TextToSpeech.LANG_AVAILABLE) &&
                (tts.isLanguageAvailable(Locale.ENGLISH) >= TextToSpeech.LANG_AVAILABLE)) {
            return;
        }
    }
    Toast.makeText(this, getString(R.string.message_not_use_error), Toast.LENGTH_LONG).show();
});

// 音声合成する言語を設定
tts.setLanguage(Locale.JAPANESE);
// 音声合成
tts.speak(curResultText.getValue(), TextToSpeech.QUEUE_FLUSH, null, "messageID001");

本日は以上です。和英朗読AI~こりゃえーわai~を宜しくお願いします。

がんばろー

広告




スポンサーリンク
広告




広告




シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
広告