Android Speech - 开源语音识别库完整指南
Android Speech 是一个由 gotev 开发的开源库,它极大地简化了在 Android 应用中集成 Google 语音识别和文本转语音服务的过程。通过提供简洁易用的 API,开发者可以轻松实现语音到文本和文本到语音的功能,无需深入研究复杂的系统调用。
项目快速启动
环境要求
- Android Studio 开发环境
- 最低支持 SDK 版本:Android 4.0+ (API 14)
- 需要麦克风权限和网络连接
添加依赖
在项目的 build.gradle (Module) 文件中添加以下依赖项:
dependencies {
implementation 'net.gotev:speech:1.6.0' // 使用最新版本
}
然后同步 Gradle 项目。
基础初始化
在 Activity 中初始化语音库:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化语音库
Speech.init(this, getPackageName());
}
@Override
protected void onDestroy() {
// 防止内存泄漏
Speech.getInstance().shutdown();
super.onDestroy();
}
}
核心功能实现
语音识别功能
try {
// 确保已获取麦克风权限
Speech.getInstance().startListening(new SpeechDelegate() {
@Override
public void onStartOfSpeech() {
Log.i("speech", "语音识别已激活");
}
@Override
public void onSpeechRmsChanged(float value) {
Log.d("speech", "当前音量级别: " + value + "dB");
}
@Override
public void onSpeechPartialResults(List<String> results) {
StringBuilder partialResult = new StringBuilder();
for (String res : results) {
partialResult.append(res).append(" ");
}
Log.i("speech", "部分识别结果: " + partialResult.toString().trim());
}
@Override
public void onSpeechResult(String result) {
Log.i("speech", "最终识别结果: " + result);
// 处理识别结果
}
});
} catch (SpeechRecognitionNotAvailable exc) {
// 设备不支持语音识别
Log.e("speech", "此设备不支持语音识别!");
} catch (GoogleVoiceTypingDisabledException exc) {
// Google 语音输入未启用
Log.e("speech", "请启用 Google 语音输入!");
}
文本转语音功能
// 简单文本转语音
Speech.getInstance().say("您好,这是一个测试语音");
// 带回调的文本转语音
Speech.getInstance().say("正在处理您的请求", new TextToSpeechCallback() {
@Override
public void onStart() {
Log.i("speech", "语音合成开始");
}
@Override
public void onCompleted() {
Log.i("speech", "语音合成完成");
}
@Override
public void onError() {
Log.i("speech", "语音合成出错");
}
});
高级功能配置
语音进度动画显示
在布局文件中添加进度视图:
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/linearLayout">
<net.gotev.speech.ui.SpeechProgressView
android:id="@+id/progress"
android:layout_width="120dp"
android:layout_height="150dp"/>
</LinearLayout>
在代码中使用进度动画:
// 自定义进度条颜色
int[] colors = {
ContextCompat.getColor(this, android.R.color.black),
ContextCompat.getColor(this, android.R.color.darker_gray),
ContextCompat.getColor(this, android.R.color.black),
ContextCompat.getColor(this, android.R.color.holo_orange_dark),
ContextCompat.getColor(this, android.R.color.holo_red_dark)
};
speechProgressView.setColors(colors);
// 自定义进度条高度
int[] heights = {60, 76, 58, 80, 55};
speechProgressView.setBarMaxHeightsInDp(heights);
// 启动带进度动画的语音识别
Speech.getInstance().startListening(speechProgressView, speechDelegate);
多语言支持
// 获取支持的语音识别语言
Speech.getInstance().getSupportedSpeechToTextLanguages(new SupportedLanguagesListener() {
@Override
public void onSupportedLanguages(List<String> supportedLanguages) {
// 处理支持的语言列表
for (String language : supportedLanguages) {
Log.d("speech", "支持的语言: " + language);
}
}
@Override
public void onNotSupported(UnsupportedReason reason) {
// 处理不支持的情况
}
});
// 设置语音识别语言
Locale chineseLocale = new Locale("zh", "CN");
Speech.getInstance().setLocale(chineseLocale);
// 获取支持的文本转语音声音
List<Voice> supportedVoices = Speech.getInstance().getSupportedTextToSpeechVoices();
// 设置文本转语音声音
if (!supportedVoices.isEmpty()) {
Speech.getInstance().setVoice(supportedVoices.get(0));
}
权限处理
在 AndroidManifest.xml 中添加必要权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
运行时权限请求:
private static final int PERMISSIONS_REQUEST = 1;
private void requestMicrophonePermission() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECORD_AUDIO},
PERMISSIONS_REQUEST);
} else {
// 权限已授予,开始语音识别
startSpeechRecognition();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startSpeechRecognition();
} else {
Toast.makeText(this, "需要麦克风权限才能使用语音功能", Toast.LENGTH_LONG).show();
}
}
}
错误处理与调试
启用调试日志
// 启用详细日志
Logger.setLogLevel(LogLevel.DEBUG);
// 自定义日志输出
Logger.setLoggerDelegate(new Logger.LoggerDelegate() {
@Override
public void error(String tag, String message) {
// 自定义错误日志处理
}
@Override
public void error(String tag, String message, Throwable exception) {
// 自定义带异常的错误日志处理
}
@Override
public void debug(String tag, String message) {
// 自定义调试日志处理
}
@Override
public void info(String tag, String message) {
// 自定义信息日志处理
}
});
异常处理
try {
Speech.getInstance().startListening(speechDelegate);
} catch (SpeechRecognitionNotAvailable exc) {
// 提示用户安装 Google App
SpeechUtil.redirectUserToGoogleAppOnPlayStore(this);
} catch (GoogleVoiceTypingDisabledException exc) {
// 提示用户启用 Google 语音输入
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("请启用Google语音输入以使用语音识别功能")
.setPositiveButton("确定", null)
.show();
}
最佳实践建议
-
用户体验优化
- 在开始语音识别前提供明确的视觉反馈
- 处理无网络连接的情况
- 提供取消语音识别的选项
-
性能考虑
- 在 onDestroy 中调用 shutdown() 防止内存泄漏
- 合理管理语音识别会话的生命周期
- 避免在后台长时间运行语音识别
-
隐私保护
- 明确告知用户语音数据的使用方式
- 提供隐私政策说明
- 允许用户随时撤销麦克风权限
应用场景
- 智能助手应用:实现语音命令控制
- 无障碍应用:为视障用户提供语音交互
- 教育应用:语言学习和发音练习
- 车载应用:驾驶时的语音控制功能
- 智能家居:语音控制家居设备
项目示例
项目中包含完整的演示应用,位于 examples/demoapp 目录。演示应用展示了:
- 基本的语音识别功能
- 文本转语音功能
- 多语言支持
- 进度动画显示
- 权限处理
通过这个开源库,开发者可以快速为 Android 应用添加强大的语音交互功能,提升用户体验和应用价值。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




