亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ttsdlg.cpp

?? TTS語音開發示例
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// TTSDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TTS.h"
#include "TTSDlg.h"
#include <io.h>
#include <direct.h>
//using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//Interphonic 序列號
char g_SerialNo[]="P4GM29-QC4LXX-NAN6BF";

extern int bSTTSApiLoaded;

//本結構用來傳遞合成參數到線程中
typedef struct tTHREADPARAM{
	int nCodePage;//內碼
	int nSpeed;//合成語速
	int nAudioFmt;//音頻格式
	TCHAR* szSource;//源文本,可以是字符串或者文本文件
	TCHAR* szDest;//目標音頻文件,可以為空,自動生成
	BOOL bString;//標識szSource是待合成字符串還是文本路徑,如果為真,則傳入的是字符串
}THREADPARAM;

// CTTSDlg dialog


CTTSDlg::CTTSDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTTSDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_timer = 1;
	m_isStart = false;
	m_speed = 0;
}

CTTSDlg::~CTTSDlg()
{
	SaveIndex();
}

void CTTSDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CTTSDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_START, &CTTSDlg::OnPlay)
	ON_WM_TIMER()
END_MESSAGE_MAP()


// CTTSDlg message handlers

BOOL CTTSDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	int res;
	res = InitSapi();
	if(res == -1)
		exit(-1);
	LoadPage(string("D:\\TTS.txt"));

	InitIndex();
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTTSDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//初始化Speech SDK
HRESULT CTTSDlg::InitSapi()
{
	DWORD dwErr;
	char szInfo[255];
	char *strIP = NULL;

	//裝載STTSApi.dll和iFlyTTS.dll
	if(!STTSLoadLibrary()) {
		dwErr=GetLastError();
		AfxMessageBox(_T("不能裝載STTSApi.dll"));
		return -1;
	}
	//初始化聲音合成接口
	if(!(m_isInit=STTSInit())) {
		//得到錯誤代碼
		dwErr = GetLastError();
		if ( dwErr != TTSERR_OK ) {
			if ( TTSGETERRCODE(dwErr) == TTSERR_NOLICENCE ) {
				sprintf(szInfo, "初始化TTS失敗, 錯誤原因: 沒有正確的授權。");
			}
			else {
				sprintf(szInfo, "初始化TTS失敗, 錯誤代號: %d。", dwErr);
			}
			AfxMessageBox( CString(szInfo), MB_OK|MB_ICONSTOP );
		}
		return -1;
	}

	//連接TTS服務器
	if(!(m_hTTSInstance=STTSConnect( g_SerialNo, strIP ))) {
		//用GetLastError()來得到出錯原因
		dwErr=GetLastError();
		if ( dwErr != TTSERR_OK )
		{
			if( TTSGETERRCODE(dwErr) == TTSERR_INVALIDSN ) {
				sprintf(szInfo, "連接TTS服務失敗, 錯誤原因: 錯誤的序列號。");
			}
			else if ( TTSGETERRCODE(dwErr) == TTSERR_NOLICENCE ) {
				sprintf(szInfo, "連接TTS服務失敗, 錯誤原因: 沒有足夠的授權。");
			}
			else {
				sprintf(szInfo, "連接TTS服務失敗, errorcode: 0x00%x", TTSGETERRCODE(dwErr));
			}
			
			AfxMessageBox(CString(szInfo), MB_OK|MB_ICONSTOP);
		}
		return -1;
	}
	//設置文字編碼方式
	STTSSetParam(m_hTTSInstance,TTS_PARAM_CODEPAGE,1);
	STTSSetParam(m_hTTSInstance,TTS_PARAM_AUDIODATAFMT,0);
	return 0;
}

//釋放Speech SDK
void CTTSDlg::ReleaseSapi()
{
	//釋放TTS連接
	STTSDisconnect(m_hTTSInstance);
	//回收工作
	if(bSTTSApiLoaded) {	
		//釋放TTS
		if(m_isInit) {
			STTSDeinit();
			m_isInit=FALSE;
		}
		//卸載TTS DLL
		STTSUnloadLibrary();
		bSTTSApiLoaded=FALSE;
	}
}

