问题描述
我已经在这个主题上进行了很多搜索,查找了Jython和Chaquopy之类的选项,但是无论我做什么,总是有错误。
我想要做的是,当单击我的Android应用上的按钮时,python脚本(使用python中的gTTS API进行语音识别)将运行。
这是我的代码(使用Chaquopy)的样子:
MainActivity.java:
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageButton;
import android.content.res.AssetFileDescriptor;
import com.chaquo.python.*;
import com.chaquo.python.android.Androidplatform;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements View.OnTouchListener{
ImageButton AutoCruiseButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!Python.isstarted()) {
Python.start(new Androidplatform(this));
}
AutoCruiseButton = (ImageButton) findViewById(R.id.auto);
AutoCruiseButton.setonTouchListener(this);
final MediaPlayer beep1 = MediaPlayer.create(this,R.raw.beep1);
final MediaPlayer mp = new MediaPlayer();
AutoCruiseButton.setonClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
stopAndplay(R.raw.beep1,mp);
Python python = Python.getInstance();
PyObject file = python.getModule("voice_recognition");
PyObject command = file.callAttr("myCommand");
}
});
顶级构建文件:build.gradle
buildscript {
repositories {
google()
jcenter()
maven { url "https://chaquo.com/maven" }
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.2'
classpath "com.chaquo.python:gradle:8.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
build.gradle(:app):
apply plugin: 'com.android.application'
apply plugin: 'com.chaquo.python'
android {
compileSdkVersion 29
buildToolsversion "29.0.3"
defaultConfig {
applicationId "com.example.myapplication"
sourceSets{
main{
python{
srcDirs = ["src/main/python"]
}
}
}
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
abiFilters "armeabi-v7a","x86"
}
python {
buildPython "C:/Users/Alya/AppData/Local/Microsoft/WindowsApps/python3"
buildPython "python3"
}
ndk {
abiFilters "armeabi-v7a","x86"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}
}
compileOptions {
targetCompatibility = 1.8
sourceCompatibility = 1.8
}
}
dependencies {
implementation filetree(dir: 'libs',include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
voice_recognition.py(位于Android Studio项目主文件夹下的python文件夹中):
from gtts import gTTS
import speech_recognition as sr
import playsound
import sys
counter = 0
def myCommand():
r = sr.Recognizer()
global counter
if counter == 0:
playsound.playsound('C:/Users/Alya/Desktop/KITT/Audio_Clips/What_Can_I_Do.mp3')
with sr.Microphone() as source:
counter += 1
print('I am ready for your next command')
r.pause_threshold = 1
r.adjust_for_ambient_noise(source,duration=1)
audio = r.listen(source)
try:
command = r.recognize_google(audio)
print('You said ' + command + '\n')
#loop back in case not understood
except sr.UnkNownValueError:
print("I didn't hear that")
command = ""
playsound.playsound('C:/Users/Alya/Desktop/KITT/Audio_Clips/Go_Ahead.mp3')
assistant(myCommand())
return command
#if statements for executing commands
def assistant(command):
if 'introduce yourself' in command:
playsound.playsound('C:/Users/Alya/Desktop/KITT/Audio_Clips/KITT_Intro.mp3')
我知道Chaquopy可以工作,因为我测试了基本的python文件,并且模拟器没有崩溃。这是我单击按钮运行python脚本时遇到的错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication,PID: 26779
com.chaquo.python.PyException: ModuleNotFoundError: No module named 'gtts'
at <python>.java.chaquopy.import_override(import.pxi:20)
at <python>.java.chaquopy.import_override(import.pxi:60)
at <python>.voice_recognition.<module>(voice_recognition.py:1)
at <python>.importlib._bootstrap._call_with_frames_removed(<frozen importlib._bootstrap>:219)
at <python>.importlib._bootstrap_external.exec_module(<frozen importlib._bootstrap_external>:783)
at <python>.java.android.importer.exec_module(importer.py:521)
at <python>.importlib._bootstrap._load_unlocked(<frozen importlib._bootstrap>:671)
at <python>.importlib._bootstrap._find_and_load_unlocked(<frozen importlib._bootstrap>:975)
at <python>.importlib._bootstrap._find_and_load(<frozen importlib._bootstrap>:991)
at <python>.importlib._bootstrap._gcd_import(<frozen importlib._bootstrap>:1014)
at <python>.importlib.import_module(__init__.py:127)
at <python>.chaquopy_java.Java_com_chaquo_python_Python_getModule(chaquopy_java.pyx:154)
at com.chaquo.python.Python.getModule(Native Method)
at com.example.myapplication.MainActivity$9.onClick(MainActivity.java:125)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I/Process: Sending signal. PID: 26779 SIG: 9
关于如何进行的任何建议?我真的宁愿将我的Android应用程序保留在Java中,因为该接口已经实现。如何修复我的代码,使其与Chaquopy兼容?或者,如果它是更好的选择,我将如何在Jython中做到呢?