このところ取り組んできたスマホアプリ、「音声をテキストで記録・ファイル保存・再表示するアプリ」が出来ました。
英語、日本語、そしてタイ語で記録再表示を確認できました。
入力はGoogle音声入力を利用するので、対応する言語は使えそうです。
以下の表は一度保存した3つのファイルを表示したもの
1 | 2 | 3 |
---|---|---|
###やったこと | ||
・テキストのスクロール表示 | ||
・保存ファイル名を任意指定 | ||
###・テキストのスクロール表示 | ||
これは、以下の参考のとおりactivity_main.xmlの縦スクロールしたい部分をScrollViewで囲むと動きます。 | ||
【参考】 | ||
・[Android] ScrollView 画面の縦スクロール | ||
今回はtvOutputの部分なので、以下のようになります。 | ||
表示だけ変えればいいというのがいいですね。 |
activity_main.xml
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvOutput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:text=""
android:textSize="25sp" />
</ScrollView>
###・保存ファイル名を任意指定
使っているとやはり保存するファイルは変更して多くの音声を異なるファイルに保存できると便利です。
ということで、これを以下で実現しました。
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Speech to Text</string>
<string name="file_name">File名を入力してください</string>
<string name="tv_name">音声入力してください</string>
<string name="bt_click">表示</string>
<string name="bt_click1">表示2</string>
<string name="bt_clear">クリア</string>
以下のようにTextViewとEditTextを追記します。
activity_main.xml
<LinearLayout
...
<TextView
...
<EditText
...
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="File名を入力してください"/>
<EditText
android:id="@+id/fileName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" />
Main部分は以下のように変更追記しました。
MainActivity.kt
private inner class HelloListener : View.OnClickListener {
override fun onClick(view: View) {
...
//名前入力欄であるEditTextオブジェクトを取得。
val input_file = findViewById<EditText>(R.id.fileName)
...
//入力された名前文字列を取得。
val inputStr_file = input_file.text.toString()
...
//idのR値に応じて処理を分岐。
when(view.id) {
//表示ボタンの場合…
R.id.btClick -> {
...
//入力された名前文字列を取得。
val inputStr_file = input_file.text.toString()
//メッセージを表示。
output.text = df.format(date) + "\n"+inputStr
val fOut = openFileOutput(inputStr_file, Context.MODE_PRIVATE)
fOut.write(inputStr.toByteArray())
fOut.close()
}
R.id.btClick1 -> {
var temp=""
var pathUtf8 = getFilesDir().getAbsolutePath();
temp = File(pathUtf8+"/"+ inputStr_file).readText(Charsets.UTF_8)
output.text = df.format(date) + "\n" + temp
input.setText("")
}
}
}
###まとめ
・音声テキスト変換して記録・再表示するスマホアプリを作った
・保存ファイル名を変更出来るようにした
・ファイル取り出しするにはAndroidStudioが必要なので改善したい
・録音ファイルの文字起こしに対応したい(別再生機使えば出来る)
・翻訳機能を追加したい
###おまけ
以下はAndroidStudioのEmptyActivityから作成した場合の追加コードです。
MainActivity.kt
package com.example.hellosample
//import jdk.nashorn.internal.runtime.ECMAErrors.getMessage
import android.content.Context
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.io.FileInputStream
import java.io.InputStreamReader
import java.text.SimpleDateFormat
import java.util.*
import java.io.File
import java.nio.charset.StandardCharsets.UTF_8
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//表示ボタンであるButtonオブジェクトを取得。
val btClick = findViewById<Button>(R.id.btClick)
//表示ボタンであるButtonオブジェクトを取得。
val btClick1 = findViewById<Button>(R.id.btClick1)
//リスナクラスのインスタンスを生成。
val listener = HelloListener()
//表示ボタンにリスナを設定。
btClick.setOnClickListener(listener)
//表示ボタンにリスナを設定。
btClick1.setOnClickListener(listener)
//クリアボタンであるButtonオブジェクトを取得。
val btClear = findViewById<Button>(R.id.btClear)
//クリアボタンにリスナを設定。
btClear.setOnClickListener(listener)
}
/**
* ボタンをクリックしたときのリスナクラス。
*/
private inner class HelloListener : View.OnClickListener {
override fun onClick(view: View) {
//名前入力欄であるEditTextオブジェクトを取得。
val input = findViewById<EditText>(R.id.etName)
//名前入力欄であるEditTextオブジェクトを取得。
val input_file = findViewById<EditText>(R.id.fileName)
//メッセージを表示するTextViewオブジェクトを取得。
val output = findViewById<TextView>(R.id.tvOutput)
//入力された名前文字列を取得。
val inputStr = input.text.toString()
//入力された名前文字列を取得。
val inputStr_file = input_file.text.toString()
val df = SimpleDateFormat("HH:mm:ss") //"yyyy/MM/dd HH:mm:ss"
val date = Date()
//input_count.setText("0")
//idのR値に応じて処理を分岐。
when(view.id) {
//表示ボタンの場合…
R.id.btClick -> {
//入力された名前文字列を取得。
val inputStr = input.text.toString()
//入力された名前文字列を取得。
val inputStr_file = input_file.text.toString()
//メッセージを表示。
output.text = df.format(date) + "\n"+inputStr //+ "さん、こんにちは!" //inputStr + "さん、こんにちは!"
//val fOut = openFileOutput("testfile.txt", Context.MODE_PRIVATE)
val fOut = openFileOutput(inputStr_file, Context.MODE_PRIVATE)
fOut.write(inputStr.toByteArray())
fOut.close()
}
R.id.btClick1 -> {
var temp=""
var pathUtf8 = getFilesDir().getAbsolutePath(); //"com.example.hellosample/files/testfile.txt"
//temp = File(pathUtf8+"/testfile.txt").readText(Charsets.UTF_8)
temp = File(pathUtf8+"/"+ inputStr_file).readText(Charsets.UTF_8)
output.text = df.format(date) + "\n" + temp
input.setText("")
}
//クリアボタンの場合…
R.id.btClear -> {
//名前入力欄を空文字に設定。
input.setText("")
//メッセージ表示欄を空文字に設定。
output.text = ""
}
}
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tv_name"/>
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="File名を入力してください"/>
<EditText
android:id="@+id/fileName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt_click"/>
<Button
android:id="@+id/btClick1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt_click1" />
<Button
android:id="@+id/btClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt_clear"/>
</LinearLayout>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvOutput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:text=""
android:textSize="25sp" />
</ScrollView>
</LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Speech to Text</string>
<string name="file_name">File名を入力してください</string>
<string name="tv_name">音声入力してください</string>
<string name="bt_click">表示</string>
<string name="bt_click1">表示2</string>
<string name="bt_clear">クリア</string>