LiMMの溶解記録

脳を溶かすようなゲームを。

音声を文章にしよう[その1]

ゆかりさんになりたい

友人とボイチャしてる時にふと、音声認識して文章にしてボイロに読ませたら、それってもう私がボイロになることなのでは????と思い、なってみることにしました。

どうせやってる人いるだろうなぁと思ったらQiitaにいい感じにまとめられてるかたがいたので、私もやることにしました。

そんな中ちょっと躓くことがあったので記事にします。

私、ゆかりさんになります。

qiita.com

DictationRecognizerを使おう

Qiitaの記事の通り、Unityで実現可能っぽいです。正確にはUnityからWindowsの機能を呼び出しているみたいなので、残念ながらMacはNG。(そしてWinsows10じゃなくてもNG……)

DictationRecognizerを使います。リファレンスを見たら全てわかるので、どうぞ。

docs.unity3d.com

当然の権利のように出るエラー

第一のエラー

まず出たエラーがこれ。

INTERNAL_CALL_Create is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead

なんじゃこりゃ。コンストラクタじゃなくてAwake()かStart()の中で初期化しろ?

その時のコードが以下。

~~~

public class VoiceToText : MonoBehaviour  {

    DictationRecognizer m_recognizer = new DictationRecognizer();

    void Start () {
        m_recognizer.InitialSilenceTimeoutSeconds = 10.0f;

~~~

これの DictationRecognizer m_recognizer = new DictationRecognizer();がいけなかった。

ので、newをStart()に移動。

~~~

public class VoiceToText : MonoBehaviour {

    DictationRecognizer m_recognizer = null;
    void Start () {
        m_recognizer = new DictationRecognizer();
        m_recognizer.InitialSilenceTimeoutSeconds = 10.0f;

~~~

これでOK。

第二のエラー

無事にビルドエラーも取れ実行。しかし即エラー発生。

ERROR: Dictation support is not enabled on this device (see 'Get to know me' in Settings > Privacy > Speech, inking, & typing) [Operation has failed with error 0x80045509: (null)]

このデバイスのDictationのサポートが有効になっていません。は????

これは、音声認識Windows側の機能を使っていて、その機能がオンになっていないといったエラーでした。

音声認識 - UWP app developer | Microsoft Docs

Web サービスの制約を使用するには、[設定] -> [プライバシー] -> [音声認識、手描き入力、入力の設定] で [自分を知ってもらう] オプションをオンにして、[設定] で音声入力とディクテーションのサポートを有効にする必要があります。

なるほどなぁ。

ここでおもむろにDictationRecognizerのリファレンスを見てみましょう。

こんな一文があります。

Dictation recognizer is currently functional only on Windows 10, and requires that dictation is permitted in the user's Speech privacy policy (Settings->Privacy->Speech, inking & typing). If dictation is not enabled, DictationRecognizer will fail on Start. Developers can handle this failure in an app-specific way by providing a DictationError delegate and testing for SPERR_SPEECH_PRIVACY_POLICY_NOT_ACCEPTED (0x80045509).

 ここだけなぜか日本語翻訳されておらずつい見逃してしまったのですが、音声認識の機能をONにしろよ的なことがバッチリ書いてありました。

更に、DictationRecognizerはWindows10しか対応していないとのこと。

以下は、肝心の設定の変更方法です。

f:id:littlemeltmachine:20180708014527j:plain

f:id:littlemeltmachine:20180708014642j:plain

さーてこれでよし。

いざ実行。

とりあえず文章化はOK

ここまでやって、得た文字列をUIのTextにセットするようにします。

そして実行し、ヘッドセットに話しかけると……

f:id:littlemeltmachine:20180708015006j:plain

と、このようにしゃべった内容が表示されるようになりました。

感じた問題は、

  1. 滑舌がカスだとめちゃくちゃな当て字みたいになる
  2. しゃべり終わりを検知して音声認識するので、文章化されるまでタイムラグがある。

といったところ。

どちらもボイロにはつらそうです。というのもめちゃくちゃな漢字にされて誤字が発生してもボイロはそのまま読み上げますし、なんなら漢字の読みが変わったり、話終わらない限り読み上げられないのでチャットには不向きかもです。

でもまぁ、とりあえずは! これでOK。

[その2]では、ボイロとの連携部分をやってみようと思います。

では。