Skip to content

Commit e4b4f79

Browse files
authored
Merge pull request #3 from itedwards/jeff-edits
Audio translations
2 parents 9ac2a97 + f8f312b commit e4b4f79

16 files changed

+402
-111
lines changed

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,33 @@
44
<uses-permission android:name="android.permission.INTERNET"/>
55
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
66

7+
<uses-permission android:name="android.permission.INTERNET" />
8+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
9+
710
<application
811
android:allowBackup="true"
912
android:icon="@mipmap/ic_launcher"
1013
android:label="@string/app_name"
1114
android:roundIcon="@mipmap/ic_launcher_round"
1215
android:supportsRtl="true"
1316
android:theme="@style/AppTheme">
14-
<activity
17+
18+
<activity android:name=".AudioActivity"></activity>
19+
<activity
1520
android:name=".SignInActivity">
1621
<intent-filter>
1722
<action android:name="android.intent.action.MAIN" />
1823

1924
<category android:name="android.intent.category.LAUNCHER" />
2025
</intent-filter>
21-
</activity>
26+
</activity>
2227

2328
<meta-data
2429
android:name="com.google.firebase.ml.vision.DEPENDENCIES"
2530
android:value="ocr" /> <!-- To use multiple models: android:value="ocr,model2,model3" -->
2631
<activity
2732
android:name=".MainActivity"
2833
android:label="@string/app_name">
29-
3034
</activity>
3135
<activity android:name=".CameraActivity"></activity>
3236
</application>
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
package com.example.menumap;
2+
3+
import androidx.annotation.Nullable;
4+
import androidx.appcompat.app.AppCompatActivity;
5+
6+
import android.os.Bundle;
7+
import android.speech.RecognizerIntent;
8+
import android.text.TextUtils;
9+
import android.util.Log;
10+
import android.view.View;
11+
import android.widget.ImageView;
12+
import android.widget.TextView;
13+
import android.content.Intent;
14+
import android.widget.Button;
15+
import android.widget.Toast;
16+
17+
import java.util.ArrayList;
18+
import java.util.Locale;
19+
20+
import androidx.annotation.Nullable;
21+
import androidx.annotation.NonNull;
22+
import androidx.annotation.RequiresApi;
23+
import androidx.appcompat.app.AppCompatActivity;
24+
import com.google.android.gms.tasks.OnFailureListener;
25+
import com.google.android.gms.tasks.OnSuccessListener;
26+
import com.google.android.gms.tasks.Task;
27+
import com.google.firebase.ml.common.modeldownload.FirebaseModelDownloadConditions;
28+
import com.google.firebase.ml.naturallanguage.FirebaseNaturalLanguage;
29+
import com.google.firebase.ml.naturallanguage.languageid.FirebaseLanguageIdentification;
30+
import com.google.firebase.ml.naturallanguage.languageid.FirebaseLanguageIdentificationOptions;
31+
import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslateLanguage;
32+
import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslator;
33+
import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslatorOptions;
34+
import com.google.firebase.ml.vision.FirebaseVision;
35+
import com.google.firebase.ml.vision.common.FirebaseVisionImage;
36+
import com.google.firebase.ml.vision.text.FirebaseVisionText;
37+
import com.google.firebase.ml.vision.text.FirebaseVisionTextRecognizer;
38+
39+
public class AudioActivity extends AppCompatActivity {
40+
41+
private TextView audioResult;
42+
private ImageView buttonSpeak;
43+
private Button backButton;
44+
private String mTranslateText;
45+
private String mResultText;
46+
47+
@Override
48+
protected void onCreate(Bundle savedInstanceState) {
49+
super.onCreate(savedInstanceState);
50+
setContentView(R.layout.activity_audio);
51+
audioResult = findViewById(R.id.audioResult);
52+
buttonSpeak = findViewById(R.id.buttonSpeak);
53+
buttonSpeak.setOnClickListener(new View.OnClickListener() {
54+
@Override
55+
public void onClick(View view) {
56+
getSpeechInput();
57+
}
58+
});
59+
backButton = findViewById(R.id.backButton);
60+
backButton.setOnClickListener(new View.OnClickListener() {
61+
@Override
62+
public void onClick(View view) {
63+
finish();
64+
}
65+
});
66+
}
67+
68+
public void getSpeechInput() {
69+
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
70+
//intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
71+
72+
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh");
73+
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "zh");
74+
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "zh");
75+
intent.putExtra(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES, "zh");
76+
intent.putExtra(RecognizerIntent.EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE,"zh");
77+
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "zh");
78+
intent.putExtra(RecognizerIntent.EXTRA_RESULTS, "zh");
79+
80+
if(intent.resolveActivity(getPackageManager()) != null) {
81+
startActivityForResult(intent, 10);
82+
} else {
83+
Toast.makeText(this, "Your Device Does Not Support Speech Input", Toast.LENGTH_SHORT).show();
84+
}
85+
}
86+
87+
@Override
88+
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
89+
super.onActivityResult(requestCode, resultCode, data);
90+
91+
switch (requestCode) {
92+
case 10:
93+
if(resultCode == RESULT_OK && data != null) {
94+
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
95+
mResultText = TextUtils.join(", ", result);
96+
identifyLanguage(mResultText);
97+
audioResult.setText(mTranslateText);
98+
}
99+
break;
100+
}
101+
}
102+
103+
public void identifyLanguage(String text) {
104+
FirebaseLanguageIdentification languageIdentifier =
105+
FirebaseNaturalLanguage.getInstance().getLanguageIdentification();
106+
languageIdentifier.identifyLanguage(text)
107+
.addOnSuccessListener(
108+
new OnSuccessListener<String>() {
109+
@Override
110+
public void onSuccess(@Nullable String languageCode) {
111+
if (languageCode != "und") {
112+
downloadTranslator(languageCode);
113+
} else {
114+
mTranslateText = "Can't identify language.";
115+
audioResult.setText(mTranslateText);
116+
}
117+
}
118+
})
119+
.addOnFailureListener(
120+
new OnFailureListener() {
121+
@Override
122+
public void onFailure(@NonNull Exception e) {
123+
mTranslateText = "Internal error. Make sure your wifi is connected.";
124+
audioResult.setText(mTranslateText);
125+
}
126+
});
127+
}
128+
129+
public void downloadTranslator(String text) {
130+
int sourceLanguage = 0;
131+
try {
132+
sourceLanguage = FirebaseTranslateLanguage
133+
.languageForLanguageCode(text);
134+
} catch (NullPointerException e) {
135+
e.printStackTrace();
136+
}
137+
FirebaseTranslatorOptions options =
138+
new FirebaseTranslatorOptions.Builder()
139+
.setSourceLanguage(sourceLanguage)
140+
.setTargetLanguage(FirebaseTranslateLanguage.EN)
141+
.build();
142+
final FirebaseTranslator langTranslator =
143+
FirebaseNaturalLanguage.getInstance().getTranslator(options);
144+
145+
FirebaseModelDownloadConditions conditions = new FirebaseModelDownloadConditions.Builder()
146+
.requireWifi()
147+
.build();
148+
langTranslator.downloadModelIfNeeded(conditions)
149+
.addOnSuccessListener(
150+
new OnSuccessListener<Void>() {
151+
@Override
152+
public void onSuccess(Void v) {
153+
Log.d("translator", "downloaded lang model");
154+
155+
translateText(langTranslator);
156+
}
157+
})
158+
.addOnFailureListener(
159+
new OnFailureListener() {
160+
@Override
161+
public void onFailure(@NonNull Exception e) {
162+
mTranslateText = "Download failed.";
163+
audioResult.setText(mTranslateText);
164+
}
165+
});
166+
}
167+
168+
public void translateText(FirebaseTranslator langTranslator) {
169+
170+
langTranslator.translate(mResultText)
171+
.addOnSuccessListener(
172+
new OnSuccessListener<String>() {
173+
@Override
174+
public void onSuccess(@NonNull String translatedText) {
175+
mTranslateText = translatedText;
176+
audioResult.setText(mTranslateText);
177+
178+
}
179+
})
180+
.addOnFailureListener(
181+
new OnFailureListener() {
182+
@Override
183+
public void onFailure(@NonNull Exception e) {
184+
185+
}
186+
});
187+
188+
}
189+
190+
}

