网络实现语音

这段代码为网友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)如果失效了本程序就无法正确工作。

posted @ 2013-05-27 19:47  galuo  阅读(252)  评论(0编辑  收藏  举报