實現語音轉換成文字

在Android開發中,實現語音轉換成文字(Speech-to-Text, STT)通常依賴于Google提供的SpeechRecognizer類,它是Android Speech Recognition API的一部分。以下是一個簡單的示例代碼,展示了如何在Android應用中實現語音轉換成文字的功能。

首先,你需要在你的AndroidManifest.xml文件中添加必要的權限,以便應用能夠訪問麥克風:

<uses-permission android:name="android.permission.RECORD_AUDIO" />

然后,你可以在你的Activity中實現語音轉換功能。以下是一個基本的示例:

import android.Manifest;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.os.Bundle;

import android.speech.RecognizerIntent;

import android.speech.SpeechRecognizer;

import android.speech.TtsUtils;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

import androidx.annotation.NonNull;

import androidx.appcompat.app.AppCompatActivity;

import androidx.core.app.ActivityCompat;

import androidx.core.content.ContextCompat;

import java.util.ArrayList;

import java.util.List;

public class SpeechToTextActivity extends AppCompatActivity {

? ? private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;

? ? private static final int REQUEST_CODE_SPEECH_INPUT = 100;

? ? private TextView textViewResult;

? ? private SpeechRecognizer speechRecognizer;

? ? private Intent recognizerIntent;

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_speech_to_text);

? ? ? ? textViewResult = findViewById(R.id.textViewResult);

? ? ? ? Button buttonSpeak = findViewById(R.id.buttonSpeak);

? ? ? ? // 初始化SpeechRecognizer和Intent

? ? ? ? speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);

? ? ? ? recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

? ? ? ? recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

? ? ? ? recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US");

? ? ? ? // 設置按鈕點擊事件監聽器

? ? ? ? buttonSpeak.setOnClickListener(new View.OnClickListener() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void onClick(View v) {

? ? ? ? ? ? ? ? askForAudioPermissionAndStartRecognition();

? ? ? ? ? ? }

? ? ? ? });

? ? }

? ? private void askForAudioPermissionAndStartRecognition() {

? ? ? ? // 檢查錄音權限

? ? ? ? if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {

? ? ? ? ? ? ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_RECORD_AUDIO_PERMISSION);

? ? ? ? } else {

? ? ? ? ? ? startSpeechRecognition();

? ? ? ? }

? ? }

? ? private void startSpeechRecognition() {

? ? ? ? speechRecognizer.startListening(recognizerIntent);

? ? }

? ? // 處理權限請求結果

? ? @Override

? ? public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

? ? ? ? super.onRequestPermissionsResult(requestCode, permissions, grantResults);

? ? ? ? if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {

? ? ? ? ? ? if (grantResults.length > 0 && grantResults == PackageManager.PERMISSION_GRANTED) {

? ? ? ? ? ? ? ? startSpeechRecognition();

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? // 處理語音識別結果

? ? @Override

? ? protected void onActivityResult(int requestCode, int resultCode, @NonNull Intent data) {

? ? ? ? super.onActivityResult(requestCode, resultCode, data);

? ? ? ? if (requestCode == REQUEST_CODE_SPEECH_INPUT && resultCode == RESULT_OK && data != null) {

? ? ? ? ? ? List<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

? ? ? ? ? ? if (result != null && !result.isEmpty()) {

? ? ? ? ? ? ? ? textViewResult.setText(result.get(0));

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? textViewResult.setText("No speech recognized");

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? @Override

? ? protected void onDestroy() {

? ? ? ? super.onDestroy();

? ? ? ? if (speechRecognizer != null) {

? ? ? ? ? ? speechRecognizer.destroy();

? ? ? ? }

? ? }

}

在這個示例中,我們創建了一個簡單的Activity,其中包含一個按鈕和一個TextView來顯示識別結果。當用戶點擊按鈕時,應用會檢查錄音權限,如果權限已授予,則開始語音識別。識別結果會通過onActivityResult方法返回,并顯示在TextView中。

請確保你的布局文件activity_speech_to_text.xml包含了一個TextView和一個Button,它們的ID分別是textViewResult和buttonSpeak。

此外,由于語音識別功能依賴于設備的麥克風,因此在實際應用中,你還需要處理用戶可能拒絕授予錄音權限的情況,并適當地向用戶解釋為什么需要這個權限。

這個示例使用了英語(美國)作為識別語言。如果你想要支持其他語言,可以修改recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US");這行代碼中的語言代碼。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容