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 тоже можно но у меня не получилось .. жаль)