HCURSOR CTTSDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}
//處理輸入的文本,進行斷句
void CTTSDlg::LoadPage(const string filename)
{
	ifstream file(filename.c_str());
	char c, d;

	
	c = file.get();
	string sentence;

	if(c == EOF)		//如果為一個空文本
	{			
		sentence = string("當前放入的是空白紙張或無法識別的紙張,請重新放置.");
		m_page.push_back(sentence);
		file.close();
		m_senPos = m_page.begin();
		return;
	}
	else if((c & 0x80) == 0)		//第一個字符為英文字符
	{
		m_page.push_back("朗讀開始。");		//在開頭加入朗讀開始
		if(c != 34)					//去除引號
			sentence.push_back(c);
	}
	else if((c & 0x80) != 0)			//第一個字符為中文字符
	{
		m_page.push_back("朗讀開始。");
		d = file.get();
		if(c != -95 || (c == -95 && (d != -80 && d != -79)))	//去除引號
		{
			sentence.push_back(c);
			sentence.push_back(d);
		}
	}
	//讀取文本循環
	while((c = file.get()) != EOF)
	{
		if(m_page.size() == 1 && c == 10)			//回車按照一個句號處理,作為斷句標識
		{
			string temp = "";
			for(unsigned i = 0; i < sentence.length(); i++)
			{
				if(sentence.at(i) != ' ')
					temp.push_back(sentence.at(i));
			}
			if(temp.length() == 0)
			{
				sentence.clear();
				continue;
			}
			else
			{
				m_page.push_back(sentence);
				sentence.clear();
			}
			continue;
		}
		//2007.5.15修改
		else if(c == 10)
			continue;
		else if((c & 0x80) == 0)		//處理英文字符
		{
			if(c == 34)				//引號排除
				continue;
			else if((c == 33 || c == 63) && sentence.length() == 0)	//多個問號或者嘆號只處理第一個
				continue;
			sentence.push_back(c);
			if((c == 33 || c == 63) && sentence.length() > 6)		//問號或者嘆號時
			{
				m_page.push_back(sentence);
				sentence.clear();
			}
		}
		else if((c & 0x80) > 0)		//處理中文字符
		{
			d = file.get();
			if(c == -95 && (d == -80 || d == -79))		//處理引號
				continue;
			else if(c == -93 && (d == -95 || d == -65) && sentence.length() == 0)	//處理多個問號或者感嘆號
				continue;
			else if(c == -95 && d == -93 && sentence.length() == 0)
				continue;
			else if(c == -93 && (d == -88 || d == -87))		//處理括號
				continue;

			sentence.push_back(c);
			sentence.push_back(d);
			if(c == -95 && d == -93)		//句號斷句
			{
				string temp = "";
				for(unsigned i = 0; i < sentence.length(); i++)
				{
					if(sentence.at(i) != ' ')
						temp.push_back(sentence.at(i));
				}
				if(temp.length() > 6)
				{
					m_page.push_back(temp);
					sentence.clear();
				}
				//sentence = temp;
				//temp.clear();
				continue;
			}
			else if(c == -93 && d == -95)	//感嘆號斷句
			{
				string temp = "";
				for(unsigned i = 0; i < sentence.length(); i++)
				{
					if(sentence.at(i) != ' ')
						temp.push_back(sentence.at(i));
				}
				if(temp.length() > 6)
				{
					m_page.push_back(temp);
					sentence.clear();
				}
				continue;
			}
			else if(c == -93 && d == -65)	//問號斷句
			{
				string temp = "";
				for(unsigned i = 0; i < sentence.length(); i++)
				{
					if(sentence.at(i) != ' ')
						temp.push_back(sentence.at(i));
				}
				if(temp.length() > 6)
				{
					m_page.push_back(temp);
					sentence.clear();
				}
				continue;
			}

		}
	}

	if(!sentence.empty())
		m_page.push_back(sentence);
	m_page.push_back("朗讀結束, 按暫停/蟲讀鍵重新聽一遍,按返回鍵繼續操作。");
	file.close();
	m_senPos = m_page.begin();

}
//播放音頻
void CTTSDlg::OnPlay()
{
	//關閉定時器
	KillTimer(m_timer);

	if(m_senPos == m_page.end())
	{
		m_isStart = false;
		return;
	}

	m_isStop = false;
	m_isPause = false;

	STTSSetParam(m_hTTSInstance,TTS_PARAM_SPEED,m_speed);
	
	m_timer=SetTimer(1,300,NULL);
	//STTSGetParam(m_hTTSInstance,TTS_PARAM_AUDIODATAFMT,&nAudioFmt);
	STTSPlayString(m_hTTSInstance, (char*)m_senPos->c_str(), 1);
	//STTSDisconnect(hTTSInstance);
}

