网络实现语音
这段代码为网友wysaid提供,所以我拿来学习了。
具体的功能是,输入一段文字,通过网络返回语音文件。
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <wininet.h> #pragma comment(lib, "wininet.lib") #pragma comment(lib, "winmm.lib") // 定义10M 的内存缓存。 #define CACHE_SIZE (10*1024*1024) #define BUFFER_SIZE 10000 #ifndef MAX_PATH #define MAX_PATH 260 #endif #define GOOGLE_URL "http://translate.google.cn/translate_tts?ie=UTF-8&q=%s&tl=zh-CN&total=1&idx=0&textlen=3&prev=input" char g_cache[CACHE_SIZE]; bool getGoogleMp3FileByURL(LPCSTR url, LPCSTR filename, LPSTR cache) { HINTERNET hSession = InternetOpen("blog.wysaid.org", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hSession == NULL) return false; HINTERNET hHttp = InternetOpenUrl(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0); if(hHttp == NULL) return false; printf("正在请求 %s, 视网络状况不同可能会有一些等待...\n", filename); unsigned long buffersize = 0; InternetReadFile(hHttp, cache, CACHE_SIZE - 1, &buffersize); g_cache[buffersize] = 0; puts("文件获取成功,正在保存..."); FILE *fp = fopen(filename, "wb"); fwrite(g_cache, buffersize, 1, fp); fclose(fp); printf("文件 %s 保存成功!\n", filename); InternetCloseHandle(hHttp); InternetCloseHandle(hSession); return true; } void char2Hex(LPSTR srcStr, LPSTR dstStr, int n) { while(n--) { unsigned char c = *srcStr++; *dstStr++ = '%'; *dstStr = c / 16 + '0'; if(*dstStr > '9') *dstStr = *dstStr - '0' - 10 + 'A'; ++dstStr; *dstStr = c % 16 + '0'; if(*dstStr > '9') *dstStr = *dstStr - '0' - 10 + 'A'; ++dstStr; } *dstStr = 0; } int GBK2Utf8(char* gbk, char* utf8) { wchar_t uni[BUFFER_SIZE]; MultiByteToWideChar(CP_ACP, 0, gbk, -1, uni, BUFFER_SIZE); return WideCharToMultiByte(CP_UTF8, 0, uni, -1, utf8, BUFFER_SIZE, NULL, NULL); } void play(LPSTR filename) { char buffer[1024]; sprintf(buffer, "open \"%s\" alias googlesnd", filename); mciSendStringA(buffer, NULL, 0, NULL); mciSendStringA("play googlesnd", NULL, 0, NULL); } int main() { char hexStr[BUFFER_SIZE], buffer[BUFFER_SIZE]; char filename[MAX_PATH]; puts("请输入一句话(中文哦),本程序将把你写在下面的话使用谷歌娘读出并保存为mp3文件哦!"); gets(hexStr); memset(filename, 0, MAX_PATH); strncpy(filename, hexStr, 10); strcat(filename, ".mp3"); char2Hex(buffer, hexStr, GBK2Utf8(hexStr, buffer)); sprintf(buffer, GOOGLE_URL, hexStr); if(!getGoogleMp3FileByURL(buffer, filename, g_cache)) puts("网络发生错误,无法读取。请确定你的机器可以联网!"); else { puts("正在播放声音..."); Sleep(100); // 别急,稍等一下。 play(filename); puts("播放成功, 按任意键结束."); fflush(stdin); getchar(); } mciSendStringA("close all", NULL, 0, NULL); return 0; }
注意事项: 谷歌娘的地址可能更新,
所以链接(定义的GOOGLE_URL)如果失效了本程序就无法正确工作。