📊 Google TTS服务一览

服务名称 产品定位 核心特点 免费额度 (每月) 适用场景
Google Cloud Text-to-Speech API 企业级、标准化的云端API服务 支持120+种语言,提供220多种声音,包含高保真WaveNet语音,支持SSML精细控制。 500万字符 商业应用开发、智能客服、有声内容生成、无障碍辅助等。
Gemini TTS 2.5 预览版 前沿、实验性的AI语音模型 可用自然语言指令描述口音和风格(如“中文腔调的英语”),支持上下文自适应节奏和情绪表达。 可免费测试(预览阶段) 探索创意语音合成、个性化语音助手、教育内容创作。
Vertex AI (Chirp 3 模型) 企业级AI平台内的多功能模型 特色是Instant Custom Voice功能,仅需10秒音频即可创建专属语音角色。 按用量计费 创建品牌专属声音、定制化语音内容。
Android系统内置TTS 移动设备本地语音引擎 免费,无需网络,依赖设备预装引擎,语音质量和可选语言有限。 完全免费 Android应用基础朗读、无障碍功能。

🤔 如何选择适合的服务?

  • 如果你是开发者或企业用户,寻求稳定、高质量的语音合成
    首选 Google Cloud Text-to-Speech API。这是最成熟、功能最全面的服务,拥有巨大的免费试用额度(每月500万字符),适合从原型开发到规模化应用。你可以通过简单的API调用,获得接近真人音质的声音。

  • 如果你追求最新的AI语音能力,想尝试用指令生成不同风格的语音
    可以关注 Gemini TTS 2.5 预览版。它目前处于免费测试阶段,适合研究或探索前沿应用。请注意它尚未正式商用,功能可能变动。

  • 如果你想为你的品牌或应用创建一个独一无二的声音
    Vertex AI 中的 Chirp 3 模型的“Instant Custom Voice”功能非常合适。它能用极短的音频样本快速克隆出专属语音,适合打造有辨识度的品牌语音助手或客服。

  • 如果你只需要在Android应用里实现基本的文本朗读功能
    直接利用 Android系统内置的TTS引擎即可。这无需付费,也无需处理云端API调用,是最简单快捷的方案。


    测试代码:

     

    工程名:SimpleVoiceAssistant
    功能:点击按钮说话 -> 应用识别并显示文字 -> 应用将文字用语音读出来。

    1. 配置与权限 (app/src/main/AndroidManifest.xml)

    在 <application> 标签外添加以下权限:

    xml

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- RECORD_AUDIO 是语音识别的关键权限 -->

    2. 界面布局 (app/src/main/res/layout/activity_main.xml)

    创建一个包含按钮、状态文本和识别结果显示的简单界面:

    xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="20dp"
        android:gravity="center">
    
        <TextView
            android:id="@+id/tvStatus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点击下方按钮开始说话"
            android:textSize="16sp"
            android:layout_marginBottom="20dp"/>
    
        <Button
            android:id="@+id/btnSpeak"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="🎤 按住说话"
            android:textSize="18sp"/>
    
        <TextView
            android:id="@+id/tvResult"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:text="识别结果将显示在这里..."
            android:textSize="18sp"
            android:gravity="center"
            android:textStyle="bold"/>
    
    </LinearLayout>

    3. 核心逻辑代码 (app/src/main/java/com/example/simplevoiceassistant/MainActivity.java)

    这是工程的核心,整合了语音识别和TTS:

    java

    package com.example.simplevoiceassistant;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.speech.RecognizerIntent;
    import android.speech.tts.TextToSpeech;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.util.ArrayList;
    import java.util.Locale;
    
    public class MainActivity extends AppCompatActivity {
        private static final String TAG = "VoiceAssistant";
        private static final int REQUEST_RECORD_AUDIO_PERMISSION = 100;
        private static final int REQUEST_SPEECH_RECOGNITION = 200;
    
        // 核心组件
        private TextToSpeech ttsEngine;
        private Button btnSpeak;
        private TextView tvStatus, tvResult;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 1. 初始化UI组件
            btnSpeak = findViewById(R.id.btnSpeak);
            tvStatus = findViewById(R.id.tvStatus);
            tvResult = findViewById(R.id.tvResult);
    
            // 2. 初始化TTS引擎(说)
            initTTS();
    
            // 3. 检查并请求录音权限
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO)
                    != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this,
                        new String[]{android.Manifest.permission.RECORD_AUDIO},
                        REQUEST_RECORD_AUDIO_PERMISSION);
            }
    
            // 4. 设置按钮的触摸监听器:按住说话,松开识别
            btnSpeak.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            // 按下时开始录音
                            startSpeechRecognition();
                            tvStatus.setText("正在聆听...");
                            break;
                        case MotionEvent.ACTION_UP:
                            // 松开时停止
                            tvStatus.setText("识别中...");
                            break;
                    }
                    return true;
                }
            });
        }
    
        /**
         * 初始化TTS引擎
         */
        private void initTTS() {
            ttsEngine = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
                @Override
                public void onInit(int status) {
                    if (status == TextToSpeech.SUCCESS) {
                        // 设置语言(这里用中文)
                        int result = ttsEngine.setLanguage(Locale.CHINESE);
                        if (result == TextToSpeech.LANG_MISSING_DATA ||
                            result == TextToSpeech.LANG_NOT_SUPPORTED) {
                            Log.e(TAG, "中文语言包不支持,将尝试使用英语");
                            ttsEngine.setLanguage(Locale.US);
                        }
                        Log.d(TAG, "TTS初始化成功");
                    } else {
                        Log.e(TAG, "TTS初始化失败");
                    }
                }
            });
            // 设置语速和音调(可选)
            ttsEngine.setSpeechRate(1.0f);
            ttsEngine.setPitch(1.0f);
        }
    
        /**
         * 启动系统语音识别Activity
         */
        private void startSpeechRecognition() {
            // 检查设备是否支持语音识别
            if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
                Toast.makeText(this, "该设备不支持麦克风!", Toast.LENGTH_SHORT).show();
                return;
            }
            // 创建语音识别Intent
            Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                    RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.CHINESE.toString());
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "请开始说话...");
            // 启动系统语音识别Activity
            try {
                startActivityForResult(intent, REQUEST_SPEECH_RECOGNITION);
            } catch (Exception e) {
                Toast.makeText(this, "语音识别服务出错: " + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    
        /**
         * 接收语音识别结果
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == REQUEST_SPEECH_RECOGNITION) {
                if (resultCode == RESULT_OK && data != null) {
                    // 获取识别结果列表(可能有多个候选)
                    ArrayList<String> results =
                            data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                    if (results != null && !results.isEmpty()) {
                        String spokenText = results.get(0); // 取置信度最高的结果
                        tvResult.setText(spokenText);
                        tvStatus.setText("识别成功!");
                        // 调用TTS将识别出的文字读出来
                        speakOut(spokenText);
                    }
                } else {
                    tvStatus.setText("识别取消或失败");
                }
            }
        }
    
        /**
         * 使用TTS朗读文本
         */
        private void speakOut(String text) {
            if (ttsEngine != null) {
                // 清空当前语音队列并播放新内容
                ttsEngine.speak(text, TextToSpeech.QUEUE_FLUSH, null, "utteranceId");
            }
        }
    
        /**
         * 释放TTS资源,防止内存泄漏
         */
        @Override
        protected void onDestroy() {
            if (ttsEngine != null) {
                ttsEngine.stop();
                ttsEngine.shutdown();
            }
            super.onDestroy();
        }
    }
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