安卓文字转语音——其实可以很简单——TextToSpeech用法解析

前言

很多时候我们会碰到文字转语音的需求,使用第三方sdk是个不错的选择,其实也可以更简单,安卓原生就提供了一个类处理这个事务。TextToSpeech无需集成,直接使用

局限

支持22种语言,不过中文支持并不很好,,emmmmmmm

系统要求为API 4 以上(android 1.6)不过现在应该不算问题了。

使用

直接转载了一个最简单的用法介绍原文

public class MainActivity extends AppCompatActivity  implements View.OnClickListener, TextToSpeech.OnInitListener {
    private Button speechBtn; // 按钮控制开始朗读
    private EditText speechTxt; // 需要朗读的内容
    private TextToSpeech textToSpeech; // TTS对象
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        speechBtn = (Button) findViewById(R.id.btn_read);
        speechBtn.setOnClickListener(this);
        speechTxt = (EditText) findViewById(R.id.editText);
        textToSpeech = new TextToSpeech(this, this); // 参数Context,TextToSpeech.OnInitListener
    }
    /**
     * 用来初始化TextToSpeech引擎
     * status:SUCCESS或ERROR这2个值
     * setLanguage设置语言,帮助文档里面写了有22种
     * TextToSpeech.LANG_MISSING_DATA:表示语言的数据丢失。
     * TextToSpeech.LANG_NOT_SUPPORTED:不支持
     */
    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            int result = textToSpeech.setLanguage(Locale.CHINA);
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Toast.makeText(this, "数据丢失或不支持", Toast.LENGTH_SHORT).show();
            }
        }
    }
    @Override
    public void onClick(View v) {
        if (textToSpeech != null && !textToSpeech.isSpeaking()) {
          // 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
            textToSpeech.setPitch(0.5f);
          //设定语速 ,默认1.0正常语速
           textToSpeech.setSpeechRate(1.5f);
          //朗读,注意这里三个参数的added in API level 4   四个参数的added in API level 21
            textToSpeech.speak(speechTxt.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        textToSpeech.stop(); // 不管是否正在朗读TTS都被打断
        textToSpeech.shutdown(); // 关闭,释放资源
    }
}

源码&原理

暂略,会用就好!

真想看 ???

官方TextToSpeech介绍,点击查看(需要翻墙!!!)

不会翻墙???

谷歌中国 点击进入,不过api搜索功能经常失效 axb

,不过顺便提一句,翻墙都不会,你真的该补补课了!

tts1tts2

一个TextToSpeech实例只能用于合成文本一旦完成初始化。实施texttospeech.oninitlistener被通知的初始化完成。当你使用完TextToSpeech实例,调用shutdown()方法释放的TextToSpeech发动机用本土资源。

更多介绍自己看API吧,就不獒述了!

ps

如果我的帖子对你有帮助,请不要吝啬点个赞哦!

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果不使用 `SpeechRecognition` 库,可以使用Python自带的 `pyaudio` 库录制音频,再使用百度或讯飞等语音识别API进行语音转换。以下是示例代码: ```python import wave import urllib.request import urllib.parse import json import base64 import hashlib import time import hmac import random # 配置百度AI开放平台的API信息 APP_ID = 'your_app_id' API_KEY = 'your_api_key' SECRET_KEY = 'your_secret_key' # 获取当前时间戳 def get_cur_time(): return int(time.time()) # 获取随机数 def get_random(): return random.randint(0, 100000000) # 将音频文件转换成Base64编码的字符串 def get_file_content(file_path): with open(file_path, 'rb') as f: return base64.b64encode(f.read()).decode('utf-8') # 计算签名 def get_sign(params): sign_str = '' for k in sorted(params.keys()): sign_str += '{}={}'.format(k, params[k]) sign_str += SECRET_KEY sign = hmac.new(sign_str.encode('utf-8'), digestmod=hashlib.sha256).hexdigest() return sign # 调用百度语音识别API进行语音转换 def baidu_asr(file_path): # 配置请求参数 url = 'http://vop.baidu.com/server_api' headers = { 'Content-Type': 'application/json' } audio = get_file_content(file_path) params = { 'dev_pid': '1536', # 普通话(支持简单的英文识别) 'format': 'wav', 'rate': '16000', 'channel': 1, 'cuid': 'python_asr', 'len': len(audio), 'speech': audio, 'token': '', 'mac': '', 'timestamp': get_cur_time(), 'nonce': get_random() } params['sign'] = get_sign(params) data = json.dumps(params).encode('utf-8') # 发送请求 req = urllib.request.Request(url, data=data, headers=headers) resp = urllib.request.urlopen(req) result = json.loads(resp.read().decode('utf-8')) # 解析结果 if result.get('err_no') == 0: text = result.get('result')[0] print('识别结果:{}'.format(text)) else: print('识别失败:{}'.format(result.get('err_msg'))) # 录制音频并保存为WAV格式文件 def record_audio(file_path, seconds): CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 p = pyaudio.PyAudio() frames = [] stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print('*' * 10, '开始录音', '*' * 10) for i in range(0, int(RATE / CHUNK * seconds)): data = stream.read(CHUNK) frames.append(data) print('*' * 10, '结束录音', '*' * 10) stream.stop_stream() stream.close() p.terminate() wf = wave.open(file_path, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close() # 测试 if __name__ == '__main__': file_path = 'test.wav' record_audio(file_path, 5) baidu_asr(file_path) ``` 以上代码调用了百度语音识别API进行语音转换,需要先在百度AI开放平台注册账号,并创建语音识别应用。请将代码中的 `your_app_id`、`your_api_key`、`your_secret_key` 替换成自己的应用信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值