app/src/main/java/com/example/menumap/CameraActivity.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.google.firebase.firestore.DocumentReference;
3131
import com.google.firebase.firestore.DocumentSnapshot;
3232
import com.google.firebase.firestore.FirebaseFirestore;
33+
3334
import com.google.firebase.ml.common.modeldownload.FirebaseModelDownloadConditions;
3435
import com.google.firebase.ml.naturallanguage.FirebaseNaturalLanguage;
3536
import com.google.firebase.ml.naturallanguage.languageid.FirebaseLanguageIdentification;
@@ -201,11 +202,9 @@ public void onFailure(@NonNull Exception e) {
201202

202203
@Override
203204
public void onClick(View v) {
204-
205205
if(v == mTranslateBtn) {
206206
mTranslateView.setVisibility(View.VISIBLE);
207207
mTranslateView.setText(mTranslateText);
208-
209208
}
210209
else if(v == mBackBtn) {
211210
finish();

app/src/main/java/com/example/menumap/ui/dashboard/DashboardFragment.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import androidx.lifecycle.Observer;
2525
import androidx.lifecycle.ViewModelProviders;
2626

27+
import com.example.menumap.AudioActivity;
28+
2729
import com.example.menumap.CameraActivity;
2830
import com.example.menumap.MainActivity;
2931
import com.example.menumap.R;
@@ -33,6 +35,7 @@ public class DashboardFragment extends Fragment {
3335

3436

3537
private Button mCameraBtn;
38+
private Button mAudioBtn;
3639

3740

3841
public View onCreateView(@NonNull LayoutInflater inflater,
@@ -49,6 +52,14 @@ public void onClick(View view) {
4952
}
5053
});
5154

55+
mAudioBtn = root.findViewById(R.id.audioBtn);
56+
mAudioBtn.setOnClickListener(new View.OnClickListener() {
57+
@Override
58+
public void onClick(View view) {
59+
Intent intent = new Intent(getActivity(), AudioActivity.class);
60+
startActivity(intent);
61+
}
62+
});
5263

5364
return root;
5465
}

app/src/main/java/com/example/menumap/ui/notifications/NotificationsFragment.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public View onCreateView(@NonNull LayoutInflater inflater,
3838
notificationsViewModel =
3939
ViewModelProviders.of(this).get(NotificationsViewModel.class);
4040
View root = inflater.inflate(R.layout.fragment_notifications, container, false);
41+
4142
DashboardFragment cameraFragment = (DashboardFragment) getFragmentManager().findFragmentById(R.id.navigation_dashboard);
4243
Spinner language_spinner = (Spinner) root.findViewById(R.id.language_spinner);
4344
Spinner targetSpinner = (Spinner) root.findViewById(R.id.targetSpinner);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24.0"
5+
android:viewportHeight="24.0">
6+
<path
7+
android:fillColor="#FF000000"
8+
android:pathData="M10,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h5v2h2L12,1h-2v2zM10,18L5,18l5,-6v6zM19,3h-5v2h5v13l-5,-6v9h5c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2z"/>
9+
</vector>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24.0"
5+
android:viewportHeight="24.0">
6+
<path
7+
android:fillColor="#FF000000"
8+
android:pathData="M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zM17.3,11c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z"/>
9+
</vector>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
tools:context=".AudioActivity"
8+
android:orientation="vertical">
9+
10+
<TextView
11+
android:id="@+id/audioResult"
12+
android:layout_width="wrap_content"
13+
android:layout_height="wrap_content"
14+
android:layout_marginTop="100dp"
15+
android:layout_marginBottom="200dp"
16+
android:textStyle="normal"
17+
android:textColor="#000"
18+
android:textSize="26sp" />
19+
20+
<ImageView
21+
android:id="@+id/buttonSpeak"
22+
android:layout_width="100dp"
23+
android:layout_height="100dp"
24+
android:layout_marginBottom="60dp"
25+
android:layout_gravity="center"
26+
android:src="@drawable/ic_mic_black_24dp" />
27+
28+
<Button
29+
android:id="@+id/backButton"
30+
android:layout_width="80dp"
31+
android:layout_height="50dp"
32+
android:text="Back"
33+
android:layout_marginLeft="20dp"
34+
android:layout_marginTop="30dp"
35+
/>
36+
37+
</LinearLayout>

0 commit comments

Comments
 (0)