Уведомления

Группа в Telegram: @pythonsu

#1 Март 26, 2020 08:21:43

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Помогите сделать в kivy голосовой ввод (stt) для андроид (использую pyjnius) [решено]

Помогите сделать в kivy голосовой ввод (stt) использую pyjnius пытаюсь из этого кода сделать что то рабочие на python

https://www.viralpatel.net/android-speech-to-text-api/

 package net.viralpatel.android.speechtotextdemo; // имя пакета
import java.util.ArrayList;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.Menu;// не нужно
import android.view.View;
import android.widget.ImageButton;// не нужно
import android.widget.TextView;// не нужно
import android.widget.Toast;
public class MainActivity extends Activity {
	protected static final int RESULT_SPEECH = 1;
	private ImageButton btnSpeak;
	private TextView txtText;
	// не нужно создают gui
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		txtText = (TextView) findViewById(R.id.txtText);
		btnSpeak = (ImageButton) findViewById(R.id.btnSpeak);
		// а вот здесь вешают событие на клик кнопки
		btnSpeak.setOnClickListener(new View.OnClickListener() {
			// само событие
			@Override
			public void onClick(View v) {
				// намериние вызова голосового ввода (объект)
				Intent intent = new Intent(
						RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
				// выбирают язык
				intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");
				/* непонятный вызов startActivityForResult (откуда?)
					* а главное куда результат сгружает 
					* ммм ага отправлят обратно callback
					*  ... бладж это 2012*/
				try {
					startActivityForResult(intent, RESULT_SPEECH);
					txtText.setText("");
					 // сообщение об исключении
				} catch (ActivityNotFoundException a) { 
					Toast t = Toast.makeText(getApplicationContext(),
							"Opps! Your device doesn't support Speech to Text",
							Toast.LENGTH_SHORT);
					t.show();
				}
			}
		});
	}
	@Override //не нужно
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}
	@Override // ага этим парсим результат (переопределение)
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		switch (requestCode) {
		case RESULT_SPEECH: {
			if (resultCode == RESULT_OK && null != data) {
				ArrayList<String> text = data
						.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
				txtText.setText(text.get(0));
			}
			break;
		}
		}
	}

и этого тоже https://www.androidhive.info/2014/07/android-speech-to-text-tutorial/

 MainActivity.java
package info.androidhive.speechtotext;
 
import java.util.ArrayList;/
import java.util.Locale;
 
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;/
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.Menu;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
    private TextView txtSpeechInput;
    private ImageButton btnSpeak;
    private final int REQ_CODE_SPEECH_INPUT = 100;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        txtSpeechInput = (TextView) findViewById(R.id.txtSpeechInput);
        btnSpeak = (ImageButton) findViewById(R.id.btnSpeak);
 
        // hide the action bar
        getActionBar().hide();
 
        btnSpeak.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                promptSpeechInput();
            }
        });
 
    }
 
    /**
     * Showing google speech input dialog
     * */
    private void promptSpeechInput() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        /*  python_act = autoclass('org.kivy.android.PythonActivity')
			mActivity = python_act.mActivity
			REQ_CODE_SPEECH_INPUT = 100
			Intent = autoclass('android.content.Intent')
			RecognizerIntent = autoclass('android.speech.RecognizerIntent')
			Locale = autoclass('java.util.Locale')
			* 
			intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
			intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
			intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
			intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault())
			intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "test")
			* 
			startActivityForResult(intent, REQ_CODE_SPEECH_INPUT)
			* 
        */
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
        / не нужно это собщение для польхователя
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                getString(R.string.speech_prompt));
        try {
            startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
        } catch (ActivityNotFoundException a) {
            Toast.makeText(getApplicationContext(),
                    getString(R.string.speech_not_supported),
                    Toast.LENGTH_SHORT).show();
        }
    }
 
    /**
     * Receiving speech input
     * */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 
        switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {
 
                ArrayList<String> result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                txtSpeechInput.setText(result.get(0));
            }
            break;
        }
 
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}

получилось как то так

 from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.clock import Clock
from kivy.core.window import Window
from kivy.config import Config
from kivy.utils import platform
from jnius import autoclass
Builder.load_file("TEdt.kv")
Window.softinput_mode = ''
class TextEdit(Screen):
'''
тут не связанный с проблемой код
'''
    def test2(self, instance):
        '''
        пытаюсь запустить stt 
        '''
        try:
            #REQ_CODE_SPEECH_INPUT = 100
            python_act = autoclass('org.kivy.android.PythonActivity')
            mActivity = python_act.mActivity
            #*
            REQ_CODE_SPEECH_INPUT = 100
            Intent = autoclass('android.content.Intent')
            RecognizerIntent = autoclass(
                'android.speech.RecognizerIntent')
            Locale = autoclass('java.util.Locale')
            #* 
            intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
            intent.putExtra(
                RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
            # надо как то с локалями разобраться
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
                            "en-EN")
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "test")
            result = mActivity.startActivityForResult(intent,REQ_CODE_SPEECH_INPUT).getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)
            self.ids.txt.text = \
                f"{str(mActivity.__dict__)} {str(dir(mActivity))} {result}"
            #*# что здесь за 3 параметра
            #Activity = autoclass('android.app.Activity')
            #mActivity.onActivityResult(mActivity.requestCode,
                                       #mActivity.resultCode,
                                       #mActivity.data) 
            
        except Exception as err:
            self.ids.txt.text = f"test2 {err}"




в итоге удалось добиться вызова интерфейса андроида для голосового ввода (он типа даже работает) но не понятно как вернуть … хм … получить обратно текст

зы извиняюсь код не причесан и визуально замусорен сохранены мои заметки

upd:
на скольно понимаю мне нужно extends Activity для эээ mActivity

upd:
решено вместо pyjnius использовать plyer (pyjnius тоже можно но у меня не получилось .. жаль)



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Март 28, 2020 10:55:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version