//恢復或者暫停語音
void CTTSDlg::OnPause()
{
	if(!m_isPause)	//當前正在播放,暫停播放
	{
		KillTimer(m_timer);
		STTSPlayStop();
		m_isPause = true;
	}
	else			//當前已經暫停,恢復播放
	{
		m_isPause = false;
		OnPlay();
	}
}

//停止當前讀音
void CTTSDlg::OnStop()
{
	KillTimer(m_timer);
	m_isStop = true;
	STTSPlayStop();
	m_senPos = m_page.begin();
	m_speed = 0;
	m_isStart = false;
}

//增加語速
void CTTSDlg::OnIncreaseRate()
{
	KillTimer(m_timer);
	if(m_speed <= 500)
		m_speed += 100;
	m_timer=SetTimer(1,500,NULL);
}

//降低語速
void CTTSDlg::OnDecreaseRate()
{
	KillTimer(m_timer);
	if(m_speed >= -500)
		m_speed -= 100;
	m_timer=SetTimer(1,500,NULL);
}

//獲取鍵盤輸入
BOOL CTTSDlg::PreTranslateMessage(MSG* pMsg)
{
	if(pMsg->message == WM_KEYDOWN)
	{
		switch(pMsg->wParam)
		{
		case VK_DIVIDE:		//返回建/
			if(!m_isStop)
				OnStop();
			break;
		case 99:			//快退3
			if(m_senPos == m_page.end())
			{
				KillTimer(m_timer);
				STTSPlayStop();
				m_senPos--;
				m_senPos--;
				m_isStart = true;
				OnPlay();
			}
			else if(m_senPos != m_page.begin())
			{
				KillTimer(m_timer);
				STTSPlayStop();
				m_senPos--;
				OnPlay();
			}
			break;
		case VK_DECIMAL:		//快進。
			if(m_senPos != m_page.end())
			{
				KillTimer(m_timer);
				STTSPlayStop();
				m_senPos++;
				OnPlay();
			}
			break;
		case 102:				//減速6
			OnDecreaseRate();
			break;
		case 105:				//加速9
			OnIncreaseRate();
			break;
		case VK_ADD:			//暫停鍵
			if(!m_isStart)
			{
				if(!m_isLoad)		//不讀取存儲文本
				{
					m_senPos = m_page.begin();
					m_isStart = true;
					m_isStop = false;
					OnPlay();
				}
				else				//讀取存儲文本
				{
					LoadSavedPage();
					m_isStart = true;
					m_isStop = false;
					OnPlay();
				}
			}
			else
				OnPause();
			break;
		case 100:			// 4 前一本書
			if(m_isCover)
				m_isCover = false;
			if(m_isStart)
			{
				m_isStart = false;
				m_isStop = true;
			}
			STTSPlayStop();
			PreBook();
			break;
		case 101:			//	5 后一本書
			if(m_isCover)
				m_isCover = false;
			if(m_isStart)
			{
				m_isStart = false;
				m_isStop = true;
			}
			STTSPlayStop();
			NextBook();
			break;
		case 97:			// 1 前一頁
			if(m_isCover)
				m_isCover = false;
			if(m_isStart)
			{
				m_isStart = false;
				m_isStop = true;
			}
			STTSPlayStop();
			PrePage();
			break;
		case 98:			// 2 后一頁
			if(m_isCover)
				m_isCover = false;
			if(m_isStart)
			{
				m_isStart = false;
				m_isStop = true;
			}
			STTSPlayStop();
			NextPage();
			break;
		case 96:			// 0 錄入
			if(m_isDelete)
				m_isDelete = false;
			if(m_isStart)
			{
				m_isStart = false;
				m_isStop = true;
			}
			STTSPlayStop();
			CheckSavePage();
			break;
		case VK_BACK:		//刪除 BackSpace
			if(m_isSave)
			{
				m_isSave = false;
				m_isCover = false;
			}
			if(m_isStart)
			{
				m_isStart = false;
				m_isStop = true;
			}
			STTSPlayStop();
			CheckDelete();
			break;
		case VK_SUBTRACT:		//幫助文件 '-'
			STTSPlayStop();
			if(m_isDelete)
				m_isDelete = false;
			if(m_isSave)
				m_isSave = false;
			if(m_isLoad)
				m_isLoad = false;
			m_isStop = true;
			m_isStart = false;
			STTSPlayTextFile(m_hTTSInstance, "D:/TTS-Help.txt", 1);
		default:
			break;
		};
	}

	return CDialog::PreTranslateMessage(pMsg);
}

