文字转语音并生成音频文件

咚臨 2019-04-24 12:04:31
/* 注明: 使用 MultiByteToWideChar 接口转换得 WCHAR,
QString inform = "各位大佬,不吝啬,点个赞!";
WCHAR wChar[1024];
memset(wChar ,0,1024);
MultiByteToWideChar( CP_ACP , 0 , inform.toLocal8Bit(), inform.toLocal8Bit().size(), wChar , 1024);

强制转换得 LPCWSTR:
QString dateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss") + ".wav";
LPCWSTR filename = (LPCWSTR)dateTime.data();
或者 LPCWSTR filename = dateTime .toStdWString().c_str();
*/
int MainWindow::TextToVideo(const int volume, const WCHAR* wChar, const LPCWSTR &filename)
{
// 初始化语音接口
ISpVoice *pVoice = nullptr;
if (FAILED(::CoInitialize(nullptr)))
return -1;
HRESULT hr = CoCreateInstance(CLSID_SpVoice, nullptr, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if (SUCCEEDED(hr))
{
// 获取当前的音量与音速
long rate;
pVoice->GetRate(&rate);
USHORT volume;
pVoice->GetVolume(&volume);
qDebug()<<"volume:"<<volume<<"rate:"<<rate;
pVoice->SetVolume(volume); //设置音量

// 获取当前的频率配置
CComPtr<ISpStreamFormat> cpStream;
HRESULT hrOutputStream =pVoice->GetOutputStream(&cpStream);
if (hrOutputStream ==S_OK)
{
CSpStreamFormat Fmt;
hr = Fmt.AssignFormat(cpStream);
if (SUCCEEDED(hr))
{
SPSTREAMFORMAT eFmt = Fmt.ComputeFormatEnum(); // 默认: SPSF_16kHz16BitMono 18
qDebug()<<"format:"<<eFmt;
}
}

// 设置当前朗读频率
CComPtr<ISpAudio> m_cpOutAudio; //声音输出接口
SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOOUT,&m_cpOutAudio ); //创建接口
SPSTREAMFORMAT eFmt = SPSF_8kHz16BitMono;
CSpStreamFormat Fmt;
Fmt.AssignFormat(eFmt);
if (m_cpOutAudio)
hr = m_cpOutAudio->SetFormat(Fmt.FormatId(), Fmt.WaveFormatExPtr() );
else
return -1;

pVoice->SetOutput( m_cpOutAudio, FALSE );

// 设置输出到.wav文件里
CComPtr <ISpStream> cpWavStream;
CComPtr <ISpStreamFormat> cpOldStream;
pVoice->GetOutputStream(&cpOldStream);
CSpStreamFormat originalFmt;
originalFmt.AssignFormat(cpOldStream);
hr = SPBindToFile(filename, SPFM_CREATE_ALWAYS, &cpWavStream, &originalFmt.FormatId(), originalFmt.WaveFormatExPtr());
pVoice->SetOutput(cpWavStream, TRUE);

pVoice->Speak(wChar, SPF_DEFAULT, nullptr);
pVoice->WaitUntilDone(1000);
pVoice->Release();
pVoice = nullptr;
}
::CoUninitialize();
return 0;
}
...全文
638 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2019-04-27
  • 打赏
  • 举报
回复
greex 2019-04-26
  • 打赏
  • 举报
回复
这个应只有做过这块的人知道吧,太专业了。

问题无法回答,但提个建议:C++代码实现任何功能一个要封装归类,要面对对像写代码才好。
FoolCarpe 2019-04-26
  • 打赏
  • 举报
回复
可以试试某飞的tts
636f6c696e 2019-04-24
  • 打赏
  • 举报
回复
用的是什么库实现的?

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