C++实现自己的文本转语音程序(简单版)

                                   

目录

                                       Text    to    Audio 

1. Preface

2. Requirement

3. Analysis and Implement

4. Sumary and Expectation

5. Appreciation

References


                                        Text  to  Audio

1. Preface

       早在很久之前就应该完成这个任务了,但是在此之前都没找到很好的思路,而且每天还有其他任务要去完成,兜兜转转才拖到了今天。这个想法来自《软件开发技术与应用》的一次课后作业,当时我正在看《C++ Primer 5》这本书,但是总是感觉看语法书好枯燥,当时脑子不停地在想C++到定能干嘛,就当我学不下去的时候,我想起了这次的课后作业,我可以用C++写一个简单的文本转语音的程序!虽然用其他语言可能更容易实现,而且网上的参考资料也会更多些,可能是一直有一种盲目的执着吧!于是疯狂地找有关C++写文本转语音的资料,可是很大部分都是TTS和微软语音开发包,都已经封装好了,虽说都开源,但是写的代码都很难看懂,有些底层的代码根本就没有。我最后甚至都想去看TTS之类的源码,然后模仿写一个,但是在短时间内根本就不太可能,更何况我还没有那么多时间,后来终于天道酬勤吧,得到了大神的相助,我一下茅塞顿开,原来我的想法其实是有点偏了,其实还是挺简单的!

       于是写了这篇文章来纪念一下此次开发历程以及留到以后当作回忆吧!也可以供以后慢慢完善,也希望大家不吝赐教!

2. Requirement

  1.  实现一个简单的“文本转化为语音”程序,不能直接调用TTS等“文本转语音”开发包
  2.  音频资料需要自己录音
  3.  程序可以接受用户输入的一段文本,然后将其转化为自己的录音播放出来

3. Analysis and Implement

      本程序实现的一个文本转语音程序的简单版本,即目前只实现了将一串数字转化为语音播出来。以下是本程序实现的主要步骤(希望能对大家有点启发):

1. 首先将每个数字的发音录成单个MP3文件保存下来

2. 程序先对输入的文本进行预处理,比如不允许文本中出现除数字以外的其他字符,另外,考虑到可读的整数有限,于是 规定长度大于10的当作一串单纯的数字逐个读出即可,具体实现 部分 代码如下:

std::vector<std::string> StringHandler::prase()
{
	switch (flag) {
		case 1:  // 将字符串转化为一个长整数
		{
			long num = std::stol(sourceString);
			if (num == 0) {
				targetVector.push_back(posTable[0]);
			}
			else {
				int pos = 0;
				while (num != 0) {
					targetVector.push_back(std::to_string(num % 10));
					if (num / 10 != 0)
						targetVector.push_back(posTable[++pos]);
					num /= 10;
				}
				/*for (auto it = targetVector.rbegin(); it != targetVector.rend(); ++it)
					std::cout << *it << " ";
				std::cout << std::endl;*/
			}
			break;
		}
		case 2:  //将每个字符转化为数字
		{
			for (int i = sourceString.size() - 1; i >= 0; --i)
				targetVector.push_back(sourceString.substr(i, 1));
			break;
		}
		case 0:
			std::cout << "The length of source string is zero!" << std::endl;
			break;
		default:
			std::cerr << "X error!" << std::endl;
	}

	return targetVector;
}

3. 将转化后的字符串存入vector容器中,并做好vector中的元素到音频文件的映射

std::string posTable[10] = { "0","10","100","1000","10000","100000","1000000","10000000","100000000","1000000000" };

4. 最后将转换好的多个音频文件依次用mciSendString函数打开(播放)

void TextPlayer::play(std::vector<std::string> &vec)
{
	for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
		std::string comm = "play msc/" + *it + ".mp3 wait";
		mciSendString(comm.c_str(), 0, 0, 0);
	}
}

4. Sumary and Expectation

       本程序还是过于简单,思路也比较简单,但是还是尽可能的在编程技巧上作了优化,比如将预处理和语音播放操作都封装成类;另外也算是对自己前段时间看书的效果的一次检测吧!

       接下来的工作是希望能进一步实现文字的转语音的操作,也很乐意大家留下宝贵的意见!个人水平有限,本来不想公开分享的,但是本着共享无罪的原则,希望跟大家一起进步(请各位大佬抬手~v~)!

5. Appreciation

       这里要特别感谢上文提到的大神---my teacher,真是一语惊醒梦中人呀(虽然一直在做梦 2333),希望这份答案还能入你的法眼。


References

1. 在线音乐剪辑网站 

2. 源码(欢迎留言)

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: c 文本语音是一种将文本信息换为语音信息的技术。它使用了语音合成技术,将文本中的文字信息换为计算机生成的音频文件。其中,MP3是一种常见的音频文件格式,具有较好的音质和较小的文件大小。 具体实现c 文本语音生成MP3的过程如下: 首先,需要准备一个文本输入,可以是从文本文件、电子邮件、网页等来源获取的文本信息; 然后,使用语音合成软件或开发工具,将文本信息换为语音信息。这些工具通常会采用自然语言处理、机器学习、深度学习等技术,完成对文本的语义理解和声音模拟; 接着,将生成的音频信息保存为MP3格式的文件。这一过程可以通过指定输出文件格式为MP3,或者再对语音数据进行压缩和编码得到MP3文件; 最后,保存的MP3文件就是生成的语音结果,可以通过播放器或应用程序进行播放和使用。 c 文本语音生成MP3具有广泛的应用场景。例如,在信息化时代,许多平台和设备需要将文本信息化为语音进行传递,帮助用户更方便地获取信息和与计算机进行交互。比如,手机语音助手、智能音箱、语音导航等。此外,在教育领域或娱乐领域中,c 文本语音也可以辅助教学,为有特殊需求的用户提供有声阅读等服务。 总而言之,c 文本语音生成MP3是一项便利而重要的技术,可以广泛应用于各个领域。通过将文本信息换为语音信息,可以满足用户对于语音交互的需求,并提供更加智能便捷的体验。 ### 回答2: C 文本语音生成 MP3 的过程可分为以下步骤: 1. 文本输入:用户将待换的文字输入到程序中,例如使用文本编辑器或自定义的界面。 2. 文本处理:程序对输入的文字进行处理,包括分词、标点符号的处理、语法分析等,以确保生成的语音有良好的流畅性和准确性。 3. 语音合成:程序将处理后的文字换为语音信号。这一步通常依赖于语音合成技术,使用 TTS(Text-to-Speech)算法将文字换为能够模拟人类语音发音的语音信号。 4. 声音效果处理:对生成的语音信号进行声音效果的处理,例如音量、语速、音调和语感等的调整,以使生成的语音更加自然和易于理解。 5. 格式换:将生成的语音信号换为 MP3 格式,以便于在各种设备上播放和传输。这一步需要使用音频编码技术将音频信号编码为 MP3 格式,以减小文件大小并保持声音质量。 6. 保存输出:将生成的 MP3 文件保存到指定的位置,用户可以选择保存文件的路径和文件名。 7. 完成:生成的 MP3 文件将可以在各种设备上播放和分享,能够满足用户对文本语音的需求。 总之,通过以上步骤,可以将用户输入的文本经过语音合成和音频编码处理,最终生成 MP3 格式的语音文件。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值