【Androidアプリ】音声テキスト変換して記録・ファイル保存・再表示するアプリが出来た♪

このところ取り組んできたスマホアプリ、「音声をテキストで記録・ファイル保存・再表示するアプリ」が出来ました。
英語、日本語、そしてタイ語で記録再表示を確認できました。
入力はGoogle音声入力を利用するので、対応する言語は使えそうです。

**以下の表は一度保存した３つのファイルを表示したもの**

| 1 | 2 | 3 |
|:-:|:-:|:-:|
| ![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/ae62ad78-e389-1e15-739b-063c236b8992.jpeg)|![test2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/3501631d-d29c-a439-e197-827d4ca410f8.jpeg)|![testfile.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/a21442d5-3c05-6a24-5a18-ca306e2b49d8.jpeg)|
###やったこと
・テキストのスクロール表示
・保存ファイル名を任意指定
###・テキストのスクロール表示
これは、以下の参考のとおりactivity_main.xmlの縦スクロールしたい部分をScrollViewで囲むと動きます。
【参考】
・[[Android] ScrollView 画面の縦スクロール](https://akira-watson.com/android/scrollview.html)
今回は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">表示２</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">表示２</string>
    <string name="bt_clear">クリア</string>
```