GoogleHomeで文字起こし（イマイチ）

そもそもGoogleHomeっていい感じに音声を文字列として受け取ってくれるし、録音して文字起こしみたいなアプリよりもいい感じに出来るのでは？って思ったのでやってみた。

## 構成

GoogleHome → Actions on Google → Dialogflow→ GoogleAppsScript

## 記録用スプレッドシート、スクリプト

GoogleAppsScriptを選んだ理由はなんとなくスプレッドシート開いてるときに思いついたから。
出力先はテキストファイルでいいと思う
出力先のスプレッドシートに日付、時間、テキストの列があるものとする。
![2017-12-21_01h45_34.png](https://qiita-image-store.s3.amazonaws.com/0/64415/cd1d961f-30af-d293-ac8a-0d0e244c8e22.png)


```js:Transcription.gs
var prop = PropertiesService.getScriptProperties();
// このあたりはプロジェクトのプロパティにそれっぽのを登録しておく
var sheetId = prop.getProperty('SHEET_ID');
var sheetName = prop.getProperty('SHEET_NAME');

function doPost(e) {
  var result = JSON.parse(e.postData.contents).result;
  try {
    var ss = SpreadsheetApp.openById(sheetId);
    var sh = ss.getSheetByName(sheetName);
    var lastrow = sh.getLastRow();
    sh.insertRowAfter(lastrow);
    lastrow++;
    
    var now = new Date();
    var date = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyy-MM-dd');
    var time = Utilities.formatDate(now, 'Asia/Tokyo', 'HH:mm:ss');
    sh.getRange(lastrow, 1).setValue(date);
    sh.getRange(lastrow, 2).setValue(time);
    sh.getRange(lastrow, 3).setValue(result.resolvedQuery);
  } catch(ex) {
    return ContentService.createTextOutput('NG');
  }
  return ContentService.createTextOutput('OK');
}
```

できたら「公開」→「アプリケーションとして導入」
次のユーザーとしてアプリケーションを実行:自分
アプリケーションにアクセスできるユーザー:全員(匿名ユーザー含む)
以下のようなURLが発行されるのでメモ

https\://script.google.com/macros/s/<スクリプトID>/exec

## Actions on Googleでプロジェクトを作成

テキトーにプロジェクトを作ってDialogflowを呼ぶように設定

## DialogFlow

GoogleHomeに話しかけた内容を受け取ってGASを呼びだす

### Fulfillment

Fulfillmentを有効にし、WebHookにGASのURLを設定
![2017-12-21_01h47_56.png](https://qiita-image-store.s3.amazonaws.com/0/64415/49541547-d105-bc51-0794-e6a0994eeb3b.png)


### Intents

#### Default Fallback Intent

通常はうまく認識できなかったパターンがここに流れてくるが、基本的にすべてをここで処理する

Text responseを一旦削除し、「.」のみ登録(レスポンスでいちいち喋られるとテンポが悪いため)
下の方にあるFullfillmentを開き「Use webhook」にチェック
![2017-12-21_02h12_17.png](https://qiita-image-store.s3.amazonaws.com/0/64415/273f13d8-bf34-0ea1-5e0a-14ed992ebda4.png)

:warning:どう考えても本来の使い方とは違う

#### Default Welcome Intent

とくに何かをするわけではないが、終了方法忘れるとつらいのでText responseに

```
文字起こしへようこそ。終了する時は「バルス」と言ってください。
```

とでも登録しておく

#### 終了用Intent追加

Exitとでも名前をつけて

User saysに「バルス」「ばるす」ぐらいを登録しておく
会議中に絶対でないであろう言葉にするのがよい
※「終了」とかは別の流れで普通に出そうなワードなので避ける

一番下のGoogle Assistantを開き「End conversation」にチェックを入れる
![2017-12-21_01h56_07.png](https://qiita-image-store.s3.amazonaws.com/0/64415/e6e566a2-1830-c80c-b849-806ca6b3304e.png)


この時点で右上のTry it nowにテキトーに文字を打ち込めばスプレッドシートに記録されるはず

## Actions on GoogleのApp Information

Actions on Googleに戻ってAssistant app name、Sample invocationsにそれっぽい名前をつける
公開しないのでエラーを消す必要はない
![2017-12-21_01h59_42.png](https://qiita-image-store.s3.amazonaws.com/0/64415/a0fd31e5-9f72-2cc9-ebec-65973dc62f95.png)
![2017-12-21_02h00_27.png](https://qiita-image-store.s3.amazonaws.com/0/64415/fed79a2f-dd4d-bcd2-0edc-44fbd55b542f.png)

右下のSAVEで保存

Overviewに戻り、右下「TEST DRAFT」
![2017-12-21_02h01_39.png](https://qiita-image-store.s3.amazonaws.com/0/64415/72b8dd85-0abc-63a5-9350-aaed0ee4f751.png)

Simulator画面に移動するので試しに接続し、文字を入力してみる→スプレッドシートに記録されるはず
![2017-12-21_02h03_14.png](https://qiita-image-store.s3.amazonaws.com/0/64415/7d533ae3-57e5-61ef-504c-57e9dc8d3ed7.png)


ここまでやればGoogleHomeに同じように話しかければ文字起こしアプリが起動するのでテキトーに話しかければスプレッドシートに記録される

## 感想

1文話す → 「.」の発話(実際には何も言わないが) → ピコン → 1文話す → 「.」 → ピコン...
となり地味にテンポが悪い

とはいえ、まぁまぁな精度で結構長文でも認識されるらしい。
![2017-12-21_01h19_12.png](https://qiita-image-store.s3.amazonaws.com/0/64415/60cf70ec-bee8-3a2e-9e95-10b40eb70e64.png)

↑は1行記録される分の発話後に意識的に少し開けた。どれぐらい長い文章を一気に認識できるかはためしてのお楽しみってことで。

みんなで意見を出し合うようなディスカッションには向かないかもしれないが、一人が発表する場なんかでは使えるかも。