void CTTSDlg::OnCancel()
{
	
	CDialog::OnCancel();
}

void CTTSDlg::OnOK()
{
	//CDialog::OnOK();
}

void CTTSDlg::OnTimer(UINT_PTR nIDEvent)
{
	int status;
	STTSQueryPlayStatus(&status);
	if(status == 0 && m_senPos != m_page.end() && !m_isStop)	//讀完一句話,且沒有暫停或停止,讀下一句
	{
		m_senPos++;
		OnPlay();
	}
	CDialog::OnTimer(nIDEvent);
}


void CTTSDlg::InitIndex()
{
	//初始化
	m_bookIndex.resize(1000);
	memset(m_readTag, 0, 1000);
	memset(m_saveTag, 0, 1000);
	m_isLoad = false;
	m_isSave = false;
	m_isCover = false;
	m_isDelete = false;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级日韩一级| 香港成人在线视频| 国产一区二区三区四区在线观看 | 国产亚洲精品bt天堂精选| 国产精品福利在线播放| 国产激情偷乱视频一区二区三区| 欧美不卡一区二区三区| 久久精品国内一区二区三区| 欧美一区二区日韩| 国产乱码精品一品二品| 精品久久久久久综合日本欧美| 麻豆精品久久久| 日韩精品影音先锋| 老司机精品视频在线| 日韩欧美国产小视频| 精品无人码麻豆乱码1区2区 | 欧美国产亚洲另类动漫| 国产精品99久久久久久宅男| 国产日韩一级二级三级| www.亚洲在线| 亚洲乱码精品一二三四区日韩在线 | 国产精品女主播av| 成人激情电影免费在线观看| 国产精品高清亚洲| 欧美专区亚洲专区| 日精品一区二区三区| 久久老女人爱爱| 极品少妇一区二区三区精品视频| 欧美伊人久久大香线蕉综合69| 欧美日韩午夜精品| 亚洲免费av观看| 欧美日韩亚洲不卡| 五月天一区二区三区| 精品粉嫩超白一线天av| 高清免费成人av| 亚洲h在线观看| 欧美mv日韩mv国产| 国产精品亚洲第一区在线暖暖韩国| 国产精品污网站| 欧美伊人久久大香线蕉综合69| 国产精品夜夜嗨| 亚洲永久精品国产| www精品美女久久久tv| 久久这里只有精品首页| 成人av资源下载| 国产精品三级视频| 欧美三级日韩三级国产三级| 国模一区二区三区白浆| 亚洲激情网站免费观看| 久久久噜噜噜久久中文字幕色伊伊 | 国产精品18久久久久久久久久久久 | 成人av电影在线播放| 日本不卡在线视频| 中文字幕精品在线不卡| 91丨九色丨尤物| 亚洲伊人色欲综合网| 国产无人区一区二区三区| 欧美伊人精品成人久久综合97 | 欧美日韩亚洲国产综合| 国产精品综合一区二区| 午夜欧美在线一二页| 国产精品嫩草99a| 日韩免费观看2025年上映的电影| 91女厕偷拍女厕偷拍高清| 日韩精品欧美成人高清一区二区| 一区二区成人在线视频| 国产欧美一区二区三区鸳鸯浴| 欧美剧情片在线观看| 欧美亚洲综合色| 成人午夜电影久久影院| 韩国一区二区在线观看| 日韩国产高清影视| 亚洲线精品一区二区三区八戒| 国产亚洲短视频| 精品国产人成亚洲区| 91精品国产综合久久精品app| 色老综合老女人久久久| 国产不卡视频在线播放| 国内一区二区在线| 日韩有码一区二区三区| 一区二区三区丝袜| 亚洲婷婷综合久久一本伊一区| 久久九九久精品国产免费直播| 日韩欧美一级在线播放| 欧美二区在线观看| 欧美色图第一页| 日本福利一区二区| 色综合激情久久| 91视频免费播放| 成人午夜在线播放| 久久精品二区亚洲w码| 奇米色一区二区三区四区| 天堂久久一区二区三区| 一区二区三区精品视频在线| 亚洲美女视频一区| 欧美国产日韩在线观看| 国产精品成人在线观看| 精品99一区二区| 精品免费国产二区三区 | 色综合久久天天| 一本久道久久综合中文字幕| 欧美性三三影院| 在线观看视频一区| 成人理论电影网| 91丨九色丨蝌蚪丨老版| 欧美午夜片在线观看| 欧美精品视频www在线观看 | 欧美性高清videossexo| 欧洲亚洲国产日韩| 欧美日韩免费高清一区色橹橹| 欧美特级限制片免费在线观看| 欧美高清性hdvideosex| 欧美电影免费观看高清完整版在线观看| 日韩欧美在线网站| 久久久综合网站| 中文字幕在线不卡视频| 亚洲一区二区视频| 日韩电影免费在线观看网站| 国产精品自在欧美一区| 99精品久久只有精品| 欧美日韩亚洲丝袜制服| 久久久无码精品亚洲日韩按摩| 亚洲欧美日本韩国| 日韩影院免费视频| 国产999精品久久久久久绿帽| 成人激情开心网| 日本福利一区二区| 日韩欧美一区二区视频| 26uuuu精品一区二区| 欧美不卡一二三| 国产视频一区二区三区在线观看| 中文字幕在线不卡一区| 亚洲地区一二三色| 青青草原综合久久大伊人精品| 久久99精品久久久久久动态图| 国产精品一区二区黑丝| 欧美在线不卡视频| 2017欧美狠狠色| 亚洲中国最大av网站| 国产精一区二区三区| 欧美日韩一区二区三区在线看 | 亚洲国产欧美日韩另类综合| 激情六月婷婷久久| 欧美性生活久久| 国产精品久线观看视频| 日韩精品视频网| 国产乱子伦视频一区二区三区 | 亚洲超丰满肉感bbw| 国产精品一区二区免费不卡| 欧美日韩成人综合| 国产精品久久久久久久久快鸭 | 91久久精品一区二区二区| 91麻豆精品国产自产在线| 欧美激情一区二区三区不卡 | 波多野结衣一区二区三区| 91精品国产免费| 亚洲色图在线播放| 欧美日韩国产综合一区二区三区 | 一区二区三区蜜桃| 成人一区二区三区中文字幕| 精品美女一区二区| 日韩高清不卡一区二区三区| 一本色道久久综合亚洲91| 国产精品网曝门| 看片网站欧美日韩| 欧美精品久久天天躁| 一区二区三区免费在线观看| 成人一区二区三区中文字幕| 久久精品水蜜桃av综合天堂| 久久精品噜噜噜成人av农村| 3d动漫精品啪啪一区二区竹菊| 自拍偷拍亚洲激情| 91色九色蝌蚪| 国产精品久久久久久久久免费丝袜| 国产激情91久久精品导航| 欧美tickling挠脚心丨vk| 美腿丝袜一区二区三区| 欧美一区二区国产| 午夜精品福利一区二区三区av| 色成人在线视频| 中文字幕一区二区三区不卡在线 | 亚洲一级二级在线| 色综合天天综合网国产成人综合天| 最近中文字幕一区二区三区| av高清不卡在线| 1000部国产精品成人观看| 波多野洁衣一区| 久久久久久久免费视频了| 高清国产一区二区| 国产精品毛片无遮挡高清| 成人黄色小视频| 国产精品久久三区| 国产成人一区二区精品非洲| 国产精品色婷婷久久58| 91小视频免费看| 一区二区在线观看视频在线观看| 色噜噜狠狠成人网p站| 亚洲一区二区三区小说| 欧美日韩一区在线观看| 日本特黄久久久高潮|