質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

【Unity/C#】`not all code paths return a value`の対処方法が分からない。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,091

afroscript

score 148

聞きたいこと

下記記載のコードに対してnot all code paths return a valueとのエラーが出ています。
どうやら、「全てのコードが戻り値を返すようになってない」という意味らしいのですが、どこを改善していいか分からず。。。
どなたか対応方法わかりますでしょうか...??

(C#もUnityも初心者で丸投げの質問になってたらすみません...!情報の過不足などあればご指摘ください!)

実現したいこと

UnityとWatsonを使って、「おはよう」と話しかけたら「おはよう」と音声で返してくれるようなものを作ろうとしてます。
スタートから4秒間マイクで集音し、WatsonのSpeachToTextで日本語文字列に変換→「おはよう」の文字列が入っていれば、TextToSeachで「おはよう」と音声で返す、といったものです。

コード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using IBM.Watson.DeveloperCloud.Services.TextToSpeech.v1;
using IBM.Watson.DeveloperCloud.Services.SpeechToText.v1;

public class WatsonConversation : MonoBehaviour {


    [SerializeField]
    SpeechToText m_SpeechToText = new SpeechToText();
    TextToSpeech m_TextToSpeech = new TextToSpeech();
    string m_ResString = "おはよう";

    // Use this for initialization
    IEnumerator Start() {
        var audioSource = GetComponent<AudioSource>();
        RecMic(audioSource);
    }

    IEnumerator RecMic(AudioSource audioSource) {
          // 音声をマイクから4秒間取得
        Debug.Log ("Start record");
        audioSource.clip = Microphone.Start(null, true, 10, 44100);
        audioSource.loop = false;
        audioSource.spatialBlend = 0.0f;
        yield return new WaitForSeconds (4f);
        Microphone.End (null);
        Debug.Log ("Finish record");

        // 音声の認識言語を日本語に指定
        m_SpeechToText.RecognizeModel = "ja-JP_BroadbandModel";
        // 音声をテキストに変換し、関数:HandleOnRecognize()を呼ぶ
        m_SpeechToText.Recognize(audioSource.clip, HandleOnRecognize);

    }

    void HandleOnRecognize(SpeechRecognitionEvent result){
        if (result != null && result.results.Length > 0){
            foreach (var res in result.results){
                foreach (var alt in res.alternatives){
                    string text = alt.transcript;
                    Debug.Log(string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence));

                    //textに"おはよう"があれば、おはようと返すしてしゃべる
                    if (text.Contains("おはよう")) {
                        m_TextToSpeech.Voice = VoiceType.ja_JP_Emi; //音声タイプを指定
                        m_TextToSpeech.ToSpeech(m_ResString, HandleToSpeechCallback);

                    }
                }
            }
        }
    }

    void HandleToSpeechCallback (AudioClip clip) {
        PlayClip(clip);
    }

    private void PlayClip(AudioClip clip) {
        if (Application.isPlaying && clip != null) {
            GameObject audioObject = new GameObject("AudioObject");
            AudioSource source = audioObject.AddComponent<AudioSource>();
            source.spatialBlend = 0.0f;
            source.loop = false;
            source.clip = clip;
            source.Play();

            GameObject.Destroy(audioObject, clip.length);
        }
    }

//    void Update () {
//        
//    }
}

調べたページ

https://www21.atwiki.jp/mizcremorne/pages/315.html#id_c9a4eb10

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Startメソッド、RecMicを呼ぶところでreturnをつけ忘れているように見えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/13 15:10

    ご回答ありがとうございます!!

    ```
    IEnumerator Start() {
    var audioSource = GetComponent<AudioSource>();
    RecMic(audioSource);
    return;
    }
    ```
    ということでしょうか...??

    この場合、
    `error CS0126: An object of a type convertible to `System.Collections.IEnumerator' is required for the return statement`
    とのエラーが出ました。
    return ●●といった形で何か返さなければならない感じですかね...??
    (何を●●に入れて返せばいいか分からず。。。)

    キャンセル

  • 2017/08/13 15:36

    IEnumeratorでstart を回す場合はyield returnで初期化を何度かイテレートしないといけません。
    IEnumerator startについてはunityのドキュメントを参照してみてください。

    キャンセル

  • 2017/08/13 16:53 編集

    @tkow ありがとうございます!

    IEnumerator Start() {
     var audioSource = GetComponent<AudioSource>();
     yield return RecMic(audioSource);
    }
    で無事動きました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる