关于texttospeech的信息

http://www.itjxue.com  2023-01-29 15:03  来源:未知  点击次数: 

语音合成简介 Text-to-speech

这篇博客的主要内容是对语音合成 (text to speech)的背景知识进行介绍。 希望可以让读者通俗易懂的了解语音合成的工作原理, 并对为了理解state-of-the-art text to speech 的算法做基础。

这个简介主要基于这篇论文 “Wavenet: a generative model for raw audio”的附录介绍的。 论文链接如下: , 以及stanford CS224S的课程, 链接如下

语音合成是通过文字人工生成人类声音, 也可以说语音生成是给定一段文字去生成对应的人类读音。 这里声音是一个连续的模拟的信号。而合成过程是通过计算机, 数字信号去模拟。 这里就需要数字信号处理模拟信号信息,详细内容可参考 [1]。

图片1, 就是一个例子用来表示人类声音的信号图。 这里横轴是时间, 纵轴是声音幅度大小。声音有三个重要的指标, 振幅(amplitude) , 周期(period) 和 频率(frequency) 。 振幅指的是波的高低幅度,表示声音的强弱,周期和频率互为倒数的关系, 用来表示两个波之间的时间长度,或者每秒震动的次数。? 而声音合成是根据声波的特点, 用数字的方式去生成类似人声的频率和振幅, 即音频的数字化。了解了音频的数字化,也就知道了我们要生成的目标函数。

音频的数字化主要有三个步骤。

取样(sampling) :在音频数字化的过程,采样是指一个固定的频率对音频信号进行采样, 采样的频率越高, 对应的音频数据的保真度就越好。 当然, 数据量越大,需要的内存也就越大。 如果想完全无损采样, 需要使用Nyquist sampling frequency, 就是原音频的频率2倍。

量化 (quantization) : 采样的信号都要进行量化, 把信号的幅度变成有限的离散数值。比如从0 到 1, 只有 四个量化值可以用0, 0.25, 0.5, 0.75的话, 量化就是选择最近的量化值来表示。

编码 (coding ):编码就是把每个数值用二进制的方式表示, 比如上面的例子, 就可以用2bit 二进制表示, 00, 01, 10, 11。 这样的数值用来保存在计算机上。

采样频率和采样量化级数是数字化声音的两个主要指标,直接影响声音的效果。 对于语音合成也是同样, 生成更高的采样频率和更多多的量化级数(比如16 bit), 会产生更真实的声音。? 通常有三个采样频率标准

1. 44.1kHz 采样, 用于高品质CD 音乐

2. 22.05kHz 采样, 用于语音通话, 中品质音乐

3 . 11.025kHz 采样, 用于低品质声音。

而量化标准一般有8位字长(256阶)低品质量化 和16位字长(65536阶)高品质量化。

还有一个重要参数就是通道(channel), 一次只采样一个声音波形为单通道, 一次采样多个声音波形就是多通道。

所以在语音合成的时候,产生的数据量是 数据量=采样频率* 量化位数*声道数 , 单位是bit/s。 一般声道数都假设为1.。 采样率和量化位数都是语音合成里的重要指标,也就是设计好的神经网络1秒钟必须生成的数据量 。

文本分析就是把文字转成类似音标的东西。 比如下图就是一个文本分析,用来分析 “PGE will file schedules on April 20. ” 文本分析主要有四个步骤, 文字的规范化, 语音分析, 还有韵律分析。 下面一一道来。?

文本分析首先是要确认单词和句子的结束。 空格会被用来当做隔词符. 句子的结束一般用标点符号来确定, 比如问号和感叹号 (?!), 但是句号有的时候要特别处理。 因为有些单词的缩写也包含句号, 比如 str. "My place on Main Str.? is around the corner". 这些特别情况一般都会采取规则(rule)的方式过滤掉。

接下来 是把非文字信息变成对应的文字, 比如句子中里有日期, 电话号码, 或者其他阿拉伯数字和符号。 这里就举个例子, 比如, I was born April 14. 就要变成, I was born April fourteen.? 这个过程其实非常繁琐,现实文字中充满了 缩写,比如CS,? 拼写错误, 网络用语, tmr -- tomorrow. 解决方式还是主要依靠rule based method, 建立各种各样的判断关系来转变。

语音分析就是把每个单词中的发音单词标出来, 比如Fig. 3 中的P, 就对应p和iy, 作为发音。 这个时候也很容易发现,发音的音标和对应的字母 不是一一对应的关系,反而需要音标去对齐 (allignment)。 这个对齐问题很经典, 可以用很多机器学习的方法去解决, 比如Expectation–maximization algorithm.

韵律分析就是英语里的语音语调, 汉语中的抑扬顿挫。 我们还是以英语为例, 韵律分析主要包含了: 重音 (Accent),边界 (boundaries),? 音长 (duration),主频率 (F0).

重音(Accent) 就是指哪个音节发生重一点。 对于一个句子或者一个单词都有重音。 单词的重音一般都会标出来,英语语法里面有学过, 比如banana 这个单词, 第二个音节就是重音。 而对于句子而言,一样有的单词会重音,有的单词会发轻音。 一般有新内容的名词, 动词, 或者形容词会做重音处理。 比如下面的英语句子, surprise 就会被重音了, 而句子的重音点也会落到单词的重音上, 第二个音节rised, 就被重音啦。 英语的重音规则是一套英语语法,读者可以自行百度搜索。

I’m a little sur prised to hear it cha racterized as up beat .

边界 (Boundaries) 就是用来判断声调的边界的。 一般都是一个短语结束后,有个语调的边界。 比如下面的句子, For language, 就有一个边界, 而I 后面也是一个边界.

For language, I , the author of the blog, like Chinese.

音长(Duration) 就是每个音节的发声长度。 这个通俗易懂。 NLP 里可以假定每个音节单词长度相同都是 100ms, 或者根据英语语法, 动词, 形容词之类的去确定。 也可以通过大量的数据集去寻找规律。

主频率 (F0 )就是声音的主频率。? 应该说做傅里叶转换后, 值 (magnitude) 最大的那个。 也是人耳听到声音认定的频率。一个成年人的声音主频率在 100-300Hz 之间。 这个值可以用 线性回归来预测, 机器学习的方法预测也可以。一般会认为,人的声音频率是连续变化的,而且一个短语说完频率是下降趋势。

文本分析就介绍完了,这个方向比较偏语言学, 传统上是语言学家的研究方向,但是随着人工智能的兴起,这些feature 已经不用人为设计了,可以用端到端学习的方法来解决。 比如谷歌的文章 TACOTRON: TOWARDS END-TO-END SPEECH SYNTHESIS 就解救了我们。

这个部分就比较像我们算法工程师的工作内容了。 在未来的博客里, 会详细介绍如何用Wavenet 和WaveRNN 来实现这一步骤的。 今天这个博客就是简介一下算法。

这里说所谓的waveform synthesis 就是用这些 语言特征值(text features)去生成对应的声波,也就是生成前文所说的采样频率 和 振幅大小(对应的数字信号)。 这里面主要有两个算法。

串接合成(concatenative speech synthesis) : 这个方法呢, 就是把记录下来的音节拼在一起来组成一句话,在通过调整语音语调让它听起来自然些。 比较有名的有双音节拼接(Diphone Synthesis) 和单音节拼接(Unit Selection Synthesis)。这个方法比较繁琐, 需要对音节进行对齐(alignment), 调整音节的长短之类的。

参数合成 (Parametric Synthesis) : 这个方法呢, 需要的内存比较小,是通过统计的方法来生成对应的声音。 模型一般有隐马尔科夫模型 (HMM),还有最近提出的神经网络算法Wavenet, WaveRNN.?

对于隐马尔科夫模型的算法, 一般都会生成梅尔频率倒谱系数 (MFCC),这个是声音的特征值。 感兴趣的可以参考这篇博客 去了解 MFCC。

对于神经网络的算法来说, 一般都是生成256 个 quantized values 基于softmax 的分类器, 对应 声音的 256 个量化值。 WaveRNN 和wavenet 就是用这种方法生成的。

下面是我学习语音合成的一些资料, 其中stanford cs224s 是强力推荐的,但是这个讲义讲的逻辑不是很清楚, 要反复看才会懂。

UCSB Digital Speech Processing Course 课程, 声音信号处理的基础。 建议读一遍, 链接如下,?

Stanford CS224S

WaveRNN,?

音频的数字化,

怎么把文字转换成语音

把文字转换成语音的方式有使用文字转语音助手、迅捷视频剪辑软件、Fromtexttospeech。

文字转语音助手,这是一款手机上的智能朗读配音工具,我们打开之后可以复制粘贴、输入或者导入文档来生成音频,并且它还能标记多音字读音以及插入音效、间隔等,里面有比较丰富的高度拟人配音主播可以试听使用。迅捷视频剪辑软件,作为一款剪辑视频的软件,除了基础合并、分割以外它还支持音视频格式转换、视频压缩以及文字转语音等功能。

Fromtexttospeech,是一个在线文字转语音网站,我们打开之后在空白处输入文字接着选择对应的语言、设置主播以及语速点击createaudiofile就可以啦。不过目前它还不支持中文语音,并且它目前仅有5个配音主播可以选择,以上就是3个文字转语音方法。

文字转语音的用途

为了配视频的音频,现在互联网可以说非常普遍,不管是在喧闹的都市,还是宁静的乡下村庄,都可以捕捉到身影。同时人们不管是宅在家中,还是出门在外,使用较多的也是互联网。如果在互联网中看一段视频,没有声音就和哑剧一样,体验肯定是不好的,如果将文字转换成语音,再配上符合其场景的音乐,那真的会增色不少。

为了发布到音频自媒体平台,将一段文字通过自己的方式转换成语音,发布到一些音频自媒体平台,比如喜马拉雅、千聊,荔枝微课、懒人听书等平台。一旦被平台认可的话,是可以获得一定的报酬的,当然了,想要被认可的条件也是比较的高,要吐字清晰,读准字音,不读错字,包括不添字、不漏字、不调换字的顺序等。

android文字转语音如何使用?

虽然视觉上的反馈通常是给用户提供信息最快的方式,但这要求用户把注意力设备上。当用户不能查看设备时,则需要一些其他通信的方法。Android提供了强大的文字转语音Text-to-Speech,TTS API。使开发者能够在应用中添加语音通知和其他语音反馈功能,而不要求用户看着屏幕。

下面的代码展示了如何使用TTS API:

public class TextToSpeechDemo implements TextToSpeech.OnInitListener {

private final TextToSpeech mTextToSpeech;//TTS对象

private final ConcurrentLinkedQueue mBufferedMessages;//消息队列

private Context mContext;

private boolean mIsReady;//标识符

public TextToSpeechDemo(Context context){

this.mContext=context;//获取上下文

this.mBufferedMessages=new ConcurrentLinkedQueue();//实例化队列

this.mTextToSpeech=new TextToSpeech(this.mContext,this);//实例化TTS

}

//初始化TTS引擎

@Override

public void onInit(int status) {

Log.i("TextToSpeechDemo",String.valueOf(status));

if(status==TextToSpeech.SUCCESS){

int result = this.mTextToSpeech.setLanguage(Locale.CHINA);//设置识别语音为中文

synchronized (this){

this.mIsReady=true;//设置标识符为true

for(String bufferedMessage : this.mBufferedMessages){

speakText(bufferedMessage);//读语音

}

this.mBufferedMessages.clear();//读完后清空队列

}

}

}

//释放资源

public void release(){

synchronized (this){

this.mTextToSpeech.shutdown();

this.mIsReady=false;

}

}

//更新消息队列,或者读语音

public void notifyNewMessage(String lanaugh){

String message=lanaugh;

synchronized (this){

if(this.mIsReady){

speakText(message);

}else{

this.mBufferedMessages.add(message);

}

}

}

//读语音处理

private void speakText(String message){

Log.i("liyuanjinglyj",message);

HashMap params=new HashMap();

params.put(TextToSpeech.Engine.KEY_PARAM_STREAM,"STREAM_NOTIFICATION");//设置播放类型(音频流类型)

this.mTextToSpeech.speak(message, TextToSpeech.QUEUE_ADD, params);//将这个发音任务添加当前任务之后

this.mTextToSpeech.playSilence(100,TextToSpeech.QUEUE_ADD,params);//间隔多长时间

}

}

当然一般手机是不支持中文的可以百度下载讯飞TTS引擎后在测试。

由于TTS引擎的初始化是异步的,所以在执行实际的文字转语音之前需要把消息放到队列中。

可以给TTS引擎发送多个参数。前面展示了如何决定口语消息使用的音频流。在这种情况下,通知声音也使用相同的音频流。

最后,如果处理连续多个消息,最好在每个消息结束后暂停一会在播放下一个消息。这样做会清楚的告诉用户消息的结束和开始。

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

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

目前只支持22种语言,不过中文支持并不好,,mmp

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

暂略,会用就好!

真想看 ???

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

不会翻墙???

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

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

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

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

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

Android TTS(TextToSpeech) 使用

TTS 是 Text To Speech 的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。

TTS 技术对文本文件进行实时转换,转换时间之短可以秒计算。

TTS 不仅能帮助有视觉障碍的人阅读计算机上的信息,更能增加文本文档的可读性。现在的 TTS 应用包括语音驱动的邮件以及声音敏感系统,并常与声音识别程序一起使用。

从上面 Android 开发者官网的介绍可以看出 TextToSpeech 必须被实例化之后才能使用。

实现 TextToSpeech.OnInitListener 方法来获取实例化结果的监听。当你已经使用完 TextToSpeech 实例之后, 应该调用 shutdown() 方法来释放 TextToSpeech 所使用的本地资源。

构造方法

主要方法

1、创建 TextToSpeech 类

2、重写 onInit() 方法

调用方法 int result = toSpeech.setLanguage(Locale.CHINA); 设定语言为中文

在 onInit() 方法中判断初始化是否成功,初始化成功使用 toSpeech.setPitch(1.0f) 进行设置音调,值越大,音调越高。

使用 textToSpeech.setSpeechRate(1.5f) 设定语速,默认1.0正常语速。

3、释放资源

当页面需要退出或者不在使用 TTS 的时候,进行资源释放。

(责任编辑:IT教学网)

更多

推荐CGI/Perl教程